密码学:对称加密

2021-04-17  本文已影响0人  HotPotCat

一、算法介绍

对称加密:明文通过密钥加密得到密文,密文通过密钥解密得到明文。

1.1常见算法

1.2应用模式

二、终端命令

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

再次加密查看:

image.png
发现只有改动部分(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

Demo

四、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));
enum {
    kCCEncrypt = 0,
    kCCDecrypt,
};
typedef uint32_t CCOperation;
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;
enum {
    /* options for block ciphers */
    kCCOptionPKCS7Padding   = 0x0001,
    kCCOptionECBMode        = 0x0002
    /* stream ciphers currently have no options */
};
typedef uint32_t CCOptions;

4.2CCCrypt安全隐患

直接在CCCrypt函数上打符号断点:

image.png

直接读取x6x7的值就直接拿到了明文数据HotpotCat和对应的长度:

image.png

4.3问题处理

4.3.1不使用CCCrypt函数

自己写一个函数加密

4.3.2使用CCCrypt函数

如果还要使用CCCrypt函数呢?
1.在调用CCCrypt之前对数据做一层加密/转换。比如:可以对明文数据进行按位异或再加密,解密先解密再按位异或还原。
2.对OC方法名称进行混淆。(脚本混淆)。

总结

上一篇下一篇

猜你喜欢

热点阅读