You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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}")

原代码的其他问题修正

  1. 原代码中str_xor、str_xor1未定义,应对应你创建的xor、xor1实例
  2. 注释行#message = "dfjsdfjsdfjdsfdfsk"4存在语法错误,需删除末尾的4
  3. XOR加密和解密无需创建两个实例,同一个密钥实例即可完成双向操作

内容的提问来源于stack exchange,提问作者Murala Lisha Narmada

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 16:25:22