【问题标题】:How is c (encrypted message) decrypted by private key in RSA?RSA中的私钥如何解密c(加密消息)?
【发布时间】:2018-02-13 18:12:15
【问题描述】:

我今天一直在研究RSA算法的概念,我是这么理解的。

生成密钥对 -

  • 两个素数(例如 p1 = 53,p2 = 59)相乘以生成 n(将用作公共模数)
  • 我们在 n 变量上使用 Euler 的 totient 函数并定义一个新变量 phi
  • 我们生成一个公共指数e,条件是它必须是小的奇数,不与我们的phi 变量共享因子。
  • 私钥d是从这个公式生成的:

    d = (k * (phi(n)) + 1) / e

  • 我们用数字替换变量并得到私钥:

    d = (2 * (3016) + 1) / 3 = 2011

    我们替代 -

  • k2(据我所知,k 必须大于 0 且小于 phi(n)

  • phi(n)3016(因为 p1 * p2 = 3127 和因为结果 是一个素数,我们很容易使用p1p2 得到它的phi。 (phi(n) = (p1-1) * (p2-1))

  • e3 的指数(因为它与 3016 不共享任何因数,并且是奇数)

使用公钥 -

之后我们可以分享我们的en,因为计算机需要几十年才能从大n 获取私钥。

我们的通信器将消息编码为十六进制,然后将其转换为 base10 整数。 Communicator 还可以添加随机整数填充以进行保护。

当消息转化为数字时,对其进行模幂运算:

[![在此处输入图片描述][3]][3]

例如,如果数字中的消息是 89,如果我们对其进行模幂运算,我们将得到:

1394

问题 -

如果我们的通讯器向我们发送1394,它是加密的89 (89^3 * mod(59 * 53) = 1394),我们如何使用我们的私钥自动解密此消息?是否有一些必须使用的特定公式?

非常感谢您的阅读。

【问题讨论】:

  • crypto.stackexchange.com 可能更适合您的问题。
  • 加密后的值是 916,而不是 89。1394 ^ 3 % 3127。
  • 啊。我将“1394 加密为 89”解释为“1394 加密为 89”。
  • 这是指数,但我当然不能在没有 BigInteger 类的情况下使用1394 ^ 2011,因为 64 位不足以容纳它。

标签: algorithm math encryption rsa


【解决方案1】:

给定:p = 53q = 59e = 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_inversehttps://en.wikipedia.org/wiki/Extended_Euclidean_algorithm被用于ModInverse的制作)

请注意,dLambda 小于 dPhi。虽然最初的 RSA 论文使用基于 phi 的模型,但后来它被简化为基于 LCM 的模型。由于(p-1)(q-1) 都是偶数(因为pq 是素数!= 2lambda 最终最多为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

【讨论】:

  • 非常感谢!我肯定需要更多地研究乘法逆
猜你喜欢
  • 1970-01-01
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 2021-01-08
相关资源
最近更新 更多