我正在尝试在python中执行一个简单的加密脚本。我只想对二进制文件使用XOR加密。 我的脚本基本上看起来像:
def xor_c ( a ):
v=''
for p in a:
v += chr((ord(p) ^ 0xA8))
return v
这样做的目的只是单独加密每个字节。 这应该有效,但所有尝试都失败了。
我首先尝试过:
handler = open("file",'r')
handler2 = open("output",'w')
contents = handler.read()
handler2.write(xor_c(xor_c(contents)))
但执行后,file
和output
两个文件不同。
由于输入文件是二进制文件(我想要的),我已将脚本更改为:
handler = open("file",'rb')
handler2 = open("output",'wb')
contents = handler.read()
handler2.write(xor_c(xor_c(contents)))
但这并没有改变任何东西。
从它的外观来看,一些字节对在输出中仅在一个字节中被转换(可能因为字符不是ascii,但这不应该在二进制模式下发生......)。此外,输出的最后一个字节是0xA8
(逻辑上来自输入文件末尾的\0
的转换。考虑到这一点,我还将xor_c
函数更改为:
def xor_c ( a ):
v=''
for p in a:
v += chr((ord(p) ^ 0xA8))
return v[:-1]+'\0'
要确保最后一个字符始终为\0
,但这也不起作用。
有什么建议吗?言论?提示?
由于
答案 0 :(得分:2)
如果你只想做xor,如果你使用chr()
,则不需要ord()
和bytearray
。
事实上,你的功能变成了一个单行;
def xor_c(a):
return bytearray([b^0xA8 for b in bytearray(a)])
它工作正常
In [4]: xor_c('Test')
Out[4]: bytearray(b'\xfc\xcd\xdb\xdc')
In [5]: r1 = xor_c('Test')
In [6]: r2 = xor_c(r1)
In [7]: r2
Out[7]: bytearray(b'Test')
您的示例中存在错误。这是输入:
这是双xor之后的输出:
请注意,在某些地方,“'”会转换为i
或 a j
。使用普通的双xor,不是可能的。
您确定使用过我上面提供的代码吗?因为如果我在二进制文件上运行它,则两次xor-ed数据等于原始数据:
In [1]: def xor_c(a, c=0xA8):
...: return bytearray([b^c for b in bytearray(a)])
...:
In [2]: with open('foo.gz', 'rb') as inf:
data = inf.read()
...:
In [3]: data2 = xor_c(xor_c(data))
In [4]: cmp(data, data2)
Out[4]: 0
当我将数据写入磁盘并进行比较时,文件也是相同的:
In [5]: with open('foo2.gz', 'wb') as outf:
outf.write(data2)
...:
> ll foo*
-rw-r--r-- 1 rsmith rsmith - 4049792 Apr 16 13:15 foo2.gz
-rw-r--r-- 1 rsmith rsmith - 4049792 Apr 16 12:39 foo.gz
> diff foo*
答案 1 :(得分:1)