RSA算法解密麻烦

时间:2014-10-26 04:44:06

标签: python-3.x encryption cryptography rsa

底部的所有新代码,我在python中重新完成了赋值,但我仍然遇到溢出错误。我使用了在我们的赋值中给出的代码部分,它们似乎工作正常,但是当我通过标准公式[message = decode number ^ private key mod(public key)]解密私钥(变量d)时,或者就以下变量而言,message = pow(decoded, d) % n。有没有办法解决我遇到的溢出问题?我认为真正的加密是在python中发生的,它涉及更大的密钥,那么可以做些什么呢?

作业(完整版):

  

我们已经帮助您解密从Bob发送给他的同事Irene的拦截消息。我们知道Irene的公共RSA密钥是(n = 111851429,e = 73997)。我们过去在这两者之间破解的编码消息使用了非常规方案,我们期望在这里使用相同的方案。没有使用随机填充。每行都在末尾填充,直到其长度是明文块大小的整数倍,然后加密。

     

通常的明文块大小是4个字符,它们总是映射到5个字符的密文块,所以有时在解密块的开头有空格你必须丢弃。它们使用ASCII字母数字字符加密,这样空格(ASCII代码032)映射到0,“!” (ASCII代码033)映射到1,依此类推,通过“〜”(ASCII代码126)映射到94.大多数编程语言实现了将字符映射到其ASCII代码的功能。在VBA中它是Asc()。在Python中它是ord()。

     

要映射的相应函数是Chr()和chr()。因此,要编码和解码块,您可以使用以下代码(在Python中,可以使用您使用的任何编程语言重写):

from math import *
BLOCK_SIZE = 4

def block_encode(x):
    output = 0
    j = len(x)
    for i in range(j):
        k = ord(x[i]) - 32
        output = output + k*pow(95,j-i-1)
    return int(output)

def block_decode(x):
    output = ""
    i = BLOCK_SIZE+1
    while i > 0:
       b1 = int(pow(95,i-1))
       y = int(x/b1)
       i = i - 1
       x = x - y*b1
       output = output + chr(y+32)
    return output
  

您的程序可以直接计算n并恢复明文,或者使用猜测方案来尝试各种d值,直到它恢复隐藏的消息。

     

“the”这个词很可能出现在明文的第一行,所以如果你用暴力攻击密文,你就可以丢弃任何不包含“the”的解决方案。至少解密消息的第一行,以便我们可以告诉代码说的是什么。

编码消息的第一行是:(带有前导空格字符)

FWfk ?0oQ!#|eO Wgny 1>a^ 80*^!(l{4! 3lL qj'b!.9#'!/s2_

我的新程序,这次用python编写:

from math import *

BLOCK_SIZE = 4
message = list(" FWfk ?0oQ!#|eO Wgny 1>a^ 80*^!(l{4! 3lL qj'b!.9#'!/s2_")

n = 111851429 #given in problem
p = 5689; #prime of n
q = 19661 #prime of n
e = 73997 #given in problem
z = 111826080 # (q-1)*(p-1)
d = 59107013 # found by (d*e)%z = 1

##########################################

def block_encode(x):
    output = 0
    j = len(x)
    for i in range(j):
        k = ord(x[i]) - 32
        output = output + k*pow(95,j-i-1)
    return int(output)

def block_decode(x):
    output = ""
    i = BLOCK_SIZE+1
    while i > 0:
       b1 = int(pow(95,i-1))
       y = int(x/b1)
       i = i - 1
       x = x - y*b1
       output = output + chr(y+32)
    return output

##########################################

print("Encoded Message: ")
for i in message:
    print(i, end=' ')

print()

i = 0
j = BLOCK_SIZE+1
block = ''

while i< len(message):
    block = ''
    for k in range(i,j):
        block = block+ message[k]
    decoded = block_encode(block)
    decoded = (pow(decoded,d))%n    #This is where it overflows
    print(decoded)
    i = i + BLOCK_SIZE + 1
    j = j + BLOCK_SIZE + 1

0 个答案:

没有答案