RSA加密数学原理详解


部分内容由 AI 辅助生成,供参考

此文力争用最简明的语言,最详细的算式阐明 RSA加密算法 的数学原理。

非如此不可?非如此不可!

符号说明

MOD

此符号有两个含义 由于网上资料对此符号的混用,故特此说明

  • 同余符号 给定正整数m,如果两个整数a和b满足a-b能被m整除,即m|(a-b),那么就称整数a与b对模m同余,记作a≡b(mod m)

  • 取余符号 a mod b = c 表示整数a除以整数b所得余数为c

gcd()

g c d ( a , b ) = a 与 b 的最大公因数 gcd(a,b)=a与b的最大公因数 gcd(a,b)=ab的最大公因数

RSA加解密方法

欲加密明文m

  1. 选择两个大质数p和q

  2. 计算n=p*q,安全要求n至少为1024位长

  3. 计算φ(n)=(p-1)(q-1)

  4. 选择公钥e,满足1≤e<φ(n),gcd(e,φ(n))=1 (gcd最大公约数)

  5. 选择私钥d,满足于e*d≡1(mod φ(n) )

加密 传递e、n给对方 ,加密明文m为c方法如下
c = m e   m o d   n c=m^e\bmod n c=memodn
解密 已知d、n时 ,将密文c解密为明文方法如下
m = c d   m o d   n m=c^d\bmod n m=cdmodn

数学原理

欧拉函数 φ(n)的计算

定义:φ(n) 表示在小于等于 n 的正整数之中,与 n 构成互质关系的数的个数。

如果 n = p * q,p 与 q 均为质数,则
φ ( n ) = φ ( p q ) = φ ( p − 1 ) φ ( q − 1 ) = ( p − 1 ) ( q − 1 ) φ(n) = φ(pq)= φ(p - 1)φ(q - 1) = (p - 1)(q - 1) φ(n)=φ(pq)=φ(p1)φ(q1)=(p1)(q1)
明白了对于任意数n的φ(n)的计算方法即可得出上述结论

对于任意数n的φ(n)的计算

再说一遍:φ(n) 表示在小于等于 n 的正整数之中,与 n 构成互质关系的数的个数。

1~N共有N个数,去掉其中N的因数,剩下的就是与 n 构成互质关系的数。由此即可求出φ(n) 。

先对N进行质因数分解:
N = p 1 c 1 p 2 c 2 p 3 c 3 ⋯ p m c m N=p_1^{c_1} p_2^{c_2} p_3^{c_3} \cdots p_m^{c_m} N=p1c1p2c2p3c3pmcm
1~N中,任一质数p的倍数的个数为[N/p]取整,另一质数q的倍数的个数为[N/q]取整。

1~N中除去p与q的倍数。剩下的,与 n 构成互质关系的数的,个数为
N − N p − N q + N p q = N ⋅ ( 1 − 1 p ) ( 1 − 1 q ) N-\frac{N}{p}-\frac{N}{q}+\frac{N}{p q}=N \cdot\left(1-\frac{1}{p}\right)\left(1-\frac{1}{q}\right) NpNqN+pqN=N(1p1)(1q1)
​ PS: 因为pq的倍数被多去了一次,所以要加上[N/pq]取整。使用了容斥原理。

由质因数分解的定义可得,N的全部因数为
p 1 p 2 p 3 ⋯ p m p_1 p_2 p_3 \cdots p_m p1p2p3pm

φ ( N ) = N − ∑ i = 1 m N p i + ∑ 1 ≤ i < j ≤ m N p i p j − ∑ 1 ≤ i < j < k ≤ m N p i p j p k + ⋯ + ( − 1 ) m + 1 N p 1 p 2 ⋯ p m \begin{aligned} & \varphi(N)=N-\sum_{i=1}^m \frac{N}{p_i}+\sum_{1 \leq i<j \leq m} \frac{N}{p_i p_j}-\sum_{1 \leq i<j<k \leq m} \frac{N}{p_i p_j p_k}+\cdots +(-1)^{m+1} \frac{N}{p_1 p_2 \cdots p_m} \end{aligned} φ(N)=Ni=1mpiN+1i<jmpipjN1i<j<kmpipjpkN++(1)m+1p1p2pmN
化简得
φ ( N ) = N ⋅ ∏ i = 1 m ( 1 − 1 p i ) \varphi(N)=N \cdot \prod_{i=1}^m\left(1-\frac{1}{p_i}\right) φ(N)=Ni=1m(1pi1)
上述方法的python实现:

def phi(n):
    res = n
    i = 2
    while i * i <= n:
        if n % i == 0:
            res //= i
            res *= (i - 1)
            while n % i == 0:
                n //= i
        i += 1
    if n > 1:
        res //= n
        res *= (n - 1)
    return res

python按欧拉函数定义计算任意数的欧拉函数

import fractions

