我正在从生成的文本文件“generated.txt”中读取64kb并将数据写入txt文件 在每个写入的txt文件的开头都有奇怪的数据,除了第一个写入的文件。
如果我使用:
with open('generated.txt', 'rb') as f:
而不是:
f = open('generated.txt', 'rb')
我在第一个文件中得到了相同的奇怪数据。
十六进制的原始文件的第二个64k块的开头:
0a31303935300d0a31303935310d0a31
“Strange”数据形成十六进制的第二个txt文件:
e7fadb0930588fb74d1aba3fd3bafc84
以十六进制开头的第二个文件加密:
bde07ad1e305193105655a42998a1fc9
不幸的是不一样
以下完整代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Crypto.Cipher import AES
from Crypto.Protocol.KDF import PBKDF2
from Crypto import Random
key_size = 32
iterations = 10000
key = 'password'
salt = Random.new().read(key_size)
iv = Random.new().read(AES.block_size)
derived_key = PBKDF2(key, salt, key_size, iterations)
cipher = AES.new(derived_key, AES.MODE_CFB, iv)
i = 1
f = open('generated.txt', 'rb')
while True:
data = f.read(65536)
if not data:
break
encodedtext = iv + cipher.encrypt(data)
decodedtext = str(cipher.decrypt(encodedtext))[16:]
print 'Writing ' + str(i)
g = open('LOG_' + str(i) + '.txt', 'wb')
g.write(decodedtext)
g.close()
d = open('LOG_' + str(i) + '_ENC.txt', 'wb')
d.write(encodedtext)
d.close()
i = i+1
f.close()
感谢您的帮助:)
答案 0 :(得分:0)
请确保您了解character-encoding和encoding。
字符编码定义了如果将其表示为字节的文本。有许多编码标准,但最常见的包括ASCII,Windows-1252,UTF-8和UTF-16。第一个是有限单个(7位)集,Windows-1252主要包含欧洲/拉丁字符,后两个是用于Unicode文本的编码。如果以错误的编码查看文件,那么它可能显示为无意义 - 但大多数文本编辑器现在可以很好地猜测文本编码。
请注意,在大多数编码中,并非所有字节(有时甚至是许多字节)都可以解释为文本。字节可能根本不代表字符,或者它可能编码(或编码部分)控制字符。可以通过将字节编码为文本来解决此问题。常见的编码使用十六进制。每个字节编码为两个字符,每个字符4位。这使程序员可以轻松查看字节的内容。另一方面,Base64并不易读,因为它将每个6位编码为一个字符。因此base 64是一种更有效的编码,但人类阅读并不容易。
如果您希望明文输入清晰可辨,请确保使用良好的字符编码。密文 - 尽管名称 - 由字节组成。如果要从中创建字符,请使用base 64。