RSA中的数学知识及应用(二项式,费马,欧拉等)

​ 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) ab(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) ap11(modp)
或表示为
a p ≡ a ( m o d p ) a^{p} \equiv a(modp) apa(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)xn1y1++(n1n)x1yn1+(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=0n(kn)xkynk

应用

二项式定理主要应用在RSA中的取模运算中:

( a + c ) n ≡ b m o d c {(a + c)}^{n} \equiv bmodc (a+c)nbmodc

根据上面的二项式定理,除了第一项以外其余项都能被c整除,于是可以化解为

a n ≡ b m o d c a^{n} \equiv bmodc anbmodc

以上是基本的运用,接下来在例题(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)flagmodn2rnmodn2]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)flagflagn+1modn2

然后用欧拉定理对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[flagn+1modn2rnmodn2]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)[flagn+1 φ(n)modn2rn φ(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)=pq(p1)(q1)=pqφ(n)=n φ(n)
于是
r n   φ ( n ) m o d n 2 ≡ 1 r^{n\ \varphi(n)}modn^{2} \equiv 1 rn φ(n)modn21

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)modn2flagn+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} flagn+1 φ(n)modn2[ φ(n)flagn+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)modn2k1n+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)flagn+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)flagn+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)flagn+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+…}}}} 3 1=[11,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,因此收敛。

  • 45
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值