在网络上传输文件时, 如果使用对称加密, 那么密钥的就必须以明文传输, 这就失去了加密的意义.
而用 RSA 等非对称加密算法加密大文件会比较慢.
更好的方法是, 生成一个对称密钥(key), 用这个 key 去加密文件, 然后用对方的私钥去加密key. 对方收到文件之后, 用自己的私钥解密 key, 然后再用 key 解密文件.
准备工作:
收发双方都要生成一对公私钥:
1
ssh-keygen -t rsa -C "foo@example.com"
生成适合发布的 pkcs8 格式的公钥:
1
ssh-keygen -e -f ~/.ssh/id_rsa.pub -m PKCS8 > ~/.ssh/id_rsa.pub.pkcs8
发送方 (加密):
首先获取对方的 pkcs8 格式的公钥(明文传输). 保存到文件 someone.pub.pkcs8
.1
2
3
4
5
6
7
8 生成256字节的随机密钥, 并保存到文件 key
openssl rand 256 -out key
用 aes 对称加密方法加密文件 file_name, 加密后的文件为 file_name.enc
openssl aes-256-cbc -in file_name -out file_name.enc -pass file:key
用对方公钥加密 key 文件
openssl rsautl -encrypt -pubin -inkey ~/.ssh/someone.pub.pkcs8 -in key -out key.enc
将加密后的 key 和 文件一起打包之后发送给对方
tar -zcvf secret.tgz *.enc
接收方(解密):1
2
3
4
5
6 解压压缩包
tar -xzvf secret.tgz
用私钥解密 key.enc, 获取 key
openssl rsautl -decrypt -ssl -inkey ~/.ssh/id_rsa -in key.enc -out key
用 key 解密文件
openssl aes-256-cbc -d -in file_name.enc -out file_name -pass file:key
mac os 和 linux 都可以用以上命令.
参考资料
Encrypt/Decrypt a File using your SSH Public/Private Key on Mac OS X