用于Server-Client通信的PyCrypto AES加密

时间:2013-11-09 17:12:46

标签: cryptography aes

我正在开发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密码加密。

感谢。

1 个答案:

答案 0 :(得分:0)

对于您的解密代码,无需在IV前面添加密文。您是否尝试了plaintext = cipher.decrypt(data)

以明文形式传输IV是安全的。因此,您可以随机生成它,然后将其与通信之外的密文一起发送。类似self.sendData(iv + ciphertext)及更晚iv = data[:16]ciphertext = data[16:]

的内容

另一个需要考虑的常见问题是编码 - 某些传输格式在发送原始字节(可能包含NULL字符)时效果不佳。将密文编码为base64以进行传输是很常见的。如果您需要,请查看base64.b64encodebase64.b64decode