Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python 3对文件进行Xor加密/解密_Python_Python 3.x_Encryption_Xor - Fatal编程技术网

使用Python 3对文件进行Xor加密/解密

使用Python 3对文件进行Xor加密/解密,python,python-3.x,encryption,xor,Python,Python 3.x,Encryption,Xor,我需要使用Python3的xor对文件进行加密/解密,我有一个在Python2中运行良好的代码,但是在尝试将其改编为Python3时,给了我一些无法解决的错误 这段代码在Python 2.7中运行良好: from itertools import cycle def xore(data, key): return ''.join(chr(ord(a) ^ ord(b)) for (a, b) in zip(data, cycle(key))) with open('inputfil

我需要使用Python3的xor对文件进行加密/解密,我有一个在Python2中运行良好的代码,但是在尝试将其改编为Python3时,给了我一些无法解决的错误

这段代码在Python 2.7中运行良好:

from itertools import cycle


def xore(data, key):
    return ''.join(chr(ord(a) ^ ord(b)) for (a, b) in zip(data, cycle(key)))

with open('inputfile.jpg', 'rb') as encry, open('outputfile.jpg', 'wb') as decry:
    decry.write(xore(encry.read(), 'anykey'))
在python 3中尝试不加更改地运行时出错:

Traceback (most recent call last):
  File "ask.py", line 8, in <module>
    decry.write(xore(encry.read(), 'anykey'))
  File "ask.py", line 5, in xore
    return ''.join(chr(ord(a) ^ ord(b)) for (a, b) in zip(data, cycle(key)))
  File "ask.py", line 5, in <genexpr>
    return ''.join(chr(ord(a) ^ ord(b)) for (a, b) in zip(data, cycle(key)))
TypeError: ord() expected string of length 1, but int found
回溯(最近一次呼叫最后一次):
文件“ask.py”,第8行,在
decry.write(xore(encry.read(),'anykey'))
文件“ask.py”,第5行,在xore中
返回“”。在zip(数据,循环(键))中为(a,b)加入(chr(ord(a)^ord(b))
文件“ask.py”,第5行,在
返回“”。在zip(数据,循环(键))中为(a,b)加入(chr(ord(a)^ord(b))
TypeError:ord()应为长度为1的字符串,但找到int

如果有人能解释并帮助我将此代码改编为Python 3,请回答。

a
已经是
int
,因此您需要删除对
ord(a)
的调用:

如果没有
.encode(“utf-8”)
,您将无法将连接的字符串写入输出文件,因为该文件将不会提供任何可用的输出,因此无法确定您实际要实现的目标

您可以看到,在python3中为字节字符串编制索引时,会得到一个int:

n [1]: s = b"foo"

In [2]: s[0]
Out[2]: 102  # f
在python2中,您可以得到str/char:

In [1]: s = b"foo"
In [2]: s[0]
Out[2]: 'f'
迭代或调用next也会得到整数值:

In [12]: it = iter(s)   
In [13]: next(it)
Out[13]: 102
In [14]: for ele in s:
         print(ele)
   ....:     
102
111
111
在python2中,您只需获得每个字符。因此,在您的代码中,当您迭代从
encry.read()
返回的bytes对象时,您将获得整数值,因此
ord(some_int)
显然失败

有一个详尽的解释解释了python2和python3之间的区别,其中一个片段是:

作为这种二分法的一部分,您还需要小心打开文件。除非您一直在Windows上工作,否则在打开二进制文件(例如,用于二进制读取的rb)时,您可能并不总是费心添加b模式。 在Python3下,二进制文件和文本文件明显不同,互不兼容;有关详细信息,请参阅io模块。因此,您必须决定文件是用于二进制访问(允许读取和/或写入二进制数据)还是用于文本访问(允许读取和/或写入文本数据)。您还应该使用io.open()来打开文件,而不是使用内置的open()函数,因为从Python 2到Python 3,io模块是一致的,而内置的open()函数不是一致的(在Python 3中,它实际上是io.open()

str和bytes的构造函数对于python2和pytho3之间的相同参数具有不同的语义。在Python2中,将整数传递给字节将得到整数的字符串表示形式:
bytes(3)='3'
。但是在Python3中,bytes的整数参数将为您提供一个bytes对象,长度与指定的整数相同,并用空字节填充:
bytes(3)==b'\x00\x00\x00'
。在将bytes对象传递给str时,同样需要担心。在python2中,您只需返回bytes对象:
str(b'3')==b'3'
。但是在Python3中,您可以得到bytes对象的字符串表示:
str(b'3')==“b'3'”

最后,二进制数据的索引需要小心处理(切片不需要任何特殊处理)在Python 2中,
b'123'[1]==b'2'
而在Python 3中,
b'123'[1]==50
。因为二进制数据只是二进制数的集合,所以Python3返回索引字节的整数值。但是在Python 2中,由于bytes==str,索引返回一个一项字节片。
six项目有一个名为six.indexbytes()的函数,该函数将返回一个与Python 3类似的整数:six.indexbytes(b'123',1)


尝试此操作-
return'。在zip(数据,循环(键))中为(a,b)加入(chr(ord(str(a))^ord(str(b))
您正在使用
b
打开文件,因此
a
每次都是int,
”。在zip(数据,循环(键))中为(a,b)加入(chr(a^ord(b))
如果它们已经是int,您就不能删除对
ord
的调用吗?
In [12]: it = iter(s)   
In [13]: next(it)
Out[13]: 102
In [14]: for ele in s:
         print(ele)
   ....:     
102
111
111