RSA 公私钥加解密

RSA加密简介

RSA加密是一种非对称加密。可以在不直接传递密钥的情况下,完成解密。这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。是由一对密钥来进行加解密的过程,分别称为公钥和私钥。两者之间有数学相关,该加密算法的原理就是对一极大整数做因数分解的困难性来保证安全性。通常个人保存私钥,公钥是公开的(可能同时多人持有)。

公私钥都可以加解密,场景有什么区别?

非对称密钥密码的主要应用就是公钥加密和公钥认证。

  • 加密解密:那就是用公钥加密私钥解密(仅你可读但别人不可读,任何人都可写)
  • 证书验证:那就是用私钥加密公钥解密(仅你可写但别人不可写,任何人都可读)

首先,加密 和 认证 是两个截然不同的概念

加密和签名都是为了安全性考虑,但略有不同。加密是为了防止信息被泄露,而签名是为了防止信息被篡改。

  1. 加密:是将数据资料加密,使得非法用户即使取得加密过的资料,也无法获取正确的资料内容,所以数据加密可以保护数据,防止监听攻击。其重点在于数据的安全性
  2. 身份认证:是用来判断某个身份的真实性,确认身份后,系统才可以依不同的身份给予不同的权限。其重点在于用户的真实性。两者的侧重点是不同的。

公钥私钥的原则:

  1. 一个公钥对应一个私钥。
  2. 密钥对中,让大家都知道的是公钥,不告诉大家,只有自己知道的,是私钥。
  3. 如果用其中一个密钥加密数据,则只有对应的那个密钥才可以解密。
  4. 如果用其中一个密钥可以进行解密数据,则该数据必然是对应的那个密钥进行的加密。

为什么RSA公钥每次加密得到的结果都不一样?

私钥对同一数据进行签名加密的结果是一样的,但使用公钥对同一数据加密,每次的结果都不一样。

是的,这个问题跟对数据的padding即填充有关,详细说来,是跟PKCS #1 v1.5指定的padding方式有关。

加密同一个数据过程中,加入了随机数处理(即加盐-salt),这样就导致每次需要加密的明文都是不同的,那么显然密文就每次都不同了。  那么解密后怎么会是同一个呢? 答案很简单,那就是 客户端和服务器端同样解随机数。 具体如下方案:

  1. 密文 =( random+明文) ^e mod n     //publicKey 加密
  2. (random+明文) = 密文^d mod n     //服务器端利用privateKey 解密
  3. 明文 = (random+明文) – random    //服务器端解码出random
  4.  明文和数据库中数据比较

参考文章: