alwaystest / Blog

24 stars 2 forks source link

RSA非对称加密 #33

Open alwaystest opened 7 years ago

alwaystest commented 7 years ago

RSA非对称加密

标签(空格分隔): 非对称加密


跟着阮一峰的博客走了一遍思路,终于搞明白了RSA加密算法的运作。

之前一直搞不清楚密钥和私钥加密解密,误以为只有公钥加密,私钥才可以解密,私钥加密,公钥无法解密

理解RSA私钥公钥能否互相解密最关键的地方在RSA算法原理(二)中的最后

(1)加密要用公钥 (n,e) 假设鲍勃要向爱丽丝发送加密信息m,他就要用爱丽丝的公钥 (n,e) 对m进行加密。这里需要注意,m必须是整数(字符串可以取ascii值或unicode值),且m必须小于n。 所谓"加密",就是算出下式的c:   m^e ≡ c (mod n) 爱丽丝的公钥是 (3233, 17),鲍勃的m假设是65,那么可以算出下面的等式:   65^17 ≡ 2790 (mod 3233) 于是,c等于2790,鲍勃就把2790发给了爱丽丝。 (2)解密要用私钥(n,d) 爱丽丝拿到鲍勃发来的2790以后,就用自己的私钥(3233, 2753) 进行解密。可以证明,下面的等式一定成立:   c^d ≡ m (mod n) 也就是说,c的d次方除以n的余数为m。现在,c等于2790,私钥是(3233, 2753),那么,爱丽丝算出   27902753 ≡ 65 (mod 3233) 因此,爱丽丝知道了鲍勃加密前的原文就是65。 至此,"加密--解密"的整个过程全部完成。

如果把c当作持有密钥方要发送的内容,那么使用密钥加密后的密文是m。持有公钥的用户拿到密文m以后,把m代入公式计算,得到的就是原文c了。

所以结论是用密钥也是可以加密的,加密内容可以使用公钥解密得到原文。

RSA生成的钥匙是一对的,所以理论上讲可以把任意一枚钥匙发布出去作为公钥,但是

但是为啥(N,e)用作公钥呢?因为我们懒啊,e一般都用这个65537,还有个毛秘密可言啊,这还加个毛密啊!!!那就把你(N,e)发布出去,当做公钥咯。。。 引用自: https://www.zhihu.com/question/25912483/answer/101734962

使用私钥来做签名的原因是如果私钥直接加密原文,由于公钥是公开的,所有人都可以解密,那么就不叫加密了,还有一点,如果使用私钥直接加密原文,信息如果被截取到,即使第三方不知道私钥是多少,也可以直接使用截取到的包假冒发布者。所以不使用私钥加密原文,一般使用私钥加密原文的hash值,使用公钥解密得到hash值以后,同接收到的信息的hash做对比,如果相同,就证明信息没有被篡改。同时由于只有对应的公钥可以解开这个私钥加密的信息,这样就保证了数据发布者是私钥的持有者。

事实证明,要理解RSA加密,最好还是跟着思路,自己算一遍,就算算不出来,跟着成功者的思路走一趟,也是收获满满的。

YSONgge commented 7 years ago

mark