我的PyCrypto实现是否符合我的目的?

时间:2012-12-12 15:18:29

标签: encryption python-2.7 aes pycrypto

我对编程没有经验,而PyCrypto文档对于初学者来说非常稀疏。假设我使用下面编写的代码加密文件,并通过互联网发送。我关心的是计算机A和B之间文件的安全性。让我们假设计算机本身是安全的,密钥是安全传输的。我是否正确实施了一些事情还有什么我应该知道的吗?使用Python 2.7和PyCrypto 2.6

提前感谢您的回答。

from Crypto.Cipher import AES
from Crypto import Random

def get_random(length):
    r = Random.new().read(length)
    return r

def aes_encrypt(key, file_in, file_out):
    data_source = open(file_in, 'rb')
    data = data_source.read()
    data_source.close()
    iv = get_random(AES.block_size)
    cipher = AES.new(key, AES.MODE_CFB, iv)
    data_encrypted = iv+cipher.encrypt(data)
    file_encrypted = open(file_out, 'wb')
    file_encrypted.write(data_encrypted)
    file_encrypted.close()

def aes_decrypt(key, file_in, file_out):
    data_source = open(file_in, 'rb')
    data = data_source.read()
    data_source.close()
    iv = data[:AES.block_size]
    data = data[AES.block_size:]
    cipher = AES.new(key, AES.MODE_CFB, iv)
    data_decrypted = cipher.decrypt(data)
    file_decrypted = open(file_out, 'wb')
    file_decrypted.write(data_decrypted)
    file_decrypted.close()

#testing
key = get_random(32)
#encrypting the file on computer A
aes_encrypt(key, 'file.dat', 'file.enc')
#decrypting the file on computer B
aes_decrypt(key, 'file.enc', 'file.dat')

1 个答案:

答案 0 :(得分:2)

您缺少实施加密的最重要考虑因素之一,即消息完整性。不幸的是,仅加密消息不足以确保它不被篡改,尤其是在CTR,CFB和OFB等流模式的情况下。

看起来您正在使用CFB模式(MODE_CFB)。这种方式的工作方式是使用AES生成随机密钥流,并将结果与​​明文进行异或。这意味着如果有人在密文中翻了一下,相应的位将翻转解密的明文。攻击者可能会将您的消息更改为完全不同的内容,并且您无法检测到它。有关CFB模式(解密)如何工作的参考:

CFB Mode

如果我翻转密文的第一个块的第一个比特,它将翻转解密明文的第一个块的第一个比特。

您需要应用HMAC或使用AES-GCM模式,这将共同处理机密性和完整性。

有比CFB更好的模式选择,所以如果没有强烈的理由选择它,我会先推荐AES-GCM,然后再推荐AES-CTR和HMAC。