我对编程没有经验,而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')
答案 0 :(得分:2)
您缺少实施加密的最重要考虑因素之一,即消息完整性。不幸的是,仅加密消息不足以确保它不被篡改,尤其是在CTR,CFB和OFB等流模式的情况下。
看起来您正在使用CFB模式(MODE_CFB)。这种方式的工作方式是使用AES生成随机密钥流,并将结果与明文进行异或。这意味着如果有人在密文中翻了一下,相应的位将翻转解密的明文。攻击者可能会将您的消息更改为完全不同的内容,并且您无法检测到它。有关CFB模式(解密)如何工作的参考:
如果我翻转密文的第一个块的第一个比特,它将翻转解密明文的第一个块的第一个比特。
您需要应用HMAC或使用AES-GCM模式,这将共同处理机密性和完整性。
有比CFB更好的模式选择,所以如果没有强烈的理由选择它,我会先推荐AES-GCM,然后再推荐AES-CTR和HMAC。