以太坊公钥转换及椭圆曲线点加法invert转Mod的Python实现
以太坊公钥转换与椭圆曲线点加法优化实现
需求说明
在以太坊区块链开发中,需将公钥转换为特定格式的整数(原公式为 x + k*y,其中x是公钥X坐标,y是Y坐标,k=2^256),同时要将椭圆曲线点加法函数point_add中使用的sympy.invert替换为Mod函数计算模逆元,并调整公钥转换逻辑以适配修改后的点加法实现。
完整实现代码
1. 公钥转换模块
# 十六进制公钥 hex_public_key = '6d7c9b524dcad3695d0c479b4f5e88bdea35714cf859ede6d7fef67027b1ed15ee5c95bfc0e1c9b8ead9cabf8ed485a29593af925b394bed1b113af742de80fb' # 十六进制转字节并提取X、Y坐标 public_key_bytes = bytes.fromhex(hex_public_key) public_key_x = int.from_bytes(public_key_bytes[:32], 'big') public_key_y = int.from_bytes(public_key_bytes[32:], 'big') # 椭圆曲线参数 k = 2 ** 256 p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F # 调整后的公钥整数转换逻辑:确保坐标在模p范围内后再组合 x_mod = public_key_x % p y_mod = public_key_y % p public_key_c = x_mod + k * y_mod print("转换后的公钥整数:") print(public_key_c)
2. 修改后的点加法函数
from sympy import Mod def point_add(P1_c, P2_c, p, k): """椭圆曲线上的点加法实现(使用Mod计算模逆)""" x1, y1 = P1_c % k, P1_c // k x2, y2 = P2_c % k, P2_c // k if x1 == x2 and y1 == y2: # 点加倍:使用Mod计算2*y1在模p下的逆元 inv_2y1 = Mod(1, p) / Mod(2 * y1, p) m = (3 * x1 ** 2 * inv_2y1) % p else: # 点加法:使用Mod计算(x2 - x1)在模p下的逆元 inv_xdiff = Mod(1, p) / Mod(x2 - x1, p) m = ((y2 - y1) * inv_xdiff) % p x3 = (m ** 2 - x1 - x2) % p y3 = (m * (x1 - x3) - y1) % p return x3 + k * y3
3. 调用示例
# 假设两个转换后的公钥整数 P1_c = public_key_c # 用上面转换得到的公钥 P2_c = public_key_c # 示例用同一个点,实际替换为另一个公钥整数 # 执行点加法 result_c = point_add(P1_c, P2_c, p, k) result_x = result_c % k result_y = result_c // k print("\n点加法结果:") print(f"X坐标: {result_x}") print(f"Y坐标: {result_y}")
修改说明
公钥转换逻辑调整:
- 增加显式对X、Y坐标取模
p的操作,确保坐标始终在椭圆曲线有限域范围内,提升代码鲁棒性(以太坊公钥本身已满足该条件,显式处理可兼容异常输入)。 - 保留原
x + k*y组合方式,确保与点加法函数的坐标解析逻辑匹配。
- 增加显式对X、Y坐标取模
点加法函数修改:
- 替换
sympy.invert为Mod计算模逆元:通过Mod(1, p) / Mod(a, p)实现等价的模逆运算,符合sympy的Mod类运算规则。 - 所有中间运算保留
% p取模,确保结果始终在有限域内。
- 替换
内容的提问来源于stack exchange,提问作者user27394478
相关产品推荐
相关产品推荐

