密码学:对称加密
2021-04-17 本文已影响0人
HotPotCat
一、算法介绍
对称加密:明文通过密钥加密得到密文,密文通过密钥解密得到明文。
1.1常见算法
-
DES
:数据加密标准(用得少,因为强度不够)。 -
3DES
:使用3
个密钥,对相同的数据执行3次加密,强度增强。是通过数量级来增加强度,有3
个密钥难保管,没有大量使用。 -
AES
:高级密码标准。苹果的钥匙串访问就是使用AES
。
1.2应用模式
-
ECB
(Electronic Code Book
):电子密码本模式。每一块数据,独立加密。-
最基本的加密模式,也就是通常理解的加密,相同的明文将永远加密成相同的密文,无初始向量,容易受到密码本重放攻击,一般情况下很少用。
独立加密,独立解密。一块丢失不影响其他块。但是如果有一块被破解其他也一样被破解了。
image.png
-
-
CBC
(Cipher Block Chaining
):密码分组链接模式。使用一个密钥和一个初始化向量[IV]对数据执行加密。- 明文被加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始向量,相同的密文加密后会形成不同的密文,这是目前应用最广泛的模式。
-
CBC
加密后的密文是上下文相关的,明文的错误不会传递到后续分组,但如果一个分组丢失,后面的分组将全部作废(同步错误)。 -
CBC
可以有效的保证密文的完整性,如果一个数据块在传递是丢失或改变,后面的数据将无法正常解密。
加密和解密依赖,后面的数据依赖前面的数据。一块被破解其他块不一定被破解。
image.png
二、终端命令
2.1 ECB验证
有一个文本文件内容如下:
0000000000
1111111111
2222222222
0000000000
1111111111
2222222222
0000000000
1111111111
2222222222
加密命令:
//openssl默认会加盐
openssl enc -des-ecb -K 616263 -nosalt -in message.txt -out message.bin
加密结果:
➜ 对称加密 cat message.bin
�vz��HWm|+��B��ӭN�5��`T�IC_Iʻ���?�|{\���9�_���le��xG_�w��"�(��_�7���6�TNj��{F�xU�s�
�r%
➜ 对称加密 xxd message.bin
00000000: d1f8 0876 7a80 0184 4857 6d7c 2bb7 9742 ...vz...HWm|+..B
00000010: d1f7 951b f7d3 ad4e c835 cec6 991c 08a2 .......N.5......
00000020: 6054 9914 1649 435f 49ca bbb3 aab0 3fc0 `T...IC_I.....?.
00000030: 7c7b 5c9c 8795 39cc 5fbb c6fa 6c65 a990 |{\...9._...le..
00000040: 7847 5fd9 0677 fdeb 22c8 28b9 905f 1701 xG_..w..".(.._..
00000050: d037 d2e2 c336 b854 4e15 6aab 9b7b 4681 .7...6.TN.j..{F.
00000060: 7855 a173 820b 9e72 xU.s...r
修改下原始文件内容:
0000000000
1111111111
8822222222
0000000000
1111111111
2222222222
0000000000
1111111111
2222222222
再次加密查看:
发现只有改动部分(
16字节
)不同,其他数据完全相同。
那么ECB
分块的最小数据是多少呢?
只改一个数字试试看:
0000000000
1111111111
8222222222
0000000000
1111111111
2222222222
0000000000
1111111111
2222222222
image.png
只修改一个二进制位看下:
1000000000
1111111111
2222222222
0000000000
1111111111
2222222222
0000000000
1111111111
2222222222
image.png
可以看到是以
8字节
为单位进行加密的。只影响修改的数据,前后都不影响。
2.2CBC验证
加密命令:
openssl enc -des-cbc -K 616263 -iv 0102030405060708 -nosalt -in message.txt -out message.bin
同样修改文本对比:
0000000000
1111111111
8822222222
0000000000
1111111111
2222222222
0000000000
1111111111
2222222222
image.png
可以看到后面的数据都变了。
2.3其它命令
2.3.1DES
DES(ECB)
加密
echo -n HotpotCat | openssl enc -des-ecb -K 616263 -nosalt | base64
9Ple3xnjfQogNxIjWHxWwg==
解密
echo -n 9Ple3xnjfQogNxIjWHxWwg== | base64 -D | openssl enc -des-ecb -K 616263 -nosalt -d
HotpotCat%
DES(CBC)
加密
echo -n HotpotCat | openssl enc -des-cbc -iv 0102030405060708 -K 616263 -nosalt | base64
I6AD5342iBkvkzwFHDafFg==
解密
echo -n I6AD5342iBkvkzwFHDafFg== | base64 -D | openssl enc -des-cbc -iv 0102030405060708 -K 616263 -nosalt -d
HotpotCat%
2.3.1AES
AES(ECB)
加密
echo -n HotpotCat | openssl enc -aes-128-ecb -K 616263 -nosalt | base64
pqQyRfTkZVNQgO4wd2WFXQ==
解密
echo -n pqQyRfTkZVNQgO4wd2WFXQ== | base64 -D | openssl enc -aes-128-ecb -K 616263 -nosalt -d
HotpotCat%
AES(CBC)
加密
echo -n HotpotCat | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt | base64
LEtbC/NKpyNRfz7ko1mhIA==
解密
echo -n LEtbC/NKpyNRfz7ko1mhIA== | base64 -D | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt -d
HotpotCat%
⚠️
1.加密过程是先加密,再base64
编码。
2.解密过程是先base64
解码,再解密。
3.加密和解密都是enc
,通过-d
区分是加密还是解密。
2.4key转换
可以通过xxd
获取key
对应的二进制数据
比如Hotpot
(486f74706f74):
➜ 对称加密 xxd message.txt
00000000: 486f 7470 6f74 Hotpot
三、代码
iOS通过CommonCrypto
库支持。
/*
algorithm 控制AES DES
iv控制 ECB CBC
*/
//key
NSString *key = @"abc";
//iv
uint8_t iv[8] = {1,2,3,4,5,6,7,8};
NSData *ivData = [NSData dataWithBytes:iv length:sizeof(iv)];
//message
NSString *message = @"HotpotCat";
//AES + ECB 加密
NSString *encAES_ECBResult = [[HPCryptoTools sharedEncryptionTools] encryptString:message keyString:key iv:nil];
NSLog(@"AES_ECB enc:%@",encAES_ECBResult);
//AES + ECB 解密
NSString *decAES_ECBResult = [[HPCryptoTools sharedEncryptionTools] decryptString:encAES_ECBResult keyString:key iv:nil];
NSLog(@"AES_ECB dec:%@",decAES_ECBResult);
//AES + CBC 加密
NSString *encAES_CBCResult = [[HPCryptoTools sharedEncryptionTools] encryptString:message keyString:key iv:ivData];
NSLog(@"AES_CBC enc:%@",encAES_CBCResult);
//AES + CBC 解密
NSString *decAES_CBCResult = [[HPCryptoTools sharedEncryptionTools] decryptString:encAES_CBCResult keyString:key iv:ivData];
NSLog(@"AES_CBC dec:%@",decAES_CBCResult);
//修改加密为DES
[HPCryptoTools sharedEncryptionTools].algorithm = kCCAlgorithmDES;
//DES + ECB 加密
NSString *encDES_ECBResult = [[HPCryptoTools sharedEncryptionTools] encryptString:message keyString:key iv:nil];
NSLog(@"DES_ECB enc:%@",encDES_ECBResult);
//AES + ECB 解密
NSString *decDES_ECBResult = [[HPCryptoTools sharedEncryptionTools] decryptString:encDES_ECBResult keyString:key iv:nil];
NSLog(@"DES_ECB dec:%@",decDES_ECBResult);
//AES + CBC 加密
NSString *encDES_CBCResult = [[HPCryptoTools sharedEncryptionTools] encryptString:message keyString:key iv:ivData];
NSLog(@"DES_CBC enc:%@",encDES_CBCResult);
//AES + CBC 解密
NSString *decDES_CBCResult = [[HPCryptoTools sharedEncryptionTools] decryptString:encDES_CBCResult keyString:key iv:ivData];
NSLog(@"DES_CBC dec:%@",decDES_CBCResult);
输出:
AES_ECB enc:pqQyRfTkZVNQgO4wd2WFXQ==
AES_ECB dec:HotpotCat
AES_CBC enc:LEtbC/NKpyNRfz7ko1mhIA==
AES_CBC dec:HotpotCat
DES_ECB enc:9Ple3xnjfQogNxIjWHxWwg==
DES_ECB dec:HotpotCat
DES_CBC enc:I6AD5342iBkvkzwFHDafFg==
DES_CBC dec:HotpotCat
四、CCCrypt函数
4.1CCCrypt介绍
CCCrypt
对称加密算法的核心函数(加密/解密),共有11
个参数:
CCCryptorStatus CCCrypt(
CCOperation op, /* kCCEncrypt, etc. */
CCAlgorithm alg, /* kCCAlgorithmAES128, etc. */
CCOptions options, /* kCCOptionPKCS7Padding, etc. */
const void *key,
size_t keyLength,
const void *iv, /* optional initialization vector */
const void *dataIn, /* optional per op and alg */
size_t dataInLength,
void *dataOut, /* data RETURNED here */
size_t dataOutAvailable,
size_t *dataOutMoved)
API_AVAILABLE(macos(10.4), ios(2.0));
-
CCOperation
:kCCEncrypt
加密,kCCDecrypt
解密
enum {
kCCEncrypt = 0,
kCCDecrypt,
};
typedef uint32_t CCOperation;
-
CCAlgorithm
:加密算法、默认为AES
enum {
kCCAlgorithmAES128 = 0, /* Deprecated, name phased out due to ambiguity with key size */
kCCAlgorithmAES = 0,
kCCAlgorithmDES,
kCCAlgorithm3DES,
kCCAlgorithmCAST,
kCCAlgorithmRC4,
kCCAlgorithmRC2,
kCCAlgorithmBlowfish
};
typedef uint32_t CCAlgorithm;
-
CCOptions
:加密模式
ECB
:kCCOptionPKCS7Padding | kCCOptionECBMode
CBC
:kCCOptionPKCS7Padding
enum {
/* options for block ciphers */
kCCOptionPKCS7Padding = 0x0001,
kCCOptionECBMode = 0x0002
/* stream ciphers currently have no options */
};
typedef uint32_t CCOptions;
-
key
:密钥 -
keyLength
:密钥长度 -
iv
:iv
初始化向量,ECB
不需要。iv
定长所以不需要长度(8
字节)。 -
dataIn
:加密/解密的数据 -
dataInLength
:加密/解密的数据长度 -
dataOut
:缓冲区(地址),存放密文/明文 -
dataOutAvailable
:缓冲区大小 -
dataOutMoved
:加密/解密结果大小
4.2CCCrypt安全隐患
直接在CCCrypt
函数上打符号断点:
直接读取x6
和x7
的值就直接拿到了明文数据HotpotCat
和对应的长度:
4.3问题处理
4.3.1不使用CCCrypt函数
自己写一个函数加密
4.3.2使用CCCrypt函数
如果还要使用CCCrypt
函数呢?
1.在调用CCCrypt
之前对数据做一层加密/转换。比如:可以对明文数据进行按位异或再加密,解密先解密再按位异或还原。
2.对OC
方法名称进行混淆。(脚本混淆)。
总结
- 对称加密:
AES
-
ECB
:电子密码本模式。每一块数据独立加密。 -
CBC
:链式加密,每一块数据的加密都依赖上一块数据。有效的保证了数据的完整性- 多一个参数:
iv
- 多一个参数:
-
CCCrypt
函数:直接使用会有安全隐患。
按位异或&代码混淆
-