在设置CBC模式时出现错误65537

时间:2018-02-25 22:12:11

标签: python encryption aes pycryptodome

我一直在使用PyCryptoDome库来加密客户端和服务器之间的某些通信。这是协议的方式。

  1. 服务器向客户端发送RSA公钥。
  2. 客户端生成AES密钥
  3. 客户端对其进行加密。使用公钥(使用PKCS1_OAEP加密函数)
  4. 对其进行加密
  5. 加密密钥被发送到服务器。
  6. 服务器解密密钥
  7. 服务器和客户端切换到AES-CBC以加密通信。
  8. 之后,当客户端发送消息时,服务器会对其进行解密,将其用于需要对其执行的操作,然后将其发回。一切顺利,直到客户端尝试解密服务器发回的消息。由于以下原因,用于接收消息的线程停止:

      

    在设置CBC模式时出现错误65537

    使用不同的AES模式时会出现不同的错误代码。

    以下是我修改过的AESCipher类:

    import binascii
    from Crypto import Random
    from Crypto.Cipher import AES
    
    
    class AESCipher(object):
    
        def __init__(self, key):
            self.key = key
            self.pad = lambda s: s + (AES.block_size - len(s) % AES.block_size) * \
                chr(AES.block_size - len(s) % AES.block_size)
            self.unpad = lambda s: s[:-ord(s[len(s) - 1:])]
    
        def encrypt(self, raw):
            iv = Random.new().read(AES.block_size)
            cipher = AES.new(self.key, AES.MODE_CBC, iv)
            return binascii.b2a_hex(iv + cipher.encrypt(self.pad(raw)))
    
        def decrypt(self, enc):
            enc = binascii.a2b_hex(enc)
            iv = enc[:AES.block_size]
            cipher = AES.new(self.key, AES.MODE_CBC, iv)
            return self.unpad(cipher.decrypt(enc[AES.block_size:]))
    

    客户端接收方(导致错误的一方):

    def recvMesgThread(netcat, output, aescipher):
        while True:
            try:
                data = netcat.recv_until('\r\n').replace('\r\n', '')
            except NetcatError:
                print('Lost connection to server!')
                sys.exit(0)
    
            if data[:5] == '/MESG' and data[-5:] =='MESG/' :
                try:
                    output.append(aescipher.decrypt(buf[5:-5]))
                except Exception as e:
                    print(e)
    

1 个答案:

答案 0 :(得分:0)

嗯,这很令人尴尬......

这个问题是一个错字。第11行尝试解密不存在的buf变量。 data变量是包含我需要的变量。