zoukankan      html  css  js  c++  java
  • RSA加密算法

    对称加密与非对称加密

    对称加密:加密和解密都是用同一个密钥的算法,称作对称加密。

    非对称加密:加密和解密需要不同的密钥。

    什么是RSA

    RSA是一种非对称加密算法,它的名字由三位开发者,即Ron Rivest、Adi Shamir和Leonard Adleman的姓氏的首字母组成的。

    RSA被用于公钥密码和数字签名。

    1983年,RSA公司为RSA算法在美国取得了专利,但现在该专利已经过期。

    RSA加密与解密介绍

    在RSA中,明文、密钥和密文都是数字。
    RSA加密
    RSA的加密过程可以用下面的公式来表达:

    RSA的密文是对代表了明文的数字的E次方求mod N的结果。就是将明文和自己做E次乘方,然后将其结果除以N求余数,这个余数就是密文。
    E和N两个数字对RSA的加密结果起着决定性作用。
    E和N两个数才组成一个公钥,因此我们一般会写出“公钥是(E,N)”或者“公钥是{E,N}”这样的形式

    RSA解密

    RSA的解密过程可以用下面的公式来表达:

    该公式表示对密文的数字的D次方求mod N就可以得到明文。就是将密文自己做D次乘法,再对其结果除以N求余数,就可以得到明文。
    D和N两个数字也对解密结果起着决定性机会,这里的N和RSA加密的N是同一个数字。
    D和N两个数组成了一个私钥,因此我们一般会写出“私钥是(D,N)”或者“私钥是{D,N}”这样的形式

    所以到这里我们似乎只要知道怎么产生公钥(E,N)和私钥(D,N)。

    RSA加密与解密详细

    数学知识准备

    RSA加密与解密算法中,只用到素数、互质数、指数运算、模运算等几个简单的数学知识。所以,我们也需要了解这几个概念即可。

    素数

    素数又称质数,指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。

    互质数

    百度百科上的解释是:公因数只有1的两个数,叫做互质数。;维基百科上的解释是:互质,又称互素。若N个整数的最大公因子是1,则称这N个整数互质。

    常见的互质数判断方法主要有以下几种:

    • 两个不同的质数一定是互质数。例如,2与7、13与19。
    • 一个质数,另一个不为它的倍数,这两个数为互质数。例如,3与10、5与 26。
    • 相邻的两个自然数是互质数。如 15与 16。
    • 相邻的两个奇数是互质数。如 49与 51。
    • 较大数是质数的两个数是互质数。如97与88。
    • 小数是质数,大数不是小数的倍数的两个数是互质数。例如 7和 16。
    • 2和任何奇数是互质数。例如2和87。
    • 1不是质数也不是合数,它和任何一个自然数在一起都是互质数。如1和9908。
    • 辗转相除法。

    指数运算

    指数运算又称乘方计算,计算结果称为幂。nm指将n自乘m次。把nm看作乘方的结果,叫做”n的m次幂”或”n的m次方”。其中,n称为“底数”,m称为“指数”。

    模运算

    模运算即求余运算。“模”是“Mod”的音译。和模运算紧密相关的一个概念是“同余”。数学上,当两个整数除以同一个整数,若得相同余数,则二整数同余

    两个整数a,b,若它们除以正整数m所得的余数相等,则称a,b对于模m同余,记作: a ≡ b (mod m);读作:a同余于bm,或者,ab关于模m同余。例如:26 ≡ 14 (mod 12)。

    加密和解密

    使用Alice和他的小伙伴来举例子。

    假设Alice想通过一个不可靠的媒体接受Bob的一条私人消息,他可以用下面的方式产生一个公钥和私钥。

    • 1. 随意选择两个大的质数p和q,p不等于q,计算N = pq.
    • 2. 根据欧拉函数,求得r=φ(N)=φ(p)φ(q)=(p-1)(q-1)。
    • 3. 选择一个小于r的整数e,是e与r互质。并求得e关于r的模反元素,命名为d。(求d令ed≡1(mod r))。(模反元素存在,当且仅当e与r互质)
    • 4. 将p和q的记录销毁。

    其中(N,e)是公钥,(N,d)是私钥。

    举个例子:

    • 1. Alice随机选两个不相等的质数61和53,并计算两数的积N=61*53=3233,N的长度就是密钥长度。3233的二进制是110010100001,一共12位,所以这个密钥就是12位。实际应用中,RSA密钥一般是1024位,总要的场合是2048位。
    • 2. 计算N的欧拉函数。 φ(N)=(p-1)(q-1)=60*52=3120.
    • 3. Alice 在1到3120上随机选择了一个随机数e=17。
    • 4. 计算e对φ(N)的模反元素d,即时,ed-1=kφ(N)。
    • 即使求解:17x+3120y=1.用扩展欧几里得算法求解。可以算出一组解(x,y)=(2753,-15),即d=2753。

    至此完成计算。

    其中N=3233,e=17,d=2753。所以公钥就是(N,e)=(3233,17),私钥(N,d)=(3233,2753)。实际应用中公钥和私钥都是采用ASN.1格式表达的。

    加密

    加密要用到公钥(N,e)。

    假设Bob要向Alice发送加密信息m,他就要用Alice的公钥(N,e)对m进行加密。但m必须是整数(字符串可以取ascii值或unicode值),且m必须小于n。

    所谓加密就是计算下式的c。

    m^e ≡ c (mod n)

    假设m=65,Alice的公钥(3233,17),所以等式如下:

    65^17≡2790(mod 3233)

    所以c等于2790,Bob就把2790发给Alice。

    解密

    Alice收到Bob发来的2790后,就用自己的私钥(3233,2755)进行解密。

     c^d ≡ m (mod n)

    也就是c的d次方除以n的余数就是m。

    2790^2753 ≡ 65 (mod 3233)

    因此得到原文65。

    refer:

    https://blog.csdn.net/chengqiuming/article/details/82725137

    https://www.jianshu.com/p/48ceec5e0124

    http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html

  • 相关阅读:
    【C++】《C++ Primer 》第二章
    【剑指Offer】链表的基本操作之创建、插入、删除
    【LeetCode】365.水壶问题
    【Flutter】事件处理与通知之原始指针事件处理
    【Flutter】功能型组件之对话框详解
    【Flutter】功能型组件之异步UI更新
    mongdb_基本操作
    startswith在项目中的应用
    subString在项目中的应用
    comtains在项目中的应用
  • 原文地址:https://www.cnblogs.com/-wenli/p/12539806.html
Copyright © 2011-2022 走看看