前文曾提及对称加密的原理,但它的最大问题在于加密和解密的密钥相同,且难以保证密钥的安全传递。即便是安全送至双方手中,也无法完全排除内部“间谍”的存在。
既然我们已经了解了对称加密,那么自然会想到非对称加密。非对称加密的核心在于其加密和解密过程使用不同的密钥。那么,如何实现这一独特的功能呢?设想我拥有一个存钱罐,只有特定的钥匙才能打开。通常,大家只能将零钱放入罐中,但只有我才能取出罐内的钱。这些放入罐中的便如同经过加密的内容,唯有使用对应的钥匙才能取出这些“加密”后的。这样,我们便可将用于加密的密钥(公钥)公开给任何人,只要我们自己妥善保管解密的密钥(私钥),便能有效地保护我们的数据安全。
非对称算法种类繁多,如RSA、Elgamal、背包算法、Rabin、D-H以及ECC等。接下来,我们来简要介绍一下RSA算法。
RSA公钥加密算法是由罗纳德·李维斯特、阿迪·萨莫尔和伦纳德·阿德曼于1977年共同提出的。该算法在1987年首次公开,当时三人都就职于麻省理工学院。RSA即取自三人姓氏首字母的组合(希望有一天也能以我的名字来命名一个算法)。RSA是目前影响力最广泛的公钥加密算法之一,它能够抵御至今已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密的标准方法。
公钥和私钥并非随意组合的数字,而是通过严格的数学公式计算得出的结果。
在现实应用中,为了保证数据安全,P和Q通常会选择非常大的数字(如1024比特或更大)来执行整个计算过程。
我们已经讨论了加密和解密的基本原理,现在让我们用具体的数字来进行实践操作,以加深理解。假设我们得到了公钥(E=23,N=77)和私钥(D=47,N=77)。
假设我们需要加密数字:12。加密公式为:密文 = (明文 ^ E)% N;计算得:12 ^ 23 % 77 = 45。这个45就是我们加密后的密文。
以下是我在PHP中实现的加密与解密示例,供大家参考。由于指数运算的结果集可能很大,我们需要使用PHP中提供的BC Math系列函数进行计算。
没有任何一种加密方式能够永远保持绝对安全。就拿常用的MD5来说,如果数据库中的密码仍然使用MD5的哈希结果,那也不必嘲笑那些明文存密码的人。五十步笑百步的做法并不可取。最近谷歌宣布已能SHA-1,随着计算能力的提升,SHA-256、RSA等也难逃被的命运。