我今天一直在研究rsa算法的概念,这就是我所理解的。
生成密钥对-
两个素数(例如p1=53,p2=59)相乘生成n
(将用作公共模)
我们在n
变量上使用euler函数,并定义一个新的变量phi
。
我们生成一个公共指数e
,条件是它必须是小奇数,而不是与我们的phi
变量共享因子。
私钥d
由以下公式生成:
或d = (k * (phi(n)) + 1) / e
。
我们用数字替换变量并获取私钥:
或d = (2 * (3016) + 1) / 3 = 2011
我们代替-k
带2
(据我所知k
必须大于0且小于phi(n)
)phi(n)
和3016
(因为p1 * p2 = 3127
和结果
是一个素数,我们很容易用p1
和p2
得到它的phi(phi(n) = (p1-1) * (p2-1)
)e
带3
的指数(因为它不与3016共享任何因子,并且是奇数)
使用公钥-
之后,我们可以共享我们的e
和n
,因为计算机需要几十年才能从bign
获取私钥。
我们的通信器将消息编码为十六进制,然后将其转换为base10整数通信器还可以添加随机整数填充以进行保护。
将消息转换为数字时,对其执行模幂运算:
[![在此处输入图像描述][3]][3]
因此,如果消息的数字是89,例如,如果我们对它进行模幂运算,我们将得到:
1394年
问题-
如果通信器向我们发送加密的1394
(89
),我们如何使用私钥自动解密此消息?有什么特别的公式必须使用吗?
非常感谢你的阅读。
最佳答案
给定:p = 53
,q = 59
,e = 3
。n
=p * q
=3127
。phi(n)
=(p-1) * (q-1)
=3016
。lambda
=LCM(p-1, q-1)
=1508
。dPhi
=ModInverse(e, phi(n))
=ModInverse(3, 3016)
=2011
。dLambda
=ModInverse(e, lambda)
=ModInverse(3, 1508)
=503
。
以及CRT参数(我们这里不使用)dp
=dLambda % (q - 1)
=503 % 58
=35
。dq
=dLambda % (p - 1)
=503 % 52
=39
。inverseQ
=ModInverse(q, p)
=ModInverse(59, 53)
=9
。
(https://en.wikipedia.org/wiki/Modular_multiplicative_inverse和https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm用于制作ModInverse
)
注意dLambda
小于dPhi
。虽然最初的RSA论文使用了基于phi
的模型,但后来它被简化为基于LCM的模型因为(p-1)
和(q-1)
都是偶数的(因为p
和q
都是素数!=2
)lambda
最终最多为phi / 2
,从而使逆矩阵的模空间更小。
因此,假设我们正在执行原始/未添加的rsa(因为这个密钥太小,无法用它填充rsa):
给定:m = 89
。c
=m^e % n
=89^3 % 3127
=704969 % 3127
=1394
>。m
=c^d % n
=1394^503 % 3127
=3.666e1581 % 3127
=???是的。
相反,我们转到https://en.wikipedia.org/wiki/Modular_exponentiation。m
=ModPow(1394, 503, 3127)
=>ModPow(1394, 0b0001_1111_0111, 3127)
:
R:1
,基:(1394%3127)=1394
,指数:0b0001_1111_0111
r:(1*1394)%3127=1394
,基:(1394*1394)%3127=1943236%3127=1369
,指数:0b0000_1111_1011
R:(1394*1369)%3127=1908386%3127=916
,基部:(1369*1369)%3127=1874161%3127=1088
,E:0b0111_1101
R:(916*1088)%3127=996608%3127=2222
,基部:(1088*1088)%3127=1183744%3127=1738
,E:0b0011_1110
R:2222
,基:(1738*1738)%3127=3020644%3127=3089
,E:0b0001_1111
R:(2222*3089)%3127=6863758%3127=3120
,基部:(3089*3089)%3127=9541921%3127=1444
,e:0b0000_1111
R:(3120*1444)%3127=4505280%3127=2400
,基:(1444*1444)%3127=2085136%3127=2554
,e:0b0111
R:(2400*2554)%3127=6129600%3127=680
,基部:(2554*2554)%3127=6522916%3127=3121,E:0b0011
R:(680*3121)%3127=2122280%3127=2174
,基部:(3121*3121)%3127=9740641%3127=36
,E:0b0001
R:(2174*36)%3127=78264%3127=89
,基部:(36*36)%3127=1296%3127=1296
,E:0b0000
右:89