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

解决int.to_bytes溢出问题:Decimal类等效实现方法问询

问题:int.to_bytes大数溢出,Decimal替代方案?

使用int.to_bytes方法时触发OverflowError: int too big to convert错误,尝试用支持大数运算的Decimal类替代,但找不到和int.to_bytes完全等效的功能。

小数字场景示例

期望message3输出与message2一致,但当前实现不符合预期:

from decimal import *

message = b"Message"
length = len("Message")

number = int.from_bytes(message, 'little')
print(number) # 28542640894207309

message2 = int.to_bytes(number,length,'little')
print(message2) # b'Message'

message3 = str(Decimal(number)).encode()
print(message3) # b'28542640894207309'

触发错误的代码

from sympy import randprime
from decimal import *

p, q = [randprime(0, 1 << 1024)] * 2
n = p * q

length = len("Message")
message = b"Message"

e = 0x10001
m = int.from_bytes(message, 'little')
print(m)

c = pow(m, e, n)
phi = int(pow(p-1,2))
d = pow(e, -1, phi)
m2 = pow(c,d,n)

message2 = int.to_bytes(m2,length,'little') # Error happens here
print(message2)

Python版本:3.11.7


解决方案:无需Decimal,修复长度与RSA计算问题

你遇到的问题核心不是int不支持大数(Python的int原生支持任意精度),而是两个错误:

  1. RSA的欧拉函数phi计算错误,导致解密后的m2数值异常
  2. 调用int.to_bytes时指定的length太小,装不下m2对应的字节数

修正后的代码

from sympy import randprime

p, q = [randprime(0, 1 << 1024)] * 2
n = p * q

message = b"Message"
original_length = len(message)

e = 0x10001
m = int.from_bytes(message, 'little')
print(m)

c = pow(m, e, n)
# 修正phi计算:正确的欧拉函数phi(n) = (p-1)*(q-1)
phi = (p - 1) * (q - 1)
d = pow(e, -1, phi)
m2 = pow(c, d, n)

# 计算m2所需的最小字节数,避免溢出
required_bytes = (m2.bit_length() + 7) // 8
message2 = m2.to_bytes(required_bytes, 'little')
# 截断到原消息长度,去除RSA运算可能带来的前导零
message2 = message2[:original_length]

print(message2)  # 输出b'Message'

关键说明

  • phi值修正:之前的phi = int(pow(p-1,2))完全错误,RSA的欧拉函数必须是(p-1)*(q-1),否则无法正确计算私钥d,解密结果会出错。
  • int的大数支持:Python的int本身就能处理任意大的整数,不需要用Decimal替代,int.to_bytes的溢出只是因为指定的长度不足。
  • 字节长度计算:(m2.bit_length() +7)//8是计算整数所需最小字节数的标准写法,用这个长度转换就不会触发溢出。
  • 截断处理:RSA解密后的m2可能包含额外的前导零对应的数值,转换为字节串后截断到原消息长度,就能得到正确的原始字节内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 05:15:30