def phi(n):
    amount = 0
    for k in range(1, n + 1):
        if fractions.gcd(n, k) == 1:
            amount += 1
    return amount

公钥私钥的生成

公钥的选择条件 gcd(e,φ(n))=1 保证了私钥d的存在,既e的逆元存在模φ(n)

为什么呢,需要理解 模的逆元 这个概念

模的逆元

定义:模m意义下,e与m互质时,存在k, 有de=km+1既de≡1(mod m ),则称d为e的逆元

逆元存在的充要条件

模m意义下,e的逆元存的冲要条件就是
g c d ( e , m ) = 1 gcd(e,m)=1 gcd(em)=1
证明则需要使用 辗转相除法 的知识,见下文

辗转相除法

也叫欧几里得算法,对于e、φ(n)有s、d,有下式
gcd ⁡ ( Φ ( n ) , e ) = s ⋅ Φ ( n ) + d ⋅ e \operatorname{gcd}(\Phi(n), e)=s \cdot \Phi(n)+d \cdot e gcd(Φ(n),e)=sΦ(n)+de
当 gcd(e,φ(n))=1时,上式为
1 = s ⋅ Φ ( n ) + d ⋅ e 1=s \cdot \Phi(n)+d \cdot e 1=sΦ(n)+de
可写成下式,后文的证明需要使用此式
d ⋅ e = 1 + s ⋅ Φ ( n ) d \cdot e=1+s \cdot \Phi(n) de=1+sΦ(n)

证明解密是加密的逆过程

当我们知道d、n可对密文c进行如下操作得到明文m。
证明解密是加密的逆过程即证明下式成立
m = c d   m o d   n m=c^d\bmod n m=cdmodn
证:

考虑到
c = m d   m o d   n = ( c d   m o d   n ) e   m o d   n c=m^d \bmod n=(c^d \bmod n)^e\bmod n c=mdmodn=(cdmodn)emodn
对于c可进行如下代换
c = ( m e + k 1 n ) c=(m^e+k_1 n) c=(me+k1n)
将上式带入后有
右式 = c d   m o d   n = ( m d + k 1 n ) d   m o d   n 右式=c^d\bmod n=(m^d+k_1 n)^d\bmod n 右式=cdmodn=(md+k1n)dmodn
右式 = ( ∑ i + j = d m i e ( k 1 n ) j )   m o d   n 右式=(\sum_{i+j=d} m^{ie} (k_1 n)^j)\bmod n 右式=(i+j=dmie(k1n)j)modn

= ( m e d )   m o d   n =(m^{ed})\bmod n =(med)modn

对于ed有下式
d ⋅ e = 1 + s ⋅ Φ ( n ) d \cdot e=1+s \cdot \Phi(n) de=1+sΦ(n)
带入右式有
右式 = ( m e d )   m o d   n = m m s ⋅ Φ ( n )   m o d   n 右式=(m^{ed})\bmod n=mm^{s \cdot \Phi(n)}\bmod n 右式=(med)modn=mmsΦ(n)modn
其中,由快速幂取模(后文有解释)有
m s ⋅ Φ ( n )   m o d   n = ∏ i = 1.. s ( m Φ ( n )   m o d   n )   m o d   n m^{s \cdot \Phi(n)}\bmod n=\prod_{i=1..s}(m^{\Phi(n)}\bmod n) \bmod n msΦ(n)modn=i=1..s(mΦ(n)modn)modn
欧拉定理(后文有解释)得出
m φ ( n )   m o d   n = 1 m^{\varphi(n)}\bmod n=1 mφ(n)modn=1
带入后右式有
右式 = m ⋅ 1   m o d   n = m   m o d   n 右式=m\cdot 1 \bmod n=m\bmod n 右式=m1modn=mmodn

由于0≤m<n则右式有
右式 = m   m o d   n = m 右式=m\bmod n=m 右式=mmodn=m
证毕

证明加密是解密的逆过程同理可证

附录

辗转相除法

欧几里得算法,也称为辗转相除法,是一种计算两个整数最大公约数的算法。以下是对该算法的证明。

首先,欧几里得算法是基于以下的定理:

定理:对于任意的两个整数a和b (假设a>b),如果我们用a除以b,得到的余数是r(即a=kb+r),那么a和b的最大公约数和b和r的最大公约数是相同的。即 gcd(a,b) = gcd(b,r)。

证明:

让我们首先假设d是a和b的一个公约数,那么我们有:
a = d m a = dm a=dm
b = d n b = dn b=dn

对于a和b的除法,我们可以得到:a = kb + r 通过替换a和b,我们得到:
d m = ( d n ) k + r dm = (dn)k + r dm=(dn)k+r
简化得到
r = d ( m − n k ) r = d(m - nk) r=d(mnk)
这表明d也是r的约数,所以我们可以说d也是b和r的公约数。

然后,假设我们有一个公约数d’,它是b和r的公约数,那么我们有:
b = d ′ m ′ b = d'm' b=dm
r = d ′ n ′ r = d'n' r=dn

