使用pycryptodome实现RSA加密后密文解码报错该如何解决?
解决方案
首先明确核心前提:RSA 加密输出的是无对应文本编码的原始二进制字节串,并非由 UTF-8、Latin1 等文本字符集编码生成,所以你尝试用各类文本编码解码的操作本身就是错误的,自然会出现报错、内容丢失的问题。
场景1:直接操作密文字节拆分取值
不需要做任何解码操作,直接对返回的字节对象进行索引、切片即可:
- 直接用
字节对象[下标]即可拿到对应位置的字节值(取值范围0~255) - 拆分8段的示例代码:
# 拿到加密后的字节串 cipher_bytes = encrypt_with_rsa("待加密的原始文本") # 计算每段基础长度 seg_len = len(cipher_bytes) // 8 segments = [] for i in range(8): # 最后一段兼容长度整除不了的情况 end = len(cipher_bytes) if i == 7 else (i+1)*seg_len segments.append(cipher_bytes[i*seg_len : end]) # 每段取单个字节使用 target_bytes = [seg[0] for seg in segments]
场景2:需要把密文转成可读字符串存储/传输
使用专门用于二进制转文本的编码即可,不会丢失任何信息:
- 转十六进制字符串:
# 转16进制 hex_cipher = cipher_bytes.hex() # 转回原始字节 restored_bytes = bytes.fromhex(hex_cipher)
- 转Base64字符串:
import base64 # 转Base64 b64_cipher = base64.b64encode(cipher_bytes).decode('ascii') # 转回原始字节 restored_bytes = base64.b64decode(b64_cipher)
额外提示:只有当字节串本身是通过对应文本字符集编码生成的内容时,用该字符集解码才是合法操作,随机生成的加密二进制字节不符合这个前提,不要做无意义的文本解码尝试。
内容的提问来源于stack exchange,提问作者Wilber C
相关产品推荐
相关产品推荐

