2012-01-16 26 views
1

我有两个数字,pq。我知道我可以得到phi = (p-1)*(q-1)ed = 1 (mod phi) ...但我不确定我是否明白这意味着什么。以编程方式从`p`和`q`生成'd`(RSA)

我写了一些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

+0

'(1 mode phi)'?这是无效的Python - 你的意思是'(1%phi)'? – jsbueno 2012-01-16 17:49:01

+0

@jsbueno我的道歉,是的。我输错了。 – tekknolagi 2012-01-16 17:50:16

+0

@tekknolagi:你可以随时编辑你的问题。 :) – voithos 2012-01-16 17:50:55

回答

5

你数学的认识是错误的。等式

≡ 1(MOD φ

意味着,在数除以剩余φ等于1,即在Python方面,

>>> (e*d) % phi 
1 

举例来说,如果φ =(7 - 1)(11 - 1)= 60,和ē = 17,那么如果我们选择d = 53,那么我们会得到

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

我们称之为de的模乘可逆。

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

+0

所以如果我理解这一点,那么我必须找到'gcd(e,phi)',对吧? – tekknolagi 2012-01-16 18:10:41

+0

@tekknolagi:对。 – kennytm 2012-01-16 18:12:23

+0

谢谢!会尝试。 – tekknolagi 2012-01-16 18:29:35

-1

,因为你被一个浮点数除以它返回一个十进制

float(e) 

你可以得到被转换成整数的最终数目包裹整个计算在这样的int()函数:

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

这将是'0',因为'1%big_number == 1'然后'int(1/other number)== 0' – tekknolagi 2012-01-16 17:52:42

0

由于在分割的dnominator被浮子,Python将总是推动分割为浮点的结果。

如果你想明确地把结果作为一个整数,不要促使任何操作符浮动,而是使用“//”操作符 - 它将以“未来兼容”的方式防止自动转换除法结果为浮点数。

d = (1 % phi)// e