RSA How it work?

RSA How it work?

注:下文分为两大主要的part,第一部分主要说明RSA运算的原理,约束问题。第二部分验证RSA算法的一致性。

截一个大脑袋给自己:

在这里插入图片描述

本文初稿于 5/15 2020

一.RSA原理与基本约束

Ⅰ.公钥密码体系

​ 1976年提出公共密钥密码体制,其原理是加密密钥和解密密钥分离。这样,一个具体用户就可以将自己设计的加密密钥和算法公诸于众,而只保密解密密钥。任何人利用这个加密密钥和算法向该用户发送的加密信息,该用户均可以将之还原。公共密钥密码的优点是不需要经安全渠道传递密钥,大大简化了密钥管理。

​ RSA是公钥密码体系的代表。

说明:

1.仅根据密码算法和加密密钥来确定解密密钥在计算上是不可能的。
2.两个密钥中任何一个都可以用来加密,另外一个可以用来解密。
3.同一算法用于加密和解密,但加密和解密使用不同的密钥。
4.两个密钥之一必须是保密的。

公钥密码体系的应用:

1.对user data的加密/解密。
2.数字签名。
3.密钥交换。
注:由于RSA算法的计算速度较慢,该算法常用于2和3。

Ⅱ.欧拉定理

定义:欧拉函数Φ(n),他是指小于n且与n互质的正整数的个数,习惯上Φ(1)=1。

举例说明:
    Φ(7)=6;//因为7为质数{1,2,3,4,5,6}
    Φ(8)=4;//{1,3,5,7}

性质一:若p,q互质,n=p*q,则Φ(pq) = Φ§ x Φ(q):
p q 集 合 = { 1 , 2 , . . . p q − 1 } , 不 与 n 互 质 的 元 素 集 合 为 { p , 2 p , . . . , ( q − 1 ) p }   { q , 2 q , . . . , ( p − 1 ) q } Φ ( n ) = Φ ( p q ) = ( p q − 1 ) − [ ( q − 1 ) + ( p − 1 ) ] = p q − ( p + q ) + 1 = ( p − 1 ) ∗ ( q − 1 ) = Φ ( p ) ∗ Φ ( q ) pq集合=\{1,2,...pq-1\},不与n互质的元素集合为\{p,2p,...,(q-1)p\} \ \{q,2q,...,(p-1)q\}\\ Φ(n) = Φ(pq)=(pq-1)-[(q-1)+(p-1)]\\ =pq-(p+q)+1\\ =(p-1)*(q-1)\\ =Φ(p) * Φ(q) pq={12...pq1},n{p,2p,...,(q1)p} {q,2q,...,(p1)q}Φ(n)=Φ(pq)=(pq1)[(q1)+(p1)]=pq(p+q)+1=(p1)(q1)=Φ(p)Φ(q)
所以对于质数p有:Φ§=p-1;

假设有两个质数p和q:

其中p≠q,令n=p*q,则
Φ(n) = Φ(pq) = Φ(p) x Φ(q) = (p-1) x (q-1)

欧拉定理:对于任意 互质的a和n有
a Φ ( n ) ≡ 1 ( m o d n ) 即 两 者 同 余 a^{Φ(n)}≡1(modn)即两者同余 aΦ(n)1modn

Ⅲ.RSA算法

首先进行约定:
P R : 私 钥 P U : 公 钥 M : 明 文 C : 密 文 C = E ( P U , M ) : 使 用 公 钥 对 M 加 密 M = D ( P R , C ) ; 使 用 私 钥 解 密 PR:私钥\\ PU:公钥\\ M:明文\\ C:密文\\ C = E(PU,M):使用公钥对M加密\\ M = D(PR,C);使用私钥解密\\ PR:PU:M:C:C=E(PU,M):使MM=D(PR,C);使
​ RSA体制是一种分组密码,其明文M和密文C均是[ 0 , n-1 ]之间的整数,通常n的大小为1024位2进制数(或309位十进制数)。
定 义 l b ( n ) 为 整 数 n 的 位 数 定义lb(n)为整数n的位数 lb(n)n
换句话来说,明文以分组形式进行加密,每个分组的值均小于n(即,分组大小≤lb(n))
约 束 1 : 分 组 的 大 小 是 i 位 , 其 中 2 i < n ≤ 2 ( i + 1 ) 约束1:分组的大小是i位,其中2^i<n≤2^{(i+1)} 1i2i<n2(i+1)
RSA加密过程:
C = M e m o d n C = M^emodn C=Memodn
RSA解密过程:
M = C d m o d n = ( M e ) d m o d n = M e d m o d n M=C^dmodn=(M^e)^dmodn=M^{ed}modn M=Cdmodn=(Me)dmodn=Medmodn
公钥与私钥:公钥与私钥并不是一个具体数,而是两个数的集合

