数字货币私钥有符号吗?负数私钥在椭圆曲线里到底意味着什么
数字货币私钥有符号吗?负数私钥在椭圆曲线里到底意味着什么
搞了七八年区块链底层,跟密钥打交道的日子不算少。最近又有开发者问我,私钥解析出来是负数要不要紧。这个问题看着小,但真踩上去,整个签名验证链路就断了。私钥在椭圆曲线里到底能不能带符号,这事得掰开了说。
椭圆曲线私钥本质是一个整数,取值范围是 [1, n-1],n是曲线阶数。它天然��无符号的,不存在"-3"这个合法私钥。但问题出在编码环节。WIF格式、DER编码、或者有些老代码用有符号整型去存,二进制补码一上来,高位是1的私钥就被解读成负数了。

我见过一个项目,C++里用int64存私钥数字货币私钥有符号,某笔交易的私钥恰好前几字节是0xFF,反序列化出来就是个负值,ECDSA签名直接报错。排查了两天,定位到是有符号和无符号整型混用的典型事故。Java的BigInteger虽然天然无符号,但用byte数组构造时,首字节最高位是1同样会被当负数,得手动补一个0x00前缀。
工程上有一条铁律:私钥永远按无符号大整数处理。序列化用hex字符串或带长度前缀的字节串数字货币私钥有符号吗?负数私钥在椭圆曲线里到底意味着什么,别用语言默认的有符号类型。读入时校验范围,不落在[1, n-1]就直接拒绝。私钥带符号不是"差不多能用"的事,是签名无效、资产打不开的硬伤。
您可以还会对下面的文章感兴趣:
暂无相关文章