我们可以将r重新写为。
r = a − k b = d m − ( d ′ m ′ ) k = d ( m − m ′ k ) r = a - kb = dm - (d'm')k = d(m - m'k) r=akb=dm(dm)k=d(mmk)
这表明d’也是a的约数。因此,d’是a和b的公约数。

因为我们没有对d或d’的选择做任何特殊的假设,所以我们可以得出结论,a和b的公约数集合和b和r的公约数集合是相同的。

因此,a和b的最大公约数等于b和r的最大公约数。

证毕

欧几里得算法就是基于这个定理,通过反复使用这个性质,每次用除数和余数代替原来的一对数,直到余数为0,此时的除数就是最初的两个数的最大公约数。

快速幂取模

公式:
( a × b )   m o d   m = ( ( a   m o d   m ) × ( b   m o d   m ) )   m o d   m (a×b)\bmod m = ((a\bmod m)×(b\bmod m))\bmod m (a×b)modm=((amodm)×(bmodm))modm

证明:

这里,a、b和m都是整数,我们假设a和b的模除以m的结果分别为A和B,那么根据取模的定义我们有:

a = k m + A   ( A < m ) a = km + A \ (A < m) a=km+A (A<m)
b = n m + B   ( B < m ) b = nm + B \ (B < m) b=nm+B (B<m)

我们把这两个表达式带入到等式左边得到:
( a × b )   m o d   m = ( k m + A ) ( n m + B )   m o d   m = ( k n m 2 + ( k B + n A ) m + ( A B ) )   m o d   m = A B   m o d   m (a×b)\bmod m = (km+A)(nm+B)\bmod m= (knm² + (kB + nA)m + (AB))\bmod m=AB\bmod m (a×b)modm=(km+A)(nm+B)modm=(knm2+(kB+nA)m+(AB))modm=ABmodm
然后,再看一下等式的右边:
( ( a   m o d   m ) × ( b   m o d   m ) )   m o d   m = ( A B )   m o d   m ((a\bmod m)×(b\bmod m))\bmod m=(AB)\bmod m ((amodm)×(bmodm))modm=(AB)modm
证毕

欧拉定理

对任何两个互质的正整数a, m(即 gcd(a,m) = 1),m>2,有m
a φ ( m ) ≡ 1 (   m o d   m ) a^{\varphi(m)} \equiv1(\bmod m) aφ(m)1(modm)
1 = a φ ( m )   m o d   m 1=a^{\varphi(m)} \bmod m 1=aφ(m)modm

证明:

欧拉定理是数论中的一个重要定理,由著名数学家欧拉提出。欧拉定理可以表示为:如果a和n是互质的正整数,那么 a^(φ(n)) ≡ 1 (mod n),其中φ(n) 是欧拉φ函数,表示小于n并且与n互质的正整数数量。

证明:

首先,我们考虑一个集合S,这个集合包含了所有小于n并且与n互质的正整数。记φ(n)=m。

然后,我们考虑另一个集合T,它是由a乘以集合S的每个元素并且对n取模得到的。根据a和n互质,我们知道这样得到的集合T的元素是不重复的,并且与集合S一一对应。记作
S = { x 1 , x 2 , . . . , x m } S=\{ x_1,x_2,...,x_m\} S={x1,x2,...,xm}
T = { y 1 , y 2 , . . . , y m } T=\{ y_1, y_2, ..., y_m\} T={y1,y2,...,ym}

y i ≡ a x i (   m o d   n ) y_i ≡ ax_i (\bmod n) yiaxi(modn)

我们考虑集合S的元素的乘积与集合T的元素的乘积,并且都对n取模,由于S和T是一一对应的,它们的乘积应该相等,即有:
x 1 x 2 . . . x m ≡ y 1 y 2 . . . y m (   m o d   n ) ≡ a x 1 a x 2 . . . a x m (   m o d   n ) x_1 x_2 ... x_m ≡ y_1 y_2 ... y_m (\bmod n)≡ ax_1 ax_2 ... ax_m (\bmod n) x1x2...xmy1y2...ym(modn)ax1ax2...axm(modn)
x 1 x 2 . . . x m ≡ a m x 1 x 2 . . . x m (   m o d   n ) x_1 x_2 ... x_m ≡ a^m x_1 x_2 ... x_m (\bmod n) x1x2...xmamx1x2...xm(modn)

因为等式左边和n互质,我们可以得到:
1 ≡ a m (   m o d   n ) 1 ≡ a^m (\bmod n) 1am(modn)
因为m=φ(n)

证毕

我是 UNEXPECTED 联合战队 的 Paddy,主攻Crypto。
接下来将持续为大家带来密码学中的数学知识分享。期待得到批评指正与交流讨论。

谨以此文,纪念米兰·昆德拉
Adieu. Kundera

我的文章会首先发布于知乎,欢迎您的关注

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值