强大的openssl命令
openssl,一个linux命令,囊括了主要的密码算法、常用的密钥和证书封装管理功能,提供丰富应用程序测试等。只要涉及到加密、hash、证书等相关的需求,都可以使用openssl进行解决。
本文涉及到的相关只是,只是服务于本文 加密较大文件方案,只涉及到openssl的应用的很小一部分:
- openssl enc 执行对称加密算法。具体支持的算法通过
openssl enc -h
命令查看。其中in & out
参数分别代表输入和输出。当然也接受标准输出管道作为参数。e & d
参数分别代表加密、解密。 - openssl genpkey 生成私钥,
algorithm
指定具体的算法 - openssl rsautl执行非对称加密
加密文件
生成大文件
mkfile -n 1g test.txt
### -rw------- 1 eight staff 1.0G May 19 01:19 test.txt
使用命令生成一个1g的大文件,用来观察加密效果、以及测试加密大文件的性能。
echo "\n观察加密效果,这是机密数据" >> test.txt
加密算法的选择
对称加密算法AES(Advanced Encryption Standard)支持128、192、256字节的密钥。AES使用简单的代数运算,使用相同的方式加密每block的数据。这种特质更适合加密大文件。但正是它的简单,造成在抗暴力破解方面,不如RSA。
非对称加密,使用一对key来加解密电子信息。RSA (Rivest–Shamir–Adleman)是我们经常使用的非对称加密,经常用于ssl、ssh等领域。它机密每block都使用不同的方式,比其他机密更安全。但是也造成在加密较大文件的时候,性能方面不理想。
结合AES和RSA
生成一个keyfile,作为AES加密的密钥文件。
openssl rand 256 > pwd.key
AES加密test.txt,完成不到5s。
>> time openssl enc -in test.txt -out test.txt.enc -e -aes256 -k pwd.key
openssl enc -in test.txt -out test.txt.enc -e -aes256 -k pwd.key 1.37s user 1.74s system 79% cpu 3.918 total
AES解密test.txt.enc, 完成不到3s
>> time openssl enc -in test.txt.enc -out test.txt.decrypt -d -aes256 -k pwd.key
openssl enc -in test.txt.enc -out test.txt.decrypt -d -aes256 -k pwd.key 0.51s user 1.99s system 72% cpu 3.434 total
举例:
openssl enc -aes-256-cbc [-pass pass:密码] -in 源文件 -out 加密后的文件
openssl enc -d -aes-256-cbc -in 加密后的文件 -out 解密文件
RSA相关操作
- 生成私钥
openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
- 对应公钥
openssl rsa -pubout -in private_key.pem -out public_key.pem
加密密钥文件
openssl rsautl -encrypt -inkey public_key.pem -pubin -in pwd.key -out pwd.key.enc
解密密钥文件
openssl rsautl -decrypt -inkey private_key.pem -in pwd.key.enc -out pwd.key
总结
AES适合机密大文件、RSA加密方法安全。总体思路:使用RSA加密密钥文件,然后使用AES结合密钥文件加密大文件。
这样相结合大文件,首先需要RSA加密时候对应的密钥对的另一个,解开密钥文件,然后使用密钥文件再解开AES。其实仔细分析ssl协议会发现,使用了类似的方案。
总体方案:
- 生成公私钥
- 生成密钥文件
- RSA加密密钥文件
- AES加密大文件