底部的所有新代码,我在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