2

我没有编程经验,而且 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')
4

1 回答 1

2

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

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

CFB模式

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

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

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

于 2012-12-12T17:25:12.437 回答