【问题标题】:programmatically generate `d` from `p` and `q` (RSA)以编程方式从“p”和“q”(RSA)生成“d”
【发布时间】:2012-01-16 17:45:36
【问题描述】:

我有两个号码,pq。我知道我可以得到 phi = (p-1)*(q-1)ed = 1 (mod phi)... 但我不确定我明白这意味着什么。

我写了一些 Python:

p = NUM
q = NUM
e = NUM
phi = (p-1)*(q-1)
d = (1 % phi)/float(e)

但我总是得到一个小数,d 应该是一个整数。我做错了什么?

编辑:我可能只是不了解 RSA。现在,我正在看这个页面:http://www.di-mgt.com.au/rsa_alg.html

【问题讨论】:

  • (1 mode phi) ?这不是有效的 Python - 你的意思是 (1 % phi) 吗?
  • @jsbueno 我很抱歉,是的。我打错了。
  • @tekknolagi:您可以随时编辑您的问题。 :)

标签: python encryption rsa public-key-encryption


【解决方案1】:

你对数学的理解是错误的。方程

ed ≡ 1 (mod φ)

表示数字ed除以φ的余数等于1,即在Python中,

>>> (e*d) % phi
1

例如,如果φ = (7 - 1)(11 - 1) = 60,并且e = 17,那么如果我们选择d = 53,那么我们会得到

>>> e = 17
>>> d = 53
>>> phi = 60
>>> (e*d) % phi
1

我们称​​de的模乘逆。

为了从eφ生成d,通常使用扩展欧几里得算法。请阅读http://en.wikipedia.org/wiki/Modular_multiplicative_inversehttps://stackoverflow.com/search?q=python+%22multiplicative+inverse%22&submit=search 了解更多信息

【讨论】:

  • 所以如果我理解这一点,那么我必须找到gcd(e, phi),对吧?
  • 我收到1L - 这是什么意思?
  • @tekknolagi:值为 1 的长整数。(您可以发布一个新问题。)
  • @GregS pow 的第三个参数是什么?
  • 我之前的评论是错误的(现已删除)。如果您使用欧几里得算法,您只会得到 1L。错误的算法。您需要使用extended euclidean algorithm
【解决方案2】:

由于除法的分母是浮点数,Python 将始终将除法的结果提升为浮点数。

如果您想明确地将结果作为整数,请不要将任何运算符提升为浮点数,而是使用“//”运算符 - 它以“未来兼容”的方式防止自动转换除法结果为浮点数。

d = (1 % phi)// e

【讨论】:

    【解决方案3】:

    它返回一个小数,因为你除以一个浮点数

    float(e)
    

    您可以通过将整个计算包装在 int() 函数中来将最终数字转换为整数,如下所示:

    d = int( (1 mod phi)/float(e) )
    

    【讨论】:

    • 那将是0,因为1 % big_number == 1 然后是int(1/other number) == 0
    猜你喜欢
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 2023-03-15
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多