非对称加密
在传统的加密算法中,通信的双方会采用一个共享秘钥来对数据进行加密和解密。消息发送方先采用秘钥对明文进行加密然后再进行传送,待接收方收到消息后,再采用秘钥对密文进行界面,以得到明文。由于加密和解密采用的秘钥是相同的,这种加密算法也称为对称加密。采用对称加密的通信过程如下图所示:
图片来源twilio
与传统的对称加密不同,非对称加密算法采用了两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是成对使用的,如果用公钥对数据进行加密,只有用对应的私钥才能解密;同样,使用私钥对数据进行加密,只有用对应的公钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法,也称为公开密钥加密。采用非对称加密的通信过程如下图所示:
图片来源twilio
使用对称加密算法需要双方事先交换加/解密用的共享秘钥,而交换的过程就存在密码泄露的风险。非对称加密的保密性比较好,因为它消除了通信双方交换秘钥(加密用的私钥)的需要。公钥是不需要进行保密的,可以对外进行公布,但加密后的信息只有私钥的拥有者才能进行解密。
但是非对称加密的效率比对称加密低,因此在通信过程中一般会结合非对称加密和对称加密来实现数据加密传输。先通过非对称加密协商一个用于对称加密的共享秘钥,后续在传递数据时采用该对称加密秘钥匙来对数据加密,以在保证安全性的同时兼顾加密传输的效率。SSL/TLS就采用了类似的加密传输机制。
下面我们用openssl命令来试验创建一个秘钥对,并使用该秘钥对来进行加解密。 首先创建一个私钥。
代码语言:javascript复制openssl genpkey -algorithm RSA -outform PEM -out private_key.pem
然后创建对应的公钥。
代码语言:javascript复制openssl rsa -in private_key.pem -outform PEM -pubout -out public_key.pem
writing RSA key
使用公钥加密文件,从命令输出可以看到明文“Hello world”已经被加密为密文。
代码语言:javascript复制#Create a test file...
echo 'Hello world' > plain_text
#Encrypt plain_text with public key...
openssl rsautl -encrypt -inkey public_key.pem -pubin -in plain_text -out encrypted_text
cat encrypted_text
?▒▒nC▒▒▒▒K▒߿$▒E▒{'▒k▒▒▒
▒▒▒▒>▒▒▒~▒▒▒▒p▒&Y▒▒▒▒'▒▒Z▒Z▒O$▒b▒ϒ▒Z▒mh▒*"▒^,▒▒6▒ê2▒▒▒?H▒&▒▒▒g▒5▒▒g▒a
▒yNs▒r▒75cyq▒P?p▒M[iZ@▒▒b▒*o▒▒?(▒▒M▒▒x▒^▒▒ٱ