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

RSA加密后二进制转十六进制,密文长度从256增至512的原因?

RSA密文转换后长度异常的原因及解决办法

问题场景

将256位长度的RSA十六进制密文通过以下代码转为2048位二进制字符串:

binary_cipher = str(bin(int.from_bytes(cipher_text, byteorder='big'))[2:].zfill(2048))

再通过下方代码转回密文时,得到了512位长度的十六进制字符串,超出RSA密钥预期大小导致解密失败:

encrypted_message = hex(int(binary_cipher,2)).lstrip('0x')

原因分析

  1. 前导零补位的连锁影响:原256位十六进制密文对应128字节(1个十六进制字符=4位二进制,256×4=1024位=128字节),转二进制时用zfill(2048)在头部补了大量前导零,将二进制字符串长度强行拉到2048位。
  2. 十六进制转换的特性:2048位二进制对应512位十六进制(4位二进制=1位十六进制),hex()函数会把所有前导零对应的二进制位转成十六进制的0字符,再加上lstrip('0x')仅去掉开头的标识前缀,未截断多余的前导零,最终得到的十六进制字符串长度直接翻倍为512位。
  3. 密文格式不匹配:RSA解密要求密文长度与密钥模数长度严格对应,长度翻倍后的密文不符合解密端的格式校验,因此无法正常解密。

解决办法

要恢复原长度的密文,需先将二进制字符串转回字节时指定原密文的字节长度,再转十六进制,避免前导零被保留为多余的十六进制字符。示例代码如下:

# 假设原密文为128字节(对应256位十六进制),指定length为原密文的字节长度
cipher_bytes = int(binary_cipher, 2).to_bytes(length=128, byteorder='big')
# 转回十六进制字符串,得到原256位长度的密文
encrypted_message = cipher_bytes.hex()

to_bytes()会自动截断前导零字节,确保生成的字节数组长度与原密文一致,再转十六进制就不会出现长度异常的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 16:20:44