Press "Enter" to skip to content

在使用不信任的通信手段时进行安全的信息交换

其实就是手动SSL,还没有CA帮你验证(虽然可以加上这步)
于命令行,Linux环境,安装了OpenSSL。

生成密钥

在当前目录生成用于加密的公钥和解密的私钥,分别保存为pub.pem和key.pem。

可以按需选择2048或更长的RSA密钥
$ openssl genrsa 1024 > key.pem
$ openssl rsa -pubout -in key.pem > pub.pem

生成一个用于对称加密的密钥(求md5sum只是为了让密钥是16进制数,方便输入,但这个hash也是随机的来着)
$ head -c128 /dev/urandom | md5sum

交换密钥

加密用于对称加密的密钥“Secret”,之后以base64形式输出,这个可以发给对方进行密钥交换了
$ echo Secret | openssl rsautl -encrypt -pubin -inkey pub.pem | base64
解密加密过的“Secret”
$ echo "Encrypted Secret" | base64 -d | openssl rsautl -decrypt -inkey private.pem

对称加密,开始交流

按需选择算法,这里是aes-128-cbc,会要求输入密钥
$ echo Text | openssl enc -aes-128-cbc -pbkdf2 | base64
可以改为 openssl enc -aes-128-cbc -pbkdf2 -pass pass:Secret或者file:文件,这样就不用输入密钥了

解密
$ echo "Encrypted Text" | base64 -d | openssl aes-128-cbc -pbkdf2 -d

“用GPG不就好了吗”

生成密钥
$ gpg --gen-key
上传密钥
$ gpg --send-keys USERID
查看密钥特征
$ gpg --fingerprint USERID
下载(对方)
$ gpg --search-keys FINGERPRINT
加密(对方)
$ echo Text | gpg --encrypt --recipient USERID | base64
解密(自己)
$ echo "Encrypted Text" | base64 -d | gpg --decrypt