PU = { e , n }
PR = { d, n }

下面继续给出约束:
约 束 2 : 可 以 找 到 e , d , n 使 得 对 于 所 有 M < n , 有 M e d m o d n = M 。 约 束 3 : 对 于 所 有 M < n , 计 算 M e m o d n 和 C d m o d n 是 比 较 容 易 的 。 约 束 4 : 由 e 和 n 确 定 d 是 不 可 行 的 。 约束2:可以找到e,d,n使得对于所有M<n,有M^{ed}modn=M。\\ 约束3:对于所有M<n,计算M^emodn和C^dmodn是比较容易的。\\ 约束4:由e和n确定d是不可行的。 2e,d,n使M<n,Medmodn=M3M<nMemodnCdmodn4end
接着聚焦参数e和参数d,how to calculate?(详细证明见第Ⅵ小节)
M = M m o d n = M ∗ 1 ( m o d n ) 由 欧 拉 定 理 M Φ ( n ) = 1 ( m o d n ) , 前 提 M 和 n 互 质 M k Φ ( n ) = 1 ( m o d n ) , 其 中 k 为 正 整 数 。 M ∗ 1 ( m o d n ) = M ∗ M k Φ ( n ) ( m o d n ) = M k Φ ( n ) + 1 ( m o d n ) M = Mmodn=M*1(modn)\\ 由欧拉定理M^{Φ(n)}=1(modn),前提M和n互质\\ M^{kΦ(n)}=1(modn),其中k为正整数。\\ M*1(modn)=M*M^{kΦ(n)}(modn)=M^{kΦ(n)+1}(modn) M=Mmodn=M1(modn)MΦ(n)=1(modn),MnMkΦ(n)=1(modn)kM1(modn)=MMkΦ(n)(modn)=MkΦ(n)+1(modn)
换句话来说,当e*d =kΦ(n)+1时(即,当e为Φ(n)的逆元时),则可以使得下式成立:
M = C d m o d n = ( M e ) d m o d n = M e d m o d n M=C^dmodn=(M^e)^dmodn=M^{ed}modn M=Cdmodn=(Me)dmodn=Medmodn

约束5:gcd(d,Φ(n)) = gcd(e,Φ(n)) = 1

Ⅳ.RSA计算

首先给出 (n bit)RSA算法的定义:指的是n=pq中n的位数,如果lb(n)长度为512bit,则该RSA为512bitRSA算法。

给出RSA密钥计算步骤:

1.两个质数p q;(p,q为保密的,提前选定好的)
2.n = pq;
3.选定e,使得e满足gcd(e,Φ(n)) = 1;且 1 < e < Φ(n); 
4.利用欧几里得算法,d = e关于Φ(n)的逆元。
5.PU = { e , n } PR = { d, n }

下面给出示例:

第一步:随机选择两个不相等的质数p和q。
	p=17,q=11。(实际应用中,这两个质数越大,就越难破解)。 
	
第二步:计算p和q的乘积n。
	n = pq = 17x11 = 187,  对应二进制为 ‭10111011‬,所以当前lb(n)长度为8bit。

第三步,计算n的欧拉函数φ(n)。
	根据公式: φ(n) = (p-1)(q-1) 爱丽丝算出φ(n)等于16×10=160。

第四步,随机选择一个整数e,条件是1< e < φ(n),且e与φ(n) 互质。
	爱丽丝就在1到3120之间,随机选择了e=7。(实际应用中,在n为大数的情况下,常常选择65537。)   

第五步,计算e对于φ(n)的模逆元d。
	ed ≡ 1 (mod φ(n)) 这个式子等价于 ed - 1 = kφ(n) 实质上就是对下面这个二元一次方程求解。
	ed + φ(n)k = 1 已知 e=7, φ(n)=160, 17d + 3120k = 1 这个方程可以用"扩展欧几里得算法"求解,此处省略具体过程。
	总之,爱丽丝算出一组整数解为 (d,k)=(2753,-15),即 d=23。
	
第六步,将n和e封装成公钥,n和d封装成私钥。
	在爱丽丝的例子中,n=187,e=7,d=23,所以PU={7,187} PR={23,187}。

下面进行加密解密运算:在上面前提下,假设M = 88

