在python中对二进制文件进行Xor加密

时间:2013-04-16 06:56:25

标签: python python-2.7 binary xor

我正在尝试在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)))

但执行后,fileoutput两个文件不同。 由于输入文件是二进制文件(我想要的),我已将脚本更改为:

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,但这也不起作用。

有什么建议吗?言论?提示?

由于

2 个答案:

答案 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')

您的示例中存在错误。这是输入: input image

这是双xor之后的输出: output

请注意,在某些地方,“'”会转换为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)

(抱歉,我最初误读了这个问题)

我认为问题可能出在v初始化:v不应该是string,而是bytearray

v = bytearray()

我没有在这里验证的工具。