我正在开发Server-Client之间的简单安全数据交换,并在实施AES时遇到一些问题。
我已经实现了共享密钥交换(使用公钥加密),它工作正常。我头脑中的想法是(伪代码):
SERVER
ciphertext = AES.encrypt(sharedKey,data)
send(ciphertext)
CLIENT
ciphertext = receive()
plaintext = AES.decrypt(sharedKey,ciphertext)
瞧瞧。当我试图实现它时,我首先发现有一个IV。我首先尝试将其设置为全零,如下所示:
self.cipher = AES.new(self.Kshared, AES.MODE_CFB, '0000000000000000')
while( there is data to send ):
ciphertext = self.cipher.encrypt(data)
self.sendData(ciphertext)
然后,在客户端:
cipher = AES.new(Ksecreta, AES.MODE_CFB,'0000000000000000')
while( there is data to receive ):
plaintext = cipher.decrypt('0000000000000000'+data)[16:]
这适用于FIRST消息,但不适用于其他消息。我认为我的问题可能与IV有关,但我不知道。另外,我发现的第一个实现使用salt生成另一个密钥,也是随机IV,但问题是客户端不知道服务器使用哪个salt / IV。我想你可以通过公钥加密发送,但我首先想要一个简单的AES密码加密。
感谢。
答案 0 :(得分:0)
对于您的解密代码,无需在IV前面添加密文。您是否尝试了plaintext = cipher.decrypt(data)
?
以明文形式传输IV是安全的。因此,您可以随机生成它,然后将其与通信之外的密文一起发送。类似self.sendData(iv + ciphertext)
及更晚iv = data[:16]
和ciphertext = data[16:]
另一个需要考虑的常见问题是编码 - 某些传输格式在发送原始字节(可能包含NULL字符)时效果不佳。将密文编码为base64以进行传输是很常见的。如果您需要,请查看base64.b64encode
和base64.b64decode