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

如何将ECDSA签名元组(r,s)转为十六进制字符串以适配验证库?

验证ECDSA (r,s)签名的方法(Rust/Python)

Rust(secp256k1 crate)

方法1:直接从(r,s)构造Signature

无需先转十六进制,利用Signature::from_scalars直接构造签名实例,避免编码错误:

use secp256k1::{Signature, Scalar, Message, PublicKey, Secp256k1};
use sha2::Sha256;

// 替换为你的实际r、s、公钥和消息
let r_hex = "a1b2c3d4...";
let s_hex = "e5f6g7h8...";
let pubkey_hex = "02abcdef...";
let message = b"your test message";

// 解析r和s为Scalar类型
let r = Scalar::from_hex(r_hex).expect("Invalid r scalar");
let s = Scalar::from_hex(s_hex).expect("Invalid s scalar");

// 构造签名
let signature = Signature::from_scalars(r, s).expect("Invalid (r,s) signature pair");

// 初始化验证上下文、消息哈希和公钥
let secp = Secp256k1::verification_only();
let msg_hash = Message::from_hashed_data::<Sha256>(message);
let pubkey = PublicKey::from_hex(pubkey_hex).expect("Invalid public key");

// 执行验证
assert!(secp.verify(&msg_hash, &signature, &pubkey).is_ok());

方法2:将(r,s)转为紧凑格式十六进制字符串

如果需要生成工具兼容的64字节紧凑格式签名(r和s各32字节拼接):

use secp256k1::{Signature, Scalar};
use hex;

// 假设已获取r和s的Scalar实例
let r_bytes = r.to_bytes(); // 32字节的大端表示
let s_bytes = s.to_bytes();

// 拼接为64字节紧凑格式
let mut compact_buf = [0u8; 64];
compact_buf[0..32].copy_from_slice(&r_bytes);
compact_buf[32..64].copy_from_slice(&s_bytes);

// 转为十六进制字符串
let compact_hex = hex::encode(compact_buf);

// 验证时可从紧凑格式解析回Signature
let signature = Signature::from_compact(&compact_buf).expect("Invalid compact signature");

Python(ecdsa库)

利用ecdsa库直接构造(r,s)签名并验证:

import ecdsa
import hashlib

# 配置参数
curve = ecdsa.SECP256k1
pubkey_hex = "02abcdef..."  # 你的公钥十六进制
message = b"your test message"
r_hex = "a1b2c3d4..."
s_hex = "e5f6g7h8..."

# 解析公钥
pubkey = ecdsa.VerifyingKey.from_string(bytes.fromhex(pubkey_hex), curve=curve)

# 计算消息SHA-256哈希
msg_hash = hashlib.sha256(message).digest()

# 解析r和s为整数
r = int(r_hex, 16)
s = int(s_hex, 16)

# 构造签名(按曲线阶编码)
signature = ecdsa.util.sigencode_string(r, s, curve.order)

# 验证签名
try:
    pubkey.verify(signature, msg_hash, sigdecode=ecdsa.util.sigdecode_string)
    print("Signature verified successfully")
except ecdsa.BadSignatureError:
    print("Invalid signature")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 21:05:24