从Crypto.Cipher导入XOR函数报错,求正确导入及使用方案
解决Crypto.Cipher导入XOR失败的问题
问题原因
当前你使用的PyCryptodome库(即Crypto相关模块)中,Crypto.Cipher下已不存在XOR类——旧版PyCrypto中的该模块已被移除或迁移,因此触发导入错误。
解决方案
方案1:使用官方提供的strxor工具函数
PyCryptodome在Crypto.Util模块中提供了strxor工具,可直接实现字节级的异或操作,且XOR加密和解密逻辑完全一致(异或两次即可还原)。
修改后的代码:
from Crypto.Util import strxor # 注意:密钥和消息都要转为字节格式 key = b"abcdefghijklij" def enc(sock, message, addr): # 字符串转字节 message_bytes = message.encode('utf-8') # 处理密钥长度:如果密钥比消息短,循环重复密钥 extended_key = key * (len(message_bytes) // len(key)) + key[:len(message_bytes) % len(key)] encrypted = strxor.strxor(message_bytes, extended_key) sock.sendto(encrypted, addr) return encrypted def dec(sock, message, addr): # 解密和加密逻辑完全相同 extended_key = key * (len(message) // len(key)) + key[:len(message) % len(key)] decrypted = strxor.strxor(message, extended_key) return decrypted.decode('utf-8') # 测试示例(取消注释运行) # message = "dfjsdfjsdfjdsfdfsk" # encrypted = enc(None, message, None) # print(f"加密后: {encrypted}") # decrypted = dec(None, encrypted, None) # print(f"解密后: {decrypted}") # print(f"原消息与解密结果一致: {message == decrypted}")
方案2:自定义XORCipher类(模拟旧版API)
如果你希望保持原代码的类调用风格,可以自己实现一个简单的XORCipher类:
修改后的代码:
class XORCipher: def __init__(self, key): # 确保密钥是字节格式 self.key = key.encode('utf-8') if isinstance(key, str) else key def _extend_key(self, length): # 扩展密钥长度以匹配消息长度 return self.key * (length // len(self.key)) + self.key[:length % len(self.key)] def encrypt(self, message): message_bytes = message.encode('utf-8') if isinstance(message, str) else message extended_key = self._extend_key(len(message_bytes)) return bytes([m ^ k for m, k in zip(message_bytes, extended_key)]) def decrypt(self, message): # 解密与加密逻辑一致 extended_key = self._extend_key(len(message)) decrypted_bytes = bytes([m ^ k for m, k in zip(message, extended_key)]) return decrypted_bytes.decode('utf-8') # 使用示例 key = "abcdefghijklij" xor_cipher = XORCipher(key) def enc(sock, message, addr): encrypted = xor_cipher.encrypt(message) sock.sendto(encrypted, addr) return encrypted def dec(sock, message, addr): decrypted = xor_cipher.decrypt(message) return decrypted # 测试示例(取消注释运行) # message = "dfjsdfjsdfjdsfdfsk" # encrypted = enc(None, message, None) # print(f"加密后: {encrypted}") # decrypted = dec(None, encrypted, None) # print(f"解密后: {decrypted}") # print(f"原消息与解密结果一致: {message == decrypted}")
原代码的其他问题修正
- 原代码中
str_xor、str_xor1未定义,应对应你创建的xor、xor1实例 - 注释行
#message = "dfjsdfjsdfjdsfdfsk"4存在语法错误,需删除末尾的4 - XOR加密和解密无需创建两个实例,同一个密钥实例即可完成双向操作
内容的提问来源于stack exchange,提问作者Murala Lisha Narmada
相关产品推荐
相关产品推荐

