公钥密码算法是现代密码体系最通用的加密算法,称为非对称加密方式,公钥和私钥总是成对出现的,用公钥加密则私钥可以用来解密,或者反过来。标准的RSA的加密算法利用的是大数质因数分解困难的特点,其数学原理十分简单。
- 找两个很大的素数
P
和
Q - 令 N=P×Q
- M=(P−1)×(Q−1)
- 找到一个和M互质的数E,再找一个整数D使得 E×D≡1(modM)
- 好了,现在可以开始加密。其中E作为公钥用来加密,D作为私钥用来解密。由
XEmodN=Y
得到密文Y,通过
YDmodN=X
来解密得到消息X。这个需要用费尔马小定理来证明,费尔马小定理:若P为素数,对于整数N有
NP−1≡1(modP)
。证明过程如下:
{(XQ−1)P−1≡1(modP)(XP−1)Q−1≡1(modQ)⇒X(P−1)×(Q−1)≡1(modPQ)⇒XM≡1(modN)⇒XE×D≡X(modN)⇒YD≡X(modN) 其中密文Y、公钥E和大数N都是公开的,但是没有私钥D就无法得到X,破解需要对N进行质因数分解反推出P和Q,因为大数质因数分解需要穷举,因此密码在很长的时限内都是安全的。
从原理可以看出,加密和解密是完全对称的,如果用私钥加密,而用公钥解密的过程称为电子签名,因为别人没有私钥,就无法伪造签名者的消息和身份信息了。一般网银和网上交易等金融相关的密码体系采用加密和电子签名相结合的方式,对用户密码用银行等服务端的公钥加密后再和用户名等信息一起用用户的私钥进行电子签名,服务端再分别用用户的公钥和银行的私钥解密,用数字证书的方式传递公钥。而一般的网站登录多采用MD5值来存储和比对密码,虽然理论上从MD5值无法得到密码的明文,但仍然存在撞库的风险,黑客收集普通人常用的一些密码组合转换为MD5值来反推,因此尽量不要使用电话号码、名字缩写、生日组合之类的简单密码,网银密码用单独的密码不要和其他网站的密码一样。
RSA是目前最常用的公钥加密算法,但并没有从理论上证明破译RSA的难度与大数分解难度等价,有数学家认为RSA密码存在漏洞,而且在计算能力越来越强的计算机面前,仍然需要寻找更安全的加密方式。
ECC(Elliptic Curves Cryptography椭圆曲线密码)也是一种公钥密码算法,ECC能用更短的密钥长度来提供同等或更高的安全级别,其数学原理比较复杂,简单的说是利用椭圆曲线上点群的离散对数问题的困难性(并不懂这句话的意思),有机会再慢慢学习吧。