按密钥流执行异或时出现数组错误

2024-09-28 17:05:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试异或文件(编码_数据.bin)使用密钥流(键.bin)并不断得到一个错误“数组索引超出范围”。密钥文件比数据文件长。感谢任何帮助。我对python还是个新手-如果还不明显的话。在

import array
k=open("key.bin", "rb")
s=open("encoded_data.bin", "rb")
t=k.read()
r=s.read()
a1 = array.array('B', (t))
a2 = array.array('B', (r))
for i in range(len(a1)):
   a1[i] ^= a2[i]

   print a1.tostring()

   k.close
   s.close

Tags: 文件数据a2编码closereadbina1
3条回答

实际上,您可以使用内置的zip函数。它允许您一次循环两个iterable,这适合您的情况。在

plaintext = []
for key_byte, ciphertext_byte in zip(a1, a2):
    plaintext.append(chr(ord(key_byte) ^ ord(ciphertext_byte)))

print ''.join(plaintext)

如果密文中有多余的字节,它们将被消除。如果密钥中有额外的字节,则不会使用它们。在


我认为你是在实施一次性垫款。我建议您在此处使用^{}s

^{pr2}$

发生这种情况是因为密钥文件较长,如您所说,并且您正在针对密钥文件中的每个字节循环:

for i in range(len(a1)):
    a1[i] ^= a2[i]

一旦i等于len(a2),当您试图获取a2[i]时,您将得到这个异常,因为i超出了数组的边界。在

根据您的问题,不清楚正确的解决方案是什么,但如果您知道数据总是小于键,请使用数据的长度来代替:

^{pr2}$

如果您的目标是在数据大于键的情况下重复键,那么解决方案将涉及更多内容。在

这样的解决方案在您的情况下是有效的,如果您的数据长于您的密钥(当然,这是一个重要的密码不!)公司名称:

def xorloop(l, xors):
    return [l[i] ^ xors[i % len(xors)] for i in xrange(len(l))]

它采用可调整的异或值,如下所示:

^{pr2}$

您可以很容易地使用array将其应用于字符串,就像您在示例中所做的那样。在

相关问题 更多 >