RSA算法是公钥加密领域中的一项重要算法,广泛应用于网络安全和数据保护。然而,其背后的数学原理却常常让非专业人士感到深奥难懂。这篇文章将为您揭开RSA算法的神秘面纱,让您深入了解其中的数学技巧。我们将探讨二项式定理,欧拉定理以及费马小定理等数学知识在RSA算法中的应用,以及它们在RSA算法中的作用。通过这些深入的剖析,您将能够更好地理解RSA算法的运作机制,并洞悉其安全性的根源。
接下来我会在介绍数学知识的同时,讲解这些内容在一些题目中的应用
1、欧拉定理
欧拉定理是数学中的一个非常重要的定理,是瑞士数学家莱昂哈德·欧拉提出的,被认为是数学世界中最美妙的公式之一,也是数学中非常重要的定理之一。它涉及到同余式和模运算的性质。这个定理(指费马小定理)由皮埃尔·德·费马提出,后来由莱昂哈德·欧拉进一步推广。
欧拉定理的内容是:对于任何正整数a和质数p,如果a和p互质,那么有a^φ§≡1(mod p),其中φ§是小于p且与p互质的正整数的个数。这个定理可以用来计算模运算的结果,对于整数的简化以及一些数论问题的解决非常有用。
此外,欧拉定理还可以推广到复数领域、平面几何和多面体中,但因为与RSA算法关系不大,于是这些方面就不展开讲,有兴趣可以自己另外去理解学习。
在了解欧拉定理(Euler’s theorem)之前,请先了解 欧拉函数
1-1欧拉函数
欧拉函数,也被称为φ函数或者同余函数的积性函数,是数论中的一个重要概念。对于任意一个正整数n,小于或等于n的正整数中与n互质的正整数个数(包括1)的个数。欧拉函数用希腊字母φ表示,记作φ(n)。
当 n 是质数的时候,显然有φ(n)=n-1
定义
若 gcd ( a , m ) = 1 ,则 a φ ( m ) ≡ 1 ( m o d m ) , φ ( m ) 为欧拉函数 若\gcd(a,m) = 1,则a^{\varphi(m)} \equiv 1(modm), \varphi(m)为欧拉函数 若gcd(a,m)=1,则aφ(m)≡1(modm),φ(m)为欧拉函数
应用
若a、b、c两两互素,
a
≡
b
(
m
o
d
c
)
a \equiv b(modc)
a≡b(modc)
两边同时φ©次方,得到
a
φ
(
c
)
≡
b
φ
(
c
)
(
m
o
d
c
)
a^{\varphi(c)} \equiv b^{\varphi(c)}(modc)
aφ(c)≡bφ(c)(modc)
根据欧拉定理可得
a φ ( c ) ≡ b φ ( c ) ≡ 1 ( m o d c ) a^{\varphi(c)} \equiv b^{\varphi(c)} \equiv 1(modc) aφ(c)≡bφ(c)≡1(modc)
2、费马小定理
费马小定理是数论中的一个重要定理,由皮埃尔·德·费马在1636年提出。该定理指出,如果p是一个质数,而整数a不是p的倍数,那么有a^(p-1)≡1(mod p)。这意味着当a和p互质(即a和p只有一个公约数1)时,a的(p-1)次方除以p的余数恒等于1。
这个定理的证明涉及到同余式和模运算的性质。通过完全剩余系的概念,我们可以证明这个定理。具体来说,任意取一个质数p,从模p的每个剩余类中各取一个数,得到一个由p个数组成的集合,叫做模p的一个完全剩余系。例如,当p为质数时,如果a是整数,那么a和p显然互质(即两者只有一个公约数1),这时我们可以得到费马小定理的一个特例:当p为质数时,有a^(p-1)≡1(mod p)。
此外,费马小定理还可以通过快速幂算法来实现。这个算法可以在多项式时间内计算出a的(p-1)次方模p的值,从而快速验证费马小定理。
在实际应用中,费马小定理被广泛应用于密码学和信息安全领域。例如,在RSA算法的实现中,费马小定理被用于验证数字签名、加密和解密信息等操作的有效性和安全性。此外,费马小定理还可以用于一些密码破解和数字分析的问题中。
总之,费马小定理是一个非常有用的数学工具,在数论、密码学和信息安全等领域有着广泛的应用。通过理解费马小定理,我们可以更好地理解数字和信息的安全性,以及如何利用数学原理来保护和验证数据的完整性和真实性。
定义
实质上是欧拉定理的特殊情况
若p为素数,gcd(a,p) = 1,则
a
p
−
1
≡
1
(
m
o
d
p
)
a^{p - 1} \equiv 1(modp)
ap−1≡1(modp)
或表示为
a
p
≡
a
(
m
o
d
p
)
a^{p} \equiv a(modp)
ap≡a(modp)
应用
在有幂的取模计算中,可以将幂转化为乘数:
a
p
=
k
p
+
a
(
k
为常数
)
a^{p} = kp + a(k为常数)
ap=kp+a(k为常数)
设a、b、p为素数,gcd(a,p)=1
a p m o d b ≡ ( k p + a ) m o d b ( k 为常数 ) a^{p}modb \equiv (kp + a)modb(k为常数) apmodb≡(kp+a)modb(k为常数)
3、二项式定理
二项式定理(英语:Binomial theorem),又称牛顿二项式定理,由艾萨克·牛顿于1664年、1665年间提出。 该定理给出两个数之和的整数次幂诸如展开为类似项之和的恒等式。
二项式定理可以推广到任意实数次幂,即广义二项式定理。 二项式定理最初用于开高次方。 在中国,成书于1世纪的《九章算术》提出了世界上最早的多位正整数开平方、开立方的一般程序。 1665年,英国的牛顿将二项式定理推广到有理指数的情形。 18世纪,瑞士的欧拉和意大利的卡斯蒂隆分别采用待定系数法和“先异后同”的方法证明了实指数情形的二项式定理。
此外,这个定理也可以被推广到任意实数次幂,即广义二项式定理。这个定理可以被证明使用数学归纳法,通过展开(a+b)n的n次幂并使用组合数学中的二项式系数,可以得到(a+b)n的所有展开项。
定义
根据此定理,可以将x + y的任意次幂展开成和的形式:
( x + y ) n = ( n 0 ) x n y 0 + ( n 1 ) x n − 1 y 1 + … + ( n n − 1 ) x 1 y n − 1 + ( n n ) x 0 y n (x + y)^{n} = \binom{n}{0}x^{n}y^{0} + \binom{n}{1}x^{n - 1}y^{1} + \ldots + \binom{n}{n - 1}x^{1}y^{n - 1} + \binom{n}{n}x^{0}y^{n} (x+y)n=(0n)xny0+(1n)xn−1y1+…+(n−1n)x1yn−1+(nn)x0yn
其中每个 ( n k ) = n ! k ! ( n − κ ) ! ! 其中每个 \binom{n}{k}=\frac{n!}{k!(n - \kappa)!}! 其中每个(kn)=k!(n−κ)!n!!
这个公式也称二项式公式或二项恒等式。使用求和符号,可以把它写作:
(
x
+
y
)
n
=
∑
k
=
0
n
(
n
k
)
x
k
y
n
−
k
(x + y)^{n} = \sum_{k = 0}^{n}{\binom{n}{k}x^{k}y^{n - k}}
(x+y)n=k=0∑n(kn)xkyn−k
应用
二项式定理主要应用在RSA中的取模运算中:
( a + c ) n ≡ b m o d c {(a + c)}^{n} \equiv bmodc (a+c)n≡bmodc
根据上面的二项式定理,除了第一项以外其余项都能被c整除,于是可以化解为
a n ≡ b m o d c a^{n} \equiv bmodc an≡bmodc
以上是基本的运用,接下来在例题(2023PCTF Math_rsa)中来实际运用
例题
from libnum import s2n
from Crypto.Util.number import isPrime
from random import randint
from Crypto.Util.number import *
flag = s2n('*************')
p = getPrime(512)
q = getPrime(512)
e = 65537
assert isPrime(p) and isPrime(q) and isPrime(e)
n = p * q
r = randint(1, n)
d = inverse(e, (p-1)*(q-1))
dp = d % (p-1)
c = (pow(n + 1, flag, n * n) * pow(r, n, n * n)) % (n * n)
print (c)
print (dp)
print (n)
# c=882060058377447321268848980020724395524489096031257683611845355808664956780411111958387899307455114507129676717895793627847611560468848345762904664239988959494309823208044312080682938792974811546867437704951396580072596916447989526104198140310413287929244034150900901266715426756837747481788990395451485206015806349003670148948366627646578945201707598266138951048746736325104926607836131036794293986881562850221165782407735065685527332454684743086522276472286313602776764015555098546870405198518292627699386232004448824478174006452661105093156298361974498733680733552517001214902442872133033560159240190174540320164
# dp=659269883596169200645517318103551269455060241490281027124071635535764822684343569891114453907389138575015799582101809619634533455410617680883297581061003
首先根据dp泄露能算出p
P=11385130529971578630488871798828047311271747838352713484751062655627778441176238350449003416529265342500872320741029327283791414773977773636903471296441359
然后就需要对下面的式子进行化简了
c ≡ [ ( n + 1 ) f l a g m o d n 2 ∗ r n m o d n 2 ] m o d n 2 c \equiv {\lbrack(n\ + \ 1)}^{flag}modn^{2}*r^{n}modn^{2}\rbrack modn^{2} c≡[(n + 1)flagmodn2∗rnmodn2]modn2
先对{(n\ + \ 1)}{flag}modn{2}进行化简,由二项式定理展开发现除最后两项其余全为
n
2
n^{2}
n2的倍数,于是得到:
(
n
+
1
)
f
l
a
g
≡
(
f
l
a
g
∗
n
+
1
)
m
o
d
n
2
{(n\ + \ 1)}^{flag} \equiv (flag*n + 1)modn^{2}
(n + 1)flag≡(flag∗n+1)modn2
然后用欧拉定理对r{n}modn{2}进行化简:
c ≡ [ ( f l a g ∗ n + 1 ) m o d n 2 ∗ r n m o d n 2 ] m o d n 2 c \equiv \lbrack (flag*n + 1)modn^{2}*r^{n}modn^{2}\rbrack modn^{2} c≡[(flag∗n+1)modn2∗rnmodn2]modn2
c φ ( n ) ≡ [ ( f l a g ∗ n + 1 ) φ ( n ) m o d n 2 ∗ r n φ ( n ) m o d n 2 ] m o d n 2 c^{\ \varphi(n)} \equiv \lbrack\left. (flag*n + 1 \right.)^{\ \varphi(n)}modn^{2}*r^{n\ \varphi(n)}modn^{2}\rbrack modn^{2} c φ(n)≡[(flag∗n+1) φ(n)modn2∗rn φ(n)modn2]modn2
根据欧拉函数可知
φ
(
n
2
)
=
p
∗
q
∗
(
p
−
1
)
∗
(
q
−
1
)
=
p
∗
q
∗
φ
(
n
)
=
n
∗
φ
(
n
)
∗
\varphi\left( n^{2} \right)=p*q*(p-1)*(q-1)=p*q* \varphi(n) = n*\ \varphi(n)*
φ(n2)=p∗q∗(p−1)∗(q−1)=p∗q∗φ(n)=n∗ φ(n)∗
于是
r
n
φ
(
n
)
m
o
d
n
2
≡
1
r^{n\ \varphi(n)}modn^{2} \equiv 1
rn φ(n)modn2≡1
c φ ( n ) m o d n 2 ≡ ( f l a g ∗ n + 1 ) φ ( n ) m o d n 2 c^{\ \varphi(n)}modn^{2} \equiv {(flag*n + 1)}^{\ \varphi(n)}modn^{2} c φ(n)modn2≡(flag∗n+1) φ(n)modn2
再使用二项式定理以及欧拉定理:
( f l a g ∗ n + 1 ) φ ( n ) m o d n 2 ≡ [ φ ( n ) ∗ f l a g ∗ n + 1 ] m o d n 2 {(flag*n + 1)}^{\ \varphi(n)}modn^{2} \equiv \lbrack\ \varphi(n)*flag*n + 1\rbrack modn^{2} (flag∗n+1) φ(n)modn2≡[ φ(n)∗flag∗n+1]modn2
c φ ( n ) m o d n 2 ≡ k 1 n + 1 ( k 1 为常数 ) c^{\ \varphi(n)}modn^{2} \equiv k1n + 1(k1为常数) c φ(n)modn2≡k1n+1(k1为常数)
代入得到:
[ k 1 n + 1 ] m o d n 2 ≡ [ φ ( n ) ∗ f l a g ∗ n + 1 ] m o d n 2 \lbrack k1n + 1\rbrack modn^{2} \equiv \lbrack\ \varphi(n)*flag*n + 1\rbrack modn^{2} [k1n+1]modn2≡[ φ(n)∗flag∗n+1]modn2
k 1 n + 1 = φ ( n ) ∗ f l a g ∗ n + 1 + k 2 n 2 ( k 2 为常数 ) k1n + 1 = \varphi(n)*flag*n + 1 + k2n^{2}(k2为常数) k1n+1=φ(n)∗flag∗n+1+k2n2(k2为常数)
k 1 n = φ ( n ) ∗ f l a g ∗ n + k 2 n 2 k1n = \varphi(n)*flag*n + k2n^{2} k1n=φ(n)∗flag∗n+k2n2
两边同时除n:
k
1
=
φ
(
n
)
∗
f
l
a
g
+
k
2
n
k1 = \varphi(n)*flag + k2n
k1=φ(n)∗flag+k2n
两边再同时取modn:
k
1
m
o
d
n
=
[
φ
(
n
)
∗
f
l
a
g
]
m
o
d
n
k1modn = \lbrack\varphi(n)*flag\rbrack modn
k1modn=[φ(n)∗flag]modn
将φ(n)移过去:
k
1
∗
φ
(
n
)
−
1
m
o
d
n
=
f
l
a
g
k1*{\varphi(n)}^{- 1}modn = flag
k1∗φ(n)−1modn=flag
(注:φ(n)}^{- 1}为φ(n)模n下的逆元,详细参考模运算下的运算)
同时, k 1 = c φ ( n ) m o d n 2 / n k1 = c^{φ(n)}modn^{2}/n k1=cφ(n)modn2/n,可以就此得到flag,具体代码如下:
from Crypto.Util.number import *
e = 65537
c=882060058377447321268848980020724395524489096031257683611845355808664956780411111958387899307455114507129676717895793627847611560468848345762904664239988959494309823208044312080682938792974811546867437704951396580072596916447989526104198140310413287929244034150900901266715426756837747481788990395451485206015806349003670148948366627646578945201707598266138951048746736325104926607836131036794293986881562850221165782407735065685527332454684743086522276472286313602776764015555098546870405198518292627699386232004448824478174006452661105093156298361974498733680733552517001214902442872133033560159240190174540320164
dp=659269883596169200645517318103551269455060241490281027124071635535764822684343569891114453907389138575015799582101809619634533455410617680883297581061003
n=88447401617281109205284266981206217014659310600329763191154820141231807474596770227908527024552429055248127300839350521191806493512076404166145944552916741980137609310011221513205456905036235264107484001177613900498473542533779513152465734513538238958385663468539631291630945703342366940483321530352211954297
for x in range(1, e):
if e*dp%x==1:
p=(e*dp-1)//x + 1
if n%p==0:
break
q=n//p
m = (pow(c,(p-1)*(q-1),n**2) - 1) // n * inverse((p-1)*(q-1),n**2) % n
print(long_to_bytes(m))
#b'flag{Y0u_Ar3_Really_G00d_1n_Ma2h}'
4、连分数
连分数(continued fraction)是一种特殊的繁分数,可以用来表示一个数无穷无尽地展开为分数形式。连分数在数学中有广泛的应用,包括解决某些微分方程式差分方程的问题,以及与某些递推关系有关的函数构造的应用。
连分数的一般形式是a0,a1,a2,…,an,…,其中a0,a1,a2,…,an都是整数。如果所有的an都是0,则这个连分数为0。如果an是正整数,则这个连分数为有限连分数;如果an是负整数,则这个连分数为无限连分数。
无限连分数可以表示一个无理数,而所有有限连分数都表示一个有理数。此外,任何有理数都可以表示为有限连分数的形式,而任何无理数都可以表示为无限连分数的形式。
在近代计算数学中,连分数常被用于计算某些数学函数的近似值。例如,可以将连分数应用于求解某些微分方程或差分方程,以及与某些递推关系有关的函数构造中。
定义
连分数 是实数作为有理数的特定收敛序列的表示,即如下表达:
x
=
a
0
+
1
2
a
1
+
2
2
a
2
+
3
2
a
3
+
4
2
a
4
+
.
.
.
x=a_0 + \cfrac{1^2}{a_ 1+\cfrac{2^2}{a_2+\cfrac{3^2}{a_3+ \cfrac{4^2}{a_4+...}}}}
x=a0+a1+a2+a3+a4+...42322212
这里an是某个**整数,而所有其他的数an都是正整数,可依样定义出更长的表达式。如果部分分子**(partial numerator)和部分分母(partial denominator)允许假定任意的值,在某些上下文中可以包含**函数,则最终的表达式是广义连分数。在需要把上述标准形式与广义连分数相区别的时候,可称它为简单或正规连分数**,或称为是规范形式的。例如:
89
26
=
[
3
,
2
,
2
,
1
,
3
]
=
3
+
1
2
+
1
2
+
1
2
+
1
3
\frac {89}{26}=[3,2,2,1,3]=3 + \cfrac{1}{2+\cfrac{1}{2+\cfrac{1}{2+ \cfrac{1}{3}}}}
2689=[3,2,2,1,3]=3+2+2+2+31111
实现代码如下:
def transform(x, y): # 使用辗转相处将分数 x/y 转为连分数的形式
res = []
while y:
res.append(x // y)
x, y = y, x % y
return res
此外,对于带根号的数也是能化为连分数的,如
3
1
=
[
1
,
1
,
2
‾
]
=
1
+
1
1
+
1
2
+
1
1
+
1
2
+
…
\sqrt31=[1,\overline{1,2}]=1 + \cfrac{1}{1+\cfrac{1}{2+\cfrac{1}{1+ \cfrac{1}{2+…}}}}
31=[1,1,2]=1+1+2+1+2+…1111
到后面一直是1,2循环,而且只要是带根号的数化为连分数一定是循环的无限连分数。
可以证明,任何有理数都可以精确地以两种方式表示为连分数:
r
=
[
a
0
,
a
1
,
…
…
,
a
k
,
1
]
=
[
a
0
,
a
1
,
…
…
,
a
k
+
1
]
r=[a_0,a_1,……,a_{k},1]=[a_0,a_1,……,a_{k}+1]
r=[a0,a1,……,ak,1]=[a0,a1,……,ak+1]
对于有限连分数,全体结尾为1的有限连分数和全体结尾不为1的有限连分数一一对应,即同一个连分数有两种表示
4-1、简单连分数
,简单连分数,连分数从第1项开始全都是正整数。如果有限,要求最后一项不为1。(第0项可以任意)
简单连分数的值,一定大于偶数的渐进分数,一定小于奇数的渐进分数。无限简单连分数一定收敛。
4-2、无限连分数
无限连分数
如果分式无限地写下去,有无限个变元,就得到无限连分数。无限连分数收敛等价于渐进分数收敛。
因为只要各变元为正,无限连分数的偶渐进分数单调递增(都比它小),奇渐进分数单调递减(都比它大)。而在均大于等于1时,相邻(奇偶间)两个渐进分数之间距离可以给出估计式,趋于0,因此收敛。