RSA加密理解和数论基础

数论基础

RAS这个缩写是它的三个作者的姓氏首字母.
论文
https://people.csail.mit.edu/rivest/Rsapaper.pdf
http://gauss.math.luc.edu/greicius/Math201/Fall2012/Lectures/euler-phi.article.pdf

RFC规范
https://tools.ietf.org/html/rfc3447

最大公约数

gcd(a, n) = x, gcd为Greatest Common Divisor缩写
表示a,n的最大公约数为x

互质

若gcd(a, n) = 1, 则称a与n互质

素数

设x为大于1的正整数, 对于[2, x-1]之间的任意正整数ni,
若gcd(x, ni)=1
则称x为素数, 或质数

同余式

对于两个整数, 如果 (a-b) mod m = 0, 则称 a对m取模 = b对m取模, 符号表示为
a ≡ b (mod m),
例如 2 ≡ 7 (mod 5)
性质:
1.反身性:a≡a (mod m)
2.对称性:若a≡b(mod m),则b ≡ a (mod m)
3.传递性:若a≡b(mod m),b ≡ c ( mod m),则a≡c(mod m)
4.同余式相加:若a≡b(mod m),c ≡ d( mod m),则a±c ≡ b±d (mod m)

同余式乘法

若a≡b(mod m),c ≡ d( mod m),则ac ≡ bd ( mod m)

同余式除法

若ac≡bc(mod m), c≠0,则 a≡b ( mod m/gcd(c,m))

同余式幂运算

若a≡b(mod m),则an ≡ bn ( mod m )

扫描二维码关注公众号,回复: 5095827 查看本文章

欧拉定理

网上到处都是.
若a,n为正整数, 且互质(有的也称为互素) , 即 gcd(a, n) = 1
则:
aφ(n) ≡ 1 (mod n)
φ(n)为 处于[1, n-1]之间的且与n互质的正整数的个数

举例,
设n=10, a=3
那么[1, 9]之间与10互质的数字有1,3,7,9, 共4个数字, 即
φ(10)=4
34 mod 10 = 81 mod 10 = 1

证明过程, 看看别人写的 https://www.cnblogs.com/wangxiaodai/p/9758242.html

费马小定理

假如p是素数,且gcd(a,p)=1,
那么
a(p-1)≡1(mod p)
费马小定理是欧拉定理的特例,
因为p为素数时, [1, p-1]之间的所有正整数都与p互质, 即
φ( p ) = p - 1

欧几里德算法

最大公约数定理
gcd(a,b) = gcd(b,a mod b)
此定理用于求解两个正整数之间的最大公约数 .

余数乘法公式

(a * b ) mod m = ((a mod m) * (b mod m) ) mod m

推论

  1. 若gcd(m, n) = 1, 则
    φ(m*n) = φ(m)*φ(n)

  2. 设p, q为素数, n=p*q, 那么
    φ(n) = φ( p ) * φ ( q ) = (p-1) * (q-1)

RSA数学推导

公式推导

设 M, n, p, q, d, e都为正整数, 且满足以下条件:

p和q都为素数                          条件(1)
n = p * q                            条件(2)
M<n                              条件(3)
M与n互质, 即gcd(M,n)=1                     条件(4)
M与p互质, 即gcd(M, p)=1                     条件(5)
M与q互质, 即gcd(M, q)=1                     条件(6)
d与(p-1)(q-1)互质, 即gcd(d, (p-1)(q-1))=1             条件(7)
e * d ≡ 1 ( mod (p-1) * (q-1) ) , 即e, d互为模逆             条件(8)
(没错, 就是有这么多限制条件)
如果p, q, n都比M大, 那么条件4,5,6都自然成立

根据条件(3), 因为m<n, M/n的余数就是M
M ≡ M ( mode n)             等式(1)

根据欧拉定理条件(4) 有
Mφ( n ) ≡ 1 ( mod n)              
根据同余式幂运算, 对上式变形, 有
(Mφ( n )) k≡ 1k ( mod n) , k为任意正整数
即 Mk * φ(n) ≡ 1 ( mod n)   
根据同余式乘法, 将上式与 **等式(1)**相乘
Mk * φ(n) * M ≡ 1 * M ( mod n) 

Mk * φ(n) + 1 ≡ M ( mod n)             等式(3)

根据费马小定理和条件(1), 有
φ( p ) = p - 1                等式(2)
φ( q ) = q - 1                 等式(3)

根据推论
φ( p * q ) = φ ( p ) * φ( q ) = (p -1 ) * ( q - 1)
因为条件n = p * q,所以
φ ( n ) = φ ( p * q ) = (p-1) * (q-1)       等式(4)
等式4代入条件(8), 得
e * d ≡ 1 ( mod φ( n ) ), 转换成多式, 即为
e * d = k * φ( n ) + 1, k为任意正整数      等式(5)

