Practice of Symmetric-Key Alg
Practice of Symmetric-Key Alg
上篇罗列了常用的算法,这篇趁热打铁实践下对称算法怎么在openssl里怎么用。
Generation of Secret Key
使用对称加解密算法首先是要生成密钥。一般都会用随机数生成器来产生一串随机数作为密钥,当然也可以通过KDF从已经存在的密钥衍生出新的密钥。
在嵌入式系统中,密钥可以离线生成,也可以利用SoC自身的TRNG硬件模块在线生成。对于离线生成的密钥一定要从流程上防止暴露的可能性,重点关注密钥注入SoC的流程。密钥在SoC中一般保存在只有高安子系统才能访问或者解密的存储介质上,比如OTP或者Secure Storage。
在本例中,直接从/dev/uramdom产生密钥。另外有些工作模式需要IV,也用urandom生成。
1
2
dd if=/dev/urandom of=sk bs=16 count=1
dd if=/dev/urandom of=iv bs=16 count=1
Encryption
本文中分别用AES和SM4配合几种工作模式在openssl中加密数据。
为了直观的显示某些加密特性,本例中选用了图片作为操作的原始数据。图片的几个要求为:
- 格式为BMP
- BMP中每个pix所占长度应为分组长度的公约数,本例中为8 bits (图片稍有失真)
- 加解密应忽略header
用AES 128 ECB加密:
1
openssl enc -aes-128-ecb -e -in example.data.bmp -out example.aes_128_ecb.data.bmp -K $(xxd -ps sk)
用SM4 ECB加密(密钥相同):
1
openssl enc -sm4-ecb -e -in example.data.bmp -out example.sm4_ecb.data.bmp -K $(xxd -ps sk)
从显示图片可以看出,经过用ecb模式处理后,数据虽然被加密,但是大致轮廓还清晰可见,hacker可能通过明文和密文的对比,猜出大致的内容。所以ecb模式虽然快,但是相对容易被破解。对security要求比较高的应该采用其他工作模式。
其他模式的机密命令如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// aes 128 ctr
openssl enc -aes-128-ctr -e -in example.data.bmp -out example.aes_128_ctr.data.bmp -K $(xxd -ps sk) -iv $(xxd -ps iv)
// aes 128 cbc
openssl enc -aes-128-cbc -e -in example.data.bmp -out example.aes_128_cbc.data.bmp -K $(xxd -ps sk) -iv $(xxd -ps iv)
// aes 128 ofb
openssl enc -aes-128-ofb -e -in example.data.bmp -out example.aes_128_ofb.data.bmp -K $(xxd -ps sk) -iv $(xxd -ps iv)
// aes 128 cfb
openssl enc -aes-128-cfb -e -in example.data.bmp -out example.aes_128_cfb.data.bmp -K $(xxd -ps sk) -iv $(xxd -ps iv)
// sm4 ctr
openssl enc -sm4-ctr -e -in example.data.bmp -out example.sm4_ctr.data.bmp -K $(xxd -ps sk) -iv $(xxd -ps iv)
// sm4 cbc
openssl enc -sm4-cbc -e -in example.data.bmp -out example.sm4_cbc.data.bmp -K $(xxd -ps sk) -iv $(xxd -ps iv)
// sm4 ofb
openssl enc -sm4-ofb -e -in example.data.bmp -out example.sm4_ofb.data.bmp -K $(xxd -ps sk) -iv $(xxd -ps iv)
// sm4 cfb
openssl enc -sm4-cfb -e -in example.data.bmp -out example.sm4_cfb.data.bmp -K $(xxd -ps sk) -iv $(xxd -ps iv)
Decryption
解密比较简单,基本上格式都差不多,命令如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// aes 128 ecb
openssl enc -aes-128-ecb -d -in example.aes_128_ecb.data.bmp -out example.aes_128_ecb.pdata.bmp -K $(xxd -ps sk)
// aes 128 ctr
openssl enc -aes-128-ctr -d -in example.aes_128_ctr.data.bmp -out example.aes_128_ctr.pdata.bmp -K $(xxd -ps sk) -iv $(xxd -ps iv)
// aes 128 cbc
openssl enc -aes-128-cbc -d -in example.aes_128_cbc.data.bmp -out example.aes_128_cbc.pdata.bmp -K $(xxd -ps sk) -iv $(xxd -ps iv)
// aes 128 ofb
openssl enc -aes-128-ofb -d -in example.aes_128_ofb.data.bmp -out example.aes_128_ofb.pdata.bmp -K $(xxd -ps sk) -iv $(xxd -ps iv)
// aes 128 cfb
openssl enc -aes-128-cfb -d -in example.aes_128_cfb.data.bmp -out example.aes_128_cfb.pdata.bmp -K $(xxd -ps sk) -iv $(xxd -ps iv)
// sm4 ecb
openssl enc -sm4-ecb -d -in example.sm4_ecb.data.bmp -out example.sm4_ecb.pdata.bmp -K $(xxd -ps sk)
// sm4 ctr
openssl enc -sm4-ctr -d -in example.sm4_ctr.data.bmp -out example.sm4_ctr.pdata.bmp -K $(xxd -ps sk) -iv $(xxd -ps iv)
// sm4 cbc
openssl enc -sm4-cbc -d -in example.sm4_cbc.data.bmp -out example.sm4_cbc.pdata.bmp -K $(xxd -ps sk) -iv $(xxd -ps iv)
// sm4 ofb
openssl enc -sm4-ofb -d -in example.sm4_ofb.data.bmp -out example.sm4_ofb.pdata.bmp -K $(xxd -ps sk) -iv $(xxd -ps iv)
// sm4 cfb
openssl enc -sm4-cfb -d -in example.sm4_cfb.data.bmp -out example.sm4_cfb.pdata.bmp -K $(xxd -ps sk) -iv $(xxd -ps iv)
最后补一张表,对照Brief of Cryptography Algorithm里的图来理解。
Work Mode | Encryption Parallelizable | Decryption Parallelizable | Random Read Access |
---|---|---|---|
ECB | Yes | Yes | Yes |
CTR | Yes | Yes | Yes |
CBC | No | Yes | Yes |
PCBC | No | No | No |
OFB | No | No | No |
CFB | No | Yes | Yes |
GSM | Yes | Yes | Yes |
This post is licensed under CC BY 4.0 by the author.