【问题标题】:Using Extended Euclidean Algorithm to create RSA private key使用扩展欧几里得算法创建 RSA 私钥
【发布时间】:2013-09-27 05:23:17
【问题描述】:

这是我在学校做的一项作业。我无法生成私钥。我的主要问题是理解我的方程之间的关系。要设置所有内容,我们有:

p = 61
q = 53
n = p * q (which equals 3233)

从这里我们有n的总和(phi(n))等于3120,现在我们可以选择素数e;其中 1

e = 17

好吧,很简单。

对于我的任务,我们已经知道d = 2753,但是我仍然需要能够任意生成这个值。

现在我遇到了麻烦。我一直在阅读维基百科以了解某些地方没有联系。我知道我需要找到e (mod phi(n)) 中的modular multiplicative inverse,这将是我们的私有指数d

阅读维基百科告诉我们找到我们需要使用Extended Euclidian Algorithm的mmi。我在python中实现了如下算法:

def egcd(a, b):
    x, lastX = 0, 1
    y, lastY = 1, 0
    while (b != 0):
        q = a // b
        a, b = b, a % b
        x, lastX = lastX - q * x, x
        y, lastY = lastY - q * y, y
    return (lastX, lastY)

这就是我迷路的地方。据我所知,等式ax + bx = gcd(a, b) = 1e*x + phi(n)*y = gcd(e, phi(n)) = 1 相同。 所以我们调用egcd(e, phi(n)),现在我的x 和y 得到[-367, 2]

从这里我真的不知道该去哪里。我已经阅读了this similar question 并且我看到发生了一些替换,但我不明白这些数字与我得到的答案或我开始使用的值有什么关系。有人可以务实地向我解释我需要从这里做什么吗? (当我务实地说,我的意思是没有实际代码。伪代码很好,但如果我得到实际代码,我将无法在没有抄袭作业的情况下学习,这是一个很大的禁忌)。

与往常一样,我们真诚地感谢您的任何帮助。谢谢大家!

(是的,我见过这些:RSA: Private key calculation with Extended Euclidean AlgorithmIn RSA encryption, how do I find d, given p, q, e and c?

【问题讨论】:

  • -367 和 2753 是同一个数字(mod 3120)。
  • 天哪。你一定是在开玩笑吧。几个小时以来,我一直在玩弄几十种不同的组合,但没有成功。我不知道我没有想到那个,谢谢一百万!
  • 要记住的一点是,在大多数编程语言中,% 不是取模函数,而是 remainder 函数。差别不大,但如果你最终得到一个负整数而不是正整数,那会很有趣。
  • 哦,真的吗?这绝对有帮助。在尝试其他几个示例时,我得到了一些不一致的结果,我不知道为什么(我仍在查看我的代码,看看我是否在某个地方搞砸了,这很有可能。)。对于这些意图和目的,有没有比使用 % 运算符更正确的方法来在 python3 中找到数字的 mod?

标签: python algorithm encryption rsa modular-arithmetic


【解决方案1】:

您所拥有的扩展欧几里得算法的实现并不完整,因为它正在为私钥生成一个负数。请改用此代码:

https://en.wikibooks.org/wiki/Algorithm_Implementation/Mathematics/Extended_Euclidean_algorithm

对于您的示例,私钥 d 是 2753。

p=61
q=53
n = 3233
phi(n)=3120
e=17
d=modinv(17,3120)=2753

试试看:

message m m=65


encryption: m^e mod n = c    (65**17) % 3120 =  65
decryption: c^d mod n = m      (65**2753) % 3120 =   65

这里都有解释:

http://southernpacificreview.com/2014/01/06/rsa-key-generation-example/

【讨论】:

    【解决方案2】:
    def egcd(a,b):   
        s1, s2 = 1, 0   
        t1, t2 = 0, 1   
        while b!=0:   
            q = a//b    
            r = a%b   
            a, b = b, r     
            s = s1-q*s2    
            s1, s2 = s2, s      
            t = t1-q*t2    
            t1, t2 = t2, t    
        return (s1, t1)
    

    试试上面的比较。

    我会告诉你你的错误在哪里:

    a, b = b, a % b

    a 现在具有 b 的值 (b=a%b)==(b=b%b)
    以及进行两行的类似原因

    【讨论】:

      猜你喜欢
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-01
      • 2021-07-26
      • 1970-01-01
      相关资源
      最近更新 更多