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

Python字符串对比问题:win32crypt解密结果与传入参数不匹配

解决字符串对比不相等的问题

问题根源

你看到的b是UTF-16LE(小端序)编码的字符串表现形式,每个ASCII字符后带\x00是这种编码的典型特征。当前代码里用默认的decode()(通常是UTF-8)解码,导致得到了带空字符的错误字符串。

最优解决方案:修正解密后的解码方式

直接在decrypt函数里指定正确的编码utf-16le解码,就能得到和a格式一致的普通文本:

def decrypt(password):
    _, decrypted_password_string = win32crypt.CryptUnprotectData(binascii.unhexlify(password), None, None, None, 0)
    # 指定utf-16le解码,直接得到正常字符串
    return decrypted_password_string.decode('utf-16le').rstrip('\x00')  # 末尾可能带空字符,可选去除

def main(a):
    b = encryptedstringfromcsv
    b = decrypt(b)
    if a == b:
        print('true')
    else:
        print('false')

注:rstrip('\x00')是为了处理解密结果末尾可能残留的空字符,确保和a完全一致。

备选方案:将a转换为UTF-16LE格式对比

如果不想修改解密逻辑,也可以把a编码成UTF-16LE格式后再对比:

def decrypt(password):
    _, decrypted_password_string = win32crypt.CryptUnprotectData(binascii.unhexlify(password), None, None, None, 0)
    return decrypted_password_string.decode()

def main(a):
    b = encryptedstringfromcsv
    b = decrypt(b)
    # 将a转换为UTF-16LE编码的字符串(带\x00)
    a_utf16le = a.encode('utf-16le').decode('utf-16le')
    if a_utf16le == b:
        print('true')
    else:
        print('false')

为什么推荐第一种方案?

第一种方案从根源上修正了解码错误,得到的b是正常的文本字符串,后续使用更方便,不需要每次对比都转换格式。

内容的提问来源于stack exchange,提问作者Dihmz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 10:58:14