2013-09-16 20 views
0

對於加密類,我試圖通過將明文計算爲pow(密文,1/e)來實現「小e攻擊」。小浮點值的RSA攻擊

當結果是一個整數時,我做了它,但是當我得到一個浮點數時,我不知道如何將該結果轉換爲表示我的明文的字符串。

e1 = 3 
n1 = 131776503472993446247578652375782286463851826883886018427615607890323792437218636575447994626809806013420405963813337101556738852432247872506699457038044621191649758706817663135648397013226104530751563478671698441687437700125203966101608457556637550910814187779205610883544935666685906870199595346450733709263 
cipher1 = '\x04\xacq#E/\xf4X\x126\xef\xc6\xb1\xfc\x10p*\x98P\xde\x089K\x16y0\xfa\xde\x9f\x05\x15+\xa3\x0f\xbc3\xd1t\xe7\x9a\x1b\x04m\xa1\x12\x96\x18Y\xf9\xc95\xce\x19 E\xfa\xe1\xb5\x8a\xd5\xf2\x99\xa6"<\xcb\x1a\xd0\xce=\x91\xfbw\t\xb5' 

我可以cipher1轉換爲位,然後爲一個整數(稱之爲cipher1_int),所以我可以運行

M1 = POW(cipher1_int,1。/ E1)

,其結果是

4.23125987157e+59 <type 'float'> 

有人能幫助我嗎?

+0

我不明白的問題一個int。你期望什麼輸出? float值的十六進制表示是否意味着包含解密明文的ASCII明文? '4.23125987157e + 59'變成'0x7F800000',這似乎不是很有用(它基本上是「無窮大」)。 – Tawnos

+1

加密計算通常使用整數和模算術完成。例如,1/2 = 3(模5)。由於3 * 2 = 6 = 1(mod 5) – Ben

回答

2

這些計算需要使用模運算來完成,更具體地說是mod n1。獲得一個表示明文的整數...

  1. 計算整數1/e1 mod n1。 (查找計算modular inverses
  2. 計算整數pow(cipher1, 1/e1 mod n1) mod n1(查找modular exponents

這會給你,你可以轉換成明文

+0

讀者注意:在這個答案中,'1/e1 mod n1'不是經典的「一分爲一」。它是「某個整數x,使得x * e1與1模n1一致」。 (粗略地說,如果n1除以相同的餘數,那麼兩個數是n1相等的餘數)。具有這個性質的'x'的作用與'e1'的乘法相反,因爲對於任何相對較小的整數't'素數到'n1','t * e1 * x'與't'模「n1一致」。但是你不能使用經典的劃分來找到'x'。 –

+0

@EricPostpischil絕對正確! – Ben