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
相关产品推荐
相关产品推荐

