python中二进制文件的异或加密

2024-06-16 17:13:44 发布

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

我试图用python编写一个简单的加密脚本。我只想对二进制文件使用异或加密。 我的剧本基本上是这样的:

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

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

谢谢


Tags: 文件in脚本foroutput字节defcontents
2条回答

(对不起,我一开始误读了这个问题)

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

v = bytearray()

我没有工具来验证。

如果您只想执行异或,那么如果使用bytearray,则不需要chr()ord()

事实上,你的功能就变成了一条直线

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

这是双异或后的输出: output

注意,在某些地方“'”被转换成iaj。这是可能与一个普通的双异或。

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

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*

相关问题 更多 >