根据费马小定理和条件5及条件6), 有
Mp-1 ≡ 1(mod p)
Mq-1 ≡ 1(mod q)
根据同余式幂运算, 对上式变形, 有
(Mp-1)k*(q-1) ≡ 1k*(q-1) ( mod p ) , (k为任何正整数)
即 Mk * (p-1) * (q-1) ≡ 1 ( mod p )
根据同余式乘法, 将上式与 **等式(1)**相乘
Mk * (p-1) * (q-1) * M ≡ 1 * M ( mod p)

M k * (p-1) * (q-1) + 1 ≡ M ( mod p)
将等式(4)代入, 即
M k * φ ( n ) + 1 ≡ M ( mod p)         等式(6)
同理可得
M k * φ ( n ) + 1 ≡ M ( mod q)         等式(7)

上面一系列的推导得出了以下结论
e * d = k * φ( n ) + 1
M k * φ ( n ) + 1 ≡ M ( mod n)   

M e * d ≡ M ( mod n)
因为 M < n
所以, 得到最终公式
M e * d mod n = M         等式(8)

加解密过程

假设M为明文, C为密文, 加密过程为
C ≡ Me ( mod n )          加密公式

解密过程为
同余式幂运算 , 将加密公式, 两边都进行d次幂运行
Cd ≡ (Me)d ( mod n)

Cd ≡ Me * d ( mod n)

M = Cd mod n
总结:
用(e, n)将M加密成C, 用(d, n)将C解密成M.
(e, n)称之为公钥
(d, n)称之为私钥

实现过程

  1. 找到两个超级大的素数p, q, n = p * q
    如果p, q, n都比M大, 那么条件4,5,6都自然成立
    生成素数的方法是, 随机生成一个奇数, 然后通过素数检测公式 方法检查这个数字是否为素数, 直到找到素数为止

  2. 找到一个与(p-1) * (q-1)互质的数字d, 且足够大,
    一个简单的方法就是, 找一个比p, q都大, 且比n小的素数, 也是使用上一步的中的方法

  3. 通过p, q, n, d, 算出e, 使e * d ≡ 1 ( mod (p-1) * (q-1) )
    如果算不出e, 那么重新换个d, 再算.
    e * d ≡ 1 ( mod (p-1) * (q-1) ) 换个方式写, 就是
    e * d = k*(p-1)*(q-1) + 1

  4. 对M进行处理, 将M的若干个字节, 转换成一个大数, 再处理, 这样加密后的数据不会太长.

安全

由于n是两个素数p, q的乘积, 如果n过小, 那么容易被猜出, 失去安全意义
常说的2048bit的密钥, 是指n的二进制形式有2048个bit, 10进制形式有617的数字.

Java实现

p, q, n, d, e都是极大的数, 靠普通的加减乘除, 是无法实现. 我也不知道怎么实现.
java提供了BitInteger类, 可以实现上面的所有算术操作.
当然java也有现成的RSA算法库.
https://github.com/wzjwhut/rsa-theory

素数检测方法

米勒-拉宾素性检验法则(Miller–Rabin primality test)

根据费马小定理, 如果p为素数, 那么
a(p-1)≡1(mod p) 公式(1)
如果p为大于2的素数, 则p必为奇数, p-1必为偶数, p-1可以变形为
p-1 = 2s * d, (也就是把2提出来),
公式(1)可以变形为
a2s * d - 1 = k * p,
由于x2 -1可以分解为(x+1)(x-1), 因此, 公式(1)可以因式分解为
(a2s-1 * d + 1)(a2s-1 * d - 1) = k * p
上式中的(a2s-1 * d - 1)可以继续分解, 直至s-1为0
也就是
(a2s-1 * d + 1) a2s-2 * d + 1)(a2s-3 * d + 1) …(a d + 1)(a d - 1) = k * p
也就
a2r * d + 1 可以被 p整除, r为[0, s-1]之间的整数
a d - 1 也可以被 p 整除
写成同余式, 就是
a2r * d ≡ -1(mod p)
a d ≡ 1(mod p)

米勒-拉宾素性检验法则:
给定待测试定的整数p, 如果能找到一个整数a , 使其同时满足
a2r * d ≡/ -1(mod p)
a d ≡/ 1(mod p)
那么p肯定不是一个素数.
由于实际情况下, 不可能遍历所有a, 所以只能随机选取一些值来测试. 因此也有可能一些合数被判断为素数(伪素数)

猜你喜欢

转载自blog.csdn.net/wzj_whut/article/details/86070868