概念:
采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
优缺点:
优点:算法公开、计算量小、加密速度快、加密效率高。
缺点:如果秘钥泄露,发送方和接收方都不安全。另外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的唯一秘钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。
常用算法:
在对称加密算法中常用的算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK、AES等。
加密方式:
- ECB:最基本的加密模式,也就是通常理解的加密,相同的明文将永远加密成相同的密文,无初始向量,容易受到密码本重放攻击,一般情况下很少用。
- CBC:明文被加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始向量,相同的密文加密后会形成不同的密文,这是目前应用最广泛的模式。CBC加密后的密文是上下文相关的,但明文的错误不会传递到后续分组,但如果一个分组丢失,后面的分组将全部作废(同步错误)。
- CFB:类似于自同步序列密码,分组加密后,按8位分组将密文和明文进行移位异或后得到输出同时反馈回移位寄存器,优点最小可以按字节进行加解密,也可以是n位的,CFB也是上下文相关的,CFB模式下,明文的一个错误会影响后面的密文(错误扩散)。
- OFB:将分组密码作为同步序列密码运行,和CFB相似,不过OFB用的是前一个n位密文输出分组反馈回移位寄存器,OFB没有错误扩散问题。
感谢百度百科,现在就上面的ECB和CBC和大家分享下吧,欢迎指正。
ECB方式:
优缺点:
优点:
- 操作简单,易于实现;
- 有利于并行计算;
- 能很好地防止误差传播;
缺点:
- 所有分组的加密方式一致,明文中的重复内容会在密文中有所体现,因此难以抵抗统计分析攻击。
因此,ECB模式一般只适用于小数据量的字符信息的安全性保护,例如密钥保护。
下面来操作下:
//创建一个abc.txt文件
$ vim abc.txt
i
编辑文本,输入内容:
esc
+ :wq
退出编辑保存文件。
$ more abc.txt
来查看一下刚才创建的文件:
使用DES的ECB模式加密abc.txt文件:
// openssl 安全套接字层密码库
// enc : encryption (加密)
// -des-ecb:加密方式
// -K 后面的是秘钥,经过ASCII编码的,实际内容为(abc)
// -nosalt:不加盐;如果不设定,系统随机给个盐
$ openssl enc -des-ecb -K 616263 -nosalt -in abc.txt -out msg1.bin
此时生成了一个加密后的文件msg1.bin。
$ xxd msg1.bin
查看该加密文件的十六进制:
现在我们来修改一下刚才创建的abc.txt文件:
$ vim abc.txt
重新编辑文本,把左下角的2改为5。加密生成 msg2.bin 文件。
通过
xxd
指令 查看 msg1.bin 和 msg2.bin 文件。通过对比不难发现,只有我们修改过的数据产生了加密变化。这也就是ECB分块加密的效果,一块数据的改变,不会影响其他数据块的加密结果。
CBC方式:
优缺点:
优点:
- 不容易主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准。
缺点:
- 加密过程是串行的,无法被并行化;
- 误差传递;
- 需要初始化向量IV;
下面来操作下:
使用DES的CBC模式加密上面创建的abc.txt文件:
// openssl 安全套接字层密码库
// enc : encryption (加密)
// -des-ecb:加密方式
// iv:初始向量
// -K 后面的是秘钥,经过ASCII编码的,实际内容为(abc)
// -nosalt:不加盐;如果不设定,系统随机给个盐
$ openssl enc -des-cbc -iv 0102030405060708 -K 616263 -nosalt -in abc.txt -out msg3.bin
此时生成了一个加密后的文件msg3.bin。
$ xxd msg3.bin 查看该加密文件的十六进制:
现在我们来修改一下abc.txt文件:
$ vim abc.txt
重新编辑文本,把左下角的5改为8。通过xxd指令 查看 msg3.bin 和 msg4.bin 文件。
通过对比我们发现,前面的数据修改之后,导致该数据以后的数据加密都产生了变化。作为密码块链,使用一个密钥和一个初始化"向量"对数据执行加密抓换。能保证密文的完整性,如果一个数据发生改变,后面所有的数据将会被破坏。
在iOS开发过程中,可以使用该类EncryptionTools
进行对称加密,有需要的可以去Github上download下来。
AES - ECB 加密:
NSString * key = @"Joeyoung";
//加密
NSLog(@"加密: %@",[[EncryptionTools sharedEncryptionTools] encryptString:@"哈哈哈哈哈哈"
keyString:key
iv:nil]);
//解密
NSLog(@"解密: %@",[[EncryptionTools sharedEncryptionTools] decryptString:@"q76c9sgdodLabAOtmKXkpz2tuvmxLQT0dvPeRiLuFKE="
keyString:key
iv:nil]);
查看控制台的输出结果,一切ok:AES - CBC 加密 (需要初始向量):
NSString * key = @"Joeyoung";
uint8_t iv[8] = {2,3,4,5,6,7,0,0}; //直接影响加密结果!
NSData * ivData = [NSData dataWithBytes:iv length:sizeof(iv)];
NSLog(@"CBC加密: %@",[[EncryptionTools sharedEncryptionTools] encryptString:@"this is Symmetric encryption."
keyString:key
iv:ivData]);
NSLog(@"CBC解密: %@", [[EncryptionTools sharedEncryptionTools] decryptString:@"1DjbvOGRbMY+HFkBqr79FtEaYaBccl97pO7HOKgM2u4="
keyString:key
iv:ivData]);
查看控制台的输出结果,一切ok:该类中还有 DES - CBC 、DES - ECB 模式,在此就不再一一演示了,该类默认使用的是AES,如果使用DES,请修改algorithm属性:
[EncryptionTools sharedEncryptionTools].algorithm = kCCAlgorithmDES;
EncryptionTools
工具类其实是对系统<CommonCrypto/CommonCrypto.h>
进行了封装,内部的核心函数就是CCCrypt
:
/***
CCCrypt 对称加密算法的核心函数(加密/解密)
参数:
1.kCCEncrypt 加密/kCCDecrypt 解密
2.加密算法,默认使用的是 AES/DES
3.加密选项 ECB/CBC
kCCOptionPKCS7Padding CBC 的加密方式
kCCOptionPKCS7Padding | kCCOptionECBMode ECB 的加密方式
4.加密密钥
5.密钥长度
6.iv 初始化向量,ECB 不需要指定
7.加密的数据
8.加密的数据的长度
9.密文的内存地址
10.密文缓冲区的大小
11.加密结果大小
*/
CCCrypt(<#CCOperation op#>,
<#CCAlgorithm alg#>,
<#CCOptions options#>,
<#const void *key#>,
<#size_t keyLength#>,
<#const void *iv#>,
<#const void *dataIn#>,
<#size_t dataInLength#>,
<#void *dataOut#>,
<#size_t dataOutAvailable#>,
<#size_t *dataOutMoved#>);
千里之行,始于足下~