公钥密码的秘钥分为加密秘钥和解密秘钥,加密秘钥成为公钥,解密秘钥成为私钥,公钥和私钥的成对存在的,一对公钥和私钥称为密钥对。发送消息时,发送者用公钥对消息进行加密,接收者用私钥进行解密。从这里可以知道,发送者只需要用公钥对消息进行加密,而接收者用私钥解密即可,这样就解决了对称密码的秘钥传送问题。公钥可以通过任何方式公开,但是接收者的私钥是绝对不能被别人知道的。
由于加密的密码和解密的密码不同,与公钥密码相对的,公钥密码也被称为非对称密码。下面介绍公钥密码相关的几种加密算法。
RSA这种公钥密码算法是由三位开发者完成,分别是Ron Rivest,Adi Shamir和Leonard Adleman。而RSA名字就是分别取自三人的姓的首字母。
对于RSA在数学上的具体实现,这里不做探究
EIGamal算法是由Taher EIGamal设计的,EIGamal相对于RSA有一个缺点,经过加密的密文长度会变为明文的两倍。
openssl通过genrsa,rsa和rsautl选项用于公钥密码,genrsa用于生成公钥和私钥,rsa用于处理rsa秘钥,例如由私钥生成公钥,rsautl是rsa的一些工具,例如加密解密。下面介绍生成私钥和公钥的方法以及利用公钥私钥加密和解密数据步骤:
openssl genrsa -out private.pem 2048
生成2048长度的私钥。
openssl rsa -in private.pem -pubout -out public.pem
infile内容:
ni hao,rsa
加密操作:
openssl rsautl -encrypt -pubin -inkey public.pem -in infile -out outfile
outfile内容:
00000000 29 44 23 c6 10 14 65 58 75 0d f7 ef f1 6e 77 9b |)D#...eXu....nw.|
......
000000f0 10 a7 82 16 fd 44 dc d5 1b 3c ca a1 16 79 22 54 |.....D...<...y"T|
解密操作:
openssl rsautl -decrypt -inkey private.pem -in outfile -out decryptfile
decryptfile内容:
ni hao,rsa
公钥密码对于对称密码是解决了秘钥的传送问题,公钥无法解密公钥加密的数据,只有私钥可以,所以任何人都可以获得公钥。不过公钥密码还存在一个问题,发送者不能确定公钥和接收者的私钥是密钥对,公钥可能被篡改,导致使用了中间攻击人的公钥,导致安全问题。
除RSA算法外,公钥密码的算法还有,Rabin和椭圆曲线密码(ECC)。