加密运算:
即 计 算 C = 8 8 7 m o d 187 8 8 7 m o d 187 = [ ( 8 8 4 m o d 187 ) ∗ ( 8 8 2 m o d 187 ) ∗ ( 8 8 1 m o d 187 ) ] m o d 187 8 8 1 m o d 187 = 88 8 8 2 m o d 187 = 77 8 8 4 m o d 187 = 132 8 8 7 m o d 187 = ( 88 ∗ 77 ∗ 132 ) m o d 187 = 11 即计算C=88^7mod187\\ 88^7mod187=[(88^4mod187)*(88^2mod187)*(88^1mod187)]mod187\\ 88^1mod187=88\\ 88^2mod187=77\\ 88^4mod187=132\\ 88^7mod187=(88*77*132)mod187=11 C=887mod187887mod187=[(884mod187)(882mod187)(881mod187)]mod187881mod187=88882mod187=77884mod187=132887mod187=(8877132)mod187=11
解密运算:
即 , 计 算 M = 1 1 23 m o d 187 M = 1 1 23 m o d 187 = [ ( 1 1 1 m o d 187 ) ∗ ( 1 1 2 m o d 187 ) ∗ ( 1 1 4 m o d 187 ) ∗ ( 1 1 8 m o d 187 ) ∗ ( 1 1 8 m o d 187 ) ] m o d 187 1 1 1 m o d 187 = 11 1 1 2 m o d 187 = 121 1 1 4 m o d 187 = 55 1 1 8 m o d 187 = 33 1 1 23 m o d 187 = ( 11 ∗ 121 ∗ 55 ∗ 33 ∗ 33 ) m o d 187 = 88 即,计算M=11^{23}mod187\\ M=11^{23}mod187=[(11^1mod187)*(11^2mod187)*(11^4mod187)*\\ (11^8mod187)*(11^8mod187)]mod187\\ 11^1mod187=11\\ 11^2mod187=121\\ 11^4mod187=55\\ 11^8mod187=33\\ 11^{23}mod187=(11*121*55*33*33)mod187=88 M=1123mod187M=1123mod187=[(111mod187)(112mod187)(114mod187)(118mod187)(118mod187)]mod187111mod187=11112mod187=121114mod187=55118mod187=331123mod187=(11121553333)mod187=88

Ⅴ.增加RSA抵抗能力的一些约束

约束6:p和q的长度应仅仅相差几位。
约束7:(p-1)和(q-1)都应该有一个较大的质因子。
约束8:gcd((p-1),(q-1))应该较小。

Ⅵ.RSA加密算法证明

由余运算可得:给出两条运算定理

1. [(a mod n) x (b mod n)]mod n = (a x b)mod n;  

显然有:
若 x m o d n = 1 ( m o d n ) , 则 x 2 m o d n = [ ( x m o d n ) ∗ ( x m o d n ) ] m o d n = 1 ( m o d n ) 则 有 x y m o d n = 1 成 立 同 样 若 x m o d n = 0 , 则 对 任 意 整 数 y , 有 x y m o d n = 0 若xmodn=1(mod n),则x^2modn=[(xmodn)*(xmodn)]modn=1(modn)\\ 则有x^ymodn=1成立\\ 同样若xmodn=0,则对任意整数y,有x^ymodn=0 xmodn=1(modn),x2modn=[(xmodn)(xmodn)]modn=1(modn)xymodn=1xmodn=0,yxymodn=0

2. [(a mod n) - (b mod n)]mod n = (a - b)mod n;

