学习来源:B站up:DoraHcaks
学习路径:密码学7.1|RSA非对称密码算法_哔哩哔哩_bilibili
假设正整数a≥b,求a和b的最大公因数gcd(a, b) = ?
(1)如果a mod b = 0, 即余数 r = 0,则gcd(a, b) = b
(2)否则,令 r = a mod b,gcd(a, b) = gcd(b, r),递归直至 r = 0,满足情况(1)
举例:a = 254, b = 8
254 = 8 * 31 + 6,r = 6 ≠ 0 => gcd(254, 8) = gcd(8, 6)
8 = 6 * 1 + 2, r = 2 ≠ 0 => gcd(8, 6) = gcd(6, 2)
6 = 2 * 3, r = 0 = 0 => gcd(254, 8) = gcd(8, 6) = gcd(6, 2) = 2
已知大合数a,求小于a的大素数b,使得a与b互素,即gcd(a, b) = 1。
该问题能够使用欧几里得辗转相除法快速求解。
随机选择一个大素数b,如果即gcd(a, b) ≠ b,则gcd(a, b) = 1
因此,这样的大素数有很多,且很容易找。
大数的因子分解问题,非常困难!
初始化:随机选择2个不同的大素数p, q,计算n = p * q。
公开 n,求p, q
举例1:素数p = 5,q = 7,计算n = p * q = 35.
已知:n = 35,求p, q
答:暴力搜索,令p, q = 2, 3 ....
举例2:保密数据p, q,公开数据n
公开 n = 8239121061250502943937 = p * q
for(i >= 2 && i <= √n) {
for(j >= 2 && j <= √n) {
if (8239121061250502943937 == i * j) {
System.out.println(i, j);
}
}
}
如果是2048bit的大整数,n = - 110 + 1,则计算机需要100年以上时间破解。不可行。
因子分解是NP问题:求解时,需要for循环,暴力搜索,需要指数时间;但是,一旦已知解,则可以快速验证解的正确性。
若p为素数,a是正整数且不能被p整除,互素(互质),则
注:证明视频里有,如果有需要可以去视频学习,这里省去
举例3:p = 7, a = 3,3不能被7整除,根据费马小定理
公式推导:
举例4:p = 11, a = 5,5不能被11整除,根据费马小定理
公式推导:
小于n,且与n互素的正整数个数,记为,习惯上
结论:如果n是素数,则
推论:如果有两个素数p, q,且p ≠ q,对于n = p * q,有,则
费马小定理: 若p为素数,a是正整数且不能被p整除,互素(互质),则
欧拉定理:对任意互素的a和n,则有
欧拉定理中,n可以是合数,a是素数,或a与n互素也可以。
因此,欧拉定理是费马小定理的扩展或一般化。
举例5:n = 7, a = 3,互素,则
一般化:
再一般化:
关键结论:指数部分超过,则是多余的,所以指数部分能够模
举例6:n = 7, a = 3,互素,计算、
欧拉定理:对任意互素的a和n,则有
欧拉定理扩展:
如果大素数a和大合数π,a与π互素,则一定可以找到整数b,使得,则称b是a的模反元素。
证明:使用欧拉定理
,则
,则
,则
符号替换:
a = sk,b = pk,π = 。为大合数,sk为大素数,使用欧几里得辗转相除法,可以快速测试sk与大合数互素。如果不是互素就换一个sk,总能找到一个符合的sk。
模反元素存在性的等价描述:
如果大素数sk和大合数互素,则一定可以找到整数pk,使得
,则称pk是sk的模反元素,则
已知p, q,n = p * q,,将合数(p-1)(q-1)因子分解,
求 比较简单
因此,已知大素数sk和大合数互素,可以快速求出
反之,已知pk和n,不知道因子分解p, q,则无法快速求,从而无法快速计算sk
无法快速计算的理由:是一个等式,2个未知数和sk
转化等价:<=> <=>
选择随机数m,计算:
(1) 选择两大素数p和q,为了获取最高的安全性,设两数的长度一样
(2) 计算 n = p * q,n 称为模
(3) 计算欧拉函数:
(4) 选取加密密钥e,其与互素。如果选择的e值合适,RSA加解密的速度将会加快。e的值常为3、17和65537()
(5) 使用扩展欧几里得算法求出e模的逆元d,即
(6) 密钥为 e 和 n,私钥为 d和n,p, q可以丢弃,但是必须保密
(7) 加密消息m时,将其看成一个大整数,并把它分成比n小的数据分组,按下面的式子进行加密:
(8) 解密密文c时,取每一个加密后的分组并计算,即:
已知:Alice拥有公开数据是:pk公钥;保密数据是:sk私钥。
需求:Bob需要将保密数据m发送给Alice。
解决方案:
步骤1:公钥对数据加密。Bob加密C←,将C发送给Alice
步骤2:私钥对数据解密。接收方Alice解密m←,从C中计算出保密数据m
公式推导:
已知:Alice拥有公开数据是:pk公钥;保密数据是:sk私钥。
需求:Alice需要花费金额m。
解决方案:
步骤1:Alice签名。公开
步骤2:任何人均可校验。
公式推导:
举例7:选择两个素数p = 17, q = 11,计算 n = p * q = 17 * 11 = 187
计算欧拉函数 = 16 * 10 = 160
选择一个随机数e,e小于,且与互素,
选择e = 7满足条件,计算模反元素d,满足,且d小于
则模反元素d = 23。因为23 * 7 = 161 mod (160) = 1
公钥为:(e, n) = (7, 187);私钥为:(d, n) = (23, 187)
私钥为:(e, n) = (7, 187);公钥为:(d, n) = (23, 187)
对于任意一个消息m = 88的RSA加密:
加密:
解密:
计算过程:
对该消息m = 88的RSA签名:
签名:
验证: