2

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

确保最后一个字符始终是 a\0但这也不起作用。

有什么建议么 ?评论 ?提示 ?

谢谢

4

2 回答 2

2

如果你只想做异或,你不需要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')

你的例子有问题。这是输入: 输入图像

这是双异或后的输出: 输出

请注意,在某些地方,“'”会转换为 ani a j。这对于普通的双异或是不可能的

你确定你使用了我上面提供的代码吗?因为如果我在二进制文件上运行它,两次异或数据等于原始数据:

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*
于 2013-04-16T08:35:17.443 回答
1

(对不起,我一开始看错了问题)

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

v = bytearray()

我没有工具可以在这里验证。

于 2013-04-16T06:58:56.670 回答