Python pycrypto AES文件块加密失败

时间:2013-11-21 19:01:45

标签: python encryption io aes pycrypto

我正在从生成的文本文件“generated.txt”中读取64kb并将数据写入txt文件 在每个写入的txt文件的开头都有奇怪的数据,除了第一个写入的文件。

The generated test file

Script to generate the file

如果我使用:

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()

感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

请确保您了解

字符编码定义了如果将其表示为字节的文本。有许多编码标准,但最常见的包括ASCII,Windows-1252,UTF-8和UTF-16。第一个是有限单个(7位)集,Windows-1252主要包含欧洲/拉丁字符,后两个是用于Unicode文本的编码。如果以错误的编码查看文件,那么它可能显示为无意义 - 但大多数文本编辑器现在可以很好地猜测文本编码。

请注意,在大多数编码中,并非所有字节(有时甚至是许多字节)都可以解释为文本。字节可能根本不代表字符,或者它可能编码(或编码部分)控制字符。可以通过将字节编码为文本来解决此问题。常见的编码使用十六进制。每个字节编码为两个字符,每个字符4位。这使程序员可以轻松查看字节的内容。另一方面,Base64并不易读,因为它将每个6位编码为一个字符。因此base 64是一种更有效的编码,但人类阅读并不容易。

如果您希望明文输入清晰可辨,请确保使用良好的字符编码。密文 - 尽管名称 - 由字节组成。如果要从中创建字符,请使用base 64。