下面证明RSA算法:
即 证 明 M k Φ ( n ) + 1 m o d n = M k ( p − 1 ) ( q − 1 ) + 1 m o d n = M 即证明M^{kΦ(n)+1}modn=M^{k(p-1)(q-1)+1}modn=M MkΦ(n)+1modn=Mk(p1)(q1)+1modn=M
step1:
首 先 证 明 M k ( p − 1 ) ( q − 1 ) + 1 m o d p = M m o d p ; 情 况 1 : 若 M 和 p 不 是 互 质 的 , 即 p 整 出 M , 此 时 M m o d p = 0 , 显 然 有 上 式 成 立 。 情 况 2 : 若 M 和 p 互 质 , 由 欧 拉 定 理 M k Φ ( n ) m o d p = 1 M k ( p − 1 ) ( q − 1 ) + 1 m o d p = [ ( M ) M k ( p − 1 ) ( q − 1 ) ] m o d p = [ ( M ) ( M p − 1 ) k ( q − 1 ) ] m o d p = [ ( M ) ( M Φ ( p ) ) k ( q − 1 ) ] m o d p = ( M m o d p ) ∗ 1 [ M Φ ( p ) m o d p ] k ( q − 1 ) = ( M m o d p ) ∗ 1 k ( q − 1 ) = M m o d p 首先证明M^{k(p-1)(q-1)+1}modp=Mmodp;\\ 情况1:若M和p不是互质的,即p整出M,此时Mmodp=0,显然有上式成立。\\ 情况2:若M和p互质,由欧拉定理M^{kΦ(n)}modp=1\\ M^{k(p-1)(q-1)+1}modp=[(M)M^{k(p-1)(q-1)}]modp\\ =[(M)(M^{p-1})^{k(q-1)}]modp\\ =[(M)(M^{Φ(p)})^{k(q-1)}]modp\\ =(Mmodp)*1[M^{Φ(p)}modp]^{k(q-1)}\\ =(Mmodp)*1^{k(q-1)}\\ =Mmodp Mk(p1)(q1)+1modp=Mmodp;1MppMMmodp=02MpMkΦ(n)modp=1Mk(p1)(q1)+1modp=[(M)Mk(p1)(q1)]modp=[(M)(Mp1)k(q1)]modp=[(M)(MΦ(p))k(q1)]modp=(Mmodp)1[MΦ(p)modp]k(q1)=(Mmodp)1k(q1)=Mmodp
step2:
故 现 在 有 [ M k ( p − 1 ) ( q − 1 ) + 1 − M ] m o d p = [ M k ( p − 1 ) ( q − 1 ) + 1 m o d p ] − [ M m o d p ] = 0 因 此 p 整 除 [ M k ( p − 1 ) ( q − 1 ) + 1 − M ] 同 理 q 整 出 [ M k ( p − 1 ) ( q − 1 ) + 1 − M ] 由 于 p , q 为 不 同 的 质 数 , 必 定 存 在 一 个 整 数 r 满 足 [ M k ( p − 1 ) ( q − 1 ) + 1 − M ] = ( p q ) r = n r 即 , n 整 除 [ M k ( p − 1 ) ( q − 1 ) + 1 − M ] , 且 结 果 为 r 即 , [ M k ( p − 1 ) ( q − 1 ) + 1 − M ] m o d n = 0 即 M k ( p − 1 ) ( q − 1 ) + 1 m o d n = M m o d n = M k Φ ( n ) + 1 m o d n 故现在有 [M^{k(p-1)(q-1)+1} - M]modp=[M^{k(p-1)(q-1)+1}modp]-[Mmodp]=0\\ 因此p整除[M^{k(p-1)(q-1)+1} - M]\\ 同理q整出[M^{k(p-1)(q-1)+1} - M]\\ 由于p,q为不同的质数,必定存在一个整数r满足[M^{k(p-1)(q-1)+1}-M]=(pq)r=nr\\ 即,n整除[M^{k(p-1)(q-1)+1} - M],且结果为r\\ 即,[M^{k(p-1)(q-1)+1} - M]modn=0\\ 即M^{k(p-1)(q-1)+1}modn = Mmodn= M^{kΦ(n)+1}modn [Mk(p1)(q1)+1M]modp=[Mk(p1)(q1)+1modp][Mmodp]=0p[Mk(p1)(q1)+1M]q[Mk(p1)(q1)+1M]pqr[Mk(p1)(q1)+1M]=(pq)r=nrn[Mk(p1)(q1)+1M]r[Mk(p1)(q1)+1M]modn=0Mk(p1)(q1)+1modn=Mmodn=MkΦ(n)+1modn

Ⅶ.RSA与Montgomery幂模

经过上述过程的思考,有以下结论:

1.RSA算法所使用的密钥可以提前预计算好PU,PR。
2.Montgomery幂模主要应用于加密和解密过程中。
	即已知明文M和公钥PU,计算密文C,
	已知密文C和私钥PR,计算明文M。
3.(n bit)Montgomery运算与(n bit)RSA中 n 的含义是相同的。

二.RSA算法的一致性验证

Ⅰ.验证公钥私钥算法

思路:将第三方文件,以及第三方文件使用的p,q,e通过“rsatool.py”进行运算获得私钥,“rsatool.py”的运算私钥方案等同于上述计算私钥的方案。将该私钥解密第三方加密后的文件,可以正确解密,完成验证。

验证博客

下面为rsatool里面的私钥计算部分:
class RSA:
    def __init__(self, p=None, q=None, n=None, d=None, e=DEFAULT_EXP):
        """
        Initialize RSA instance using primes (p, q)
        or modulus and private exponent (n, d)
        """

        self.e = e

        if p and q:
            assert gmpy.is_prime(p), 'p is not prime'
            assert gmpy.is_prime(q), 'q is not prime'

            self.p = p
            self.q = q
        elif n and d:   
            self.p, self.q = factor_modulus(n, d, e)
        else:
            raise ArgumentError('Either (p, q) or (n, d) must be provided')

        self._calc_values()

    def _calc_values(self):
        self.n = self.p * self.q

        if self.p != self.q:
            phi = (self.p - 1) * (self.q - 1)
        else:
            phi = (self.p ** 2) - self.p

        self.d = gmpy.invert(self.e, phi)

        # CRT-RSA precomputation
        self.dP = self.d % (self.p - 1)
        self.dQ = self.d % (self.q - 1)
        self.qInv = gmpy.invert(self.q, self.p)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值