在网络上传输文件时, 如果使用对称加密, 那么密钥的就必须以明文传输, 这就失去了加密的意义.
而用 RSA 等非对称加密算法加密大文件会比较慢.
更好的方法是, 生成一个对称密钥(key), 用这个 key 去加密文件, 然后用对方的私钥去加密key. 对方收到文件之后, 用自己的私钥解密 key, 然后再用 key 解密文件.

准备工作:

  1. 收发双方都要生成一对公私钥:

    1
    ssh-keygen -t rsa -C "foo@example.com"
  2. 生成适合发布的 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