如何将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
相关产品推荐
相关产品推荐

