本文包含了大量与数论有关的知识和证明(网上冲浪收集总结),不想看的可以直接看算法哈(有python链接)
目录
1.费马小定理与欧拉定理
2.中国剩余定理
3.RSA加解密算法优化
4.裴蜀定理
5.RSA的攻击
费马小定理:n是整数,p是素数,则 n(p-1)≡1 mod p
证明如下:
设p是素数,利用二项式可得: (n+1)p = np +(p的倍数)+ 1
二项式定理(百度百科 )
所以 (n+1)p – np – 1 = (p的倍数)
将(np-n)加上原式(别问我为什么 ),得:
n p - n + (n+1) p - n p - 1
=(n+1) p - n - 1
=(n+1) p - (n+1)
这个跟n p - n很像,如果设(n p - n)是p的倍数,则(n+1) p - (n+1)也是p的倍数。(因为(n+1) p – n p – 1是p的倍数)
因此我们直接用数学归纳法,令n=1,(1p-1) / p = 0,所以是p的倍数。所以原式成立。
所以n p – n 是p的倍数,即n p - n = p 倍,所以n p ≡ n mod p
最终得到费马小定理:n是整数,p是素数,则np≡n mod p(形式一)
因为n p - n = p * n * k(我也不知道哪里听到的)
所以约掉一个n,得:n (p-1) - 1 = p * k
所以n(p-1)≡1 mod p(形式二,更常用)
欧拉定理是基于费马小定理的拓展,证明较为复杂(其实是没看 )
下面直接给出结论:a,n属于整数且互素,则aφ(n)≡1 mod n
(φ(n)是欧拉函数,n为素数时φ(n)= n - 1)
因为RSA的解密公式是根据欧拉函数推出的,所以此时我们可以推导RSA的解密公式了。
RSA已知公式:e*d≡1 modφ(n)
RSA加密公式:C = me mod n
解密(推导过程)://以下的n*k都表示是n的倍数(懒
C = m e + n * k
C d
= m e*d + n * k;
= m (1+φ(n)*k) + n * k // 分开幂数
= m 1 * m (φ(n)*k) + n * k // 运用欧拉定理
= m * (1+n * k )k +n * k
= m * (1+n * k) + n * k
= m + n * k
所以 m = C d mod n
证明完毕。
《孙子算经》卷下第二十六题“物不知数”:
有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?
宋代数学家秦九韶在《数书九章》中对此做出了系统的解答。明朝数学家程大卫将解法编成易于上口的《孙子歌诀》:
三人同行七十稀,五树梅花廿一支,七子团圆正半月,除百零五使得知。
意思是:除3的余数 * 70 + 除5的余数 * 21 + 除7的余数 * 15 - 105的倍数 = 答案
解析:70是5和7的公倍数中除3余1的数,21是3和7的公倍数中除5余1的数,15是3 和5的公倍数中除7余1的数
系统来说就是,已知一个数x,m1,m2,m3 互素,x模m1余a,x模m2余b,x模m3余c,求x。
证法不会
解法:M1= m2 * m3 ; M2 = m1 * m3 ; M3 = m1 * m2;
t1为M1的模m1逆元(t1*M1≡ 1 mod m1 )
t2为M2的模m2逆元
t3为M3的模m3逆元
则 x = a * M1 * t1 + b * M2 * t2 + c * M3 * t3 – m1 * m2 * m3 * k(适当选择k使得x为最小正值)
即:x = (a * M1 * t1 + b * M2 * t2 + c * M3 * t3)mod (m1 * m2 * m3) (此时是唯一解)
CRT可以用于解决RSA的加密解密的幂乘运算(也就是算法优化)。其基于两种不同的算法,一是基于单基数交换法(SRC,就是上面这个),二是基于混合基数转换法(MMRC)。
1.利用基于SRC的CRT法计算RSA(常用)
思路:m = c d mod n (原式)
→(m1 = c d mod p) 和 (m2=c d mod q)
(先转化成用这两个式子用SRC)
→(m1=c ^ (d mod (p-1)) mod p) 和 (m2= c ^ ( d mod (q-1)) mod q)
(然后运用费马小定理化简指数后变成用这两个式子用SRC)
下面开始推导:
假设已知c,d,p,q ,求m
先设d = k(p-1)+r 即 r = d mod (p-1) (我也不知道为啥)
令m1 = c d mod p; m2=c d mod q;
则m1
= c d mod p
= c^( k(p-1) + r ) mod p
= (c k(p-1) * c r) mod p //用欧拉定理 or 费马小定理
= (1+p * k ) k mod p * c r mod p
= c r mod p
因为r = d mod (p-1),
所以,m1=c^( d mod (p-1)) mod p
同理,m2= c^( d mod (q-1)) mod q
推导完毕。
算法:
d1 = d mod p-1
d2 = d mod q-1
c1 = c mod p
c2 = c mod q
m1 = c1d1 mod p
m2 = c2d2 mod q
t1 = q–1 mod p
t2 = p–1 mod q
m =(m1 * t1 * q+m2 * t2 * p) mod p * q
2.利用基于MMRC的CRT法计算RSA(速度是原来的4倍)
推理过程较为复杂,恕不展示 (其实是我不会 )
算法:
d1 = d mod p-1
d2 = d mod q-1
c1 = c mod p
c2 = c mod q
m1 = c1d1 mod p
m2 = c2d2 mod q // 前6步和上面一模一样
B = p–1 mod p
m=m1+(( (m2-m1) * B )mod q ) * p
python代码请参考wdxzkp的博客
裴蜀定理:a,b是两个整数,d=gcd(a,b) ,对于任意整数x,y都有ax+by =d的倍数。特别地,一定存在两个整数x,y使得ax+by=d。
密码学上的重要推论:对于互质的两个数a,b,一定存在 ax+by =1。
(因为结果为1,所以两边可以同乘任何数,所以此时ax+by可以表示任何数)
证明如下:
d = gcd(a,b),所以 d | a , d | b , d | (ax+by)
设s = (ax+by)的最小正值,所以d | s
通过证明2得到(证明2在下面,先理一下思路)
s | a, s | b
又因为d | s
(s是a和b的因子,因为d是a和b的最大公因数,而且d也是s的因子,所以只能是d = s)
所以d = s,所以d = (ax+by) 成立
证明2在这:
设q= a/s 的向下取整
令r = a mod s , 即 r = a – s * q
代入s,得:
r
= a - s * q
= a - (ax+by) * q
= a*(1 - q * x) – b * y * q
所以r 也是a和b的线性组合(r=ax+by)
因为s = (ax+by)的最小正值,0 <= r < s
所以r只能为0
所以 a mod s = 0,
所以s | a,同理 s | b 。
1.RSA共模攻击
使用场景:RSA使用者用一个n得到2个e的情况(且e1,e2互素)
攻击者得到两组密文:
c1 = me1 mod n
c2 = m e2 mod n
即 已知 n,e1,e2,c1,c2,解m
因为e1,e2互素,运用裴蜀定理可得:e1 * r + e2 * s = 1
(r和s可以用扩展欧几里得算法直接解出来)
则c1^ r * c2^ s mod n
= (m^ e1) ^ r * (m^ e2) ^ s mod n
=(m^ e1 * r) * (m^ e2 * s) mod n
=m^(e1 * r + e2 * s) mod n
=m mod n
所以 m = c1 r * c2 s
在实际运算里面,r和s一定会有一个是负数。我们假设r是负数,要求c1r必须先求c1的模N逆元(即c1-1),再求(-r)的次方。
python代码为:m=pow(c1-1,-r,N)*pow(c2,s,N)%N
措施:不要在任意一组用户之间共享公钥
2.RSA选择密文攻击
使用场景:可以让原加密者进行签名
首先任选一个数r
y = x * c mod n
t = r –1 mod n (t 为r的模n逆元)
然后将y送给攻击者进行签名,得到u:u = y d mod n
所以
u * t
= y d * r–1 mod n
=(x * c) d * r–1 mod n
= x d * c d * r–1 mod n
=r * c d * r–1 mod n
=cd mod n
= m
所以 m = u * t
还有其他的等有空再更新啦!!
参考链接:
https://www.cnblogs.com/gwind/p/8013154.html
参考文献:《中国剩余定理在 RSA解密中的应用》
文章编号 :1001 - 9383(2003) 03 - 0138 – 06