"); //-->
比特币的公钥是根据私钥计算出来的。
私钥本质上是一个256位整数,记作k。根据比特币采用的ECDSA算法,可以推导出两个256位整数,记作(x, y),这两个256位整数即为非压缩格式的公钥。
由于ECC曲线的特点,根据非压缩格式的公钥(x, y)的x实际上也可推算出y,但需要知道y的奇偶性,因此,可以根据(x, y)推算出x',作为压缩格式的公钥。
压缩格式的公钥实际上只保存x这一个256位整数,但需要根据y的奇偶性在x前面添加02或03前缀,y为偶数时添加02,否则添加03,这样,得到一个1+32=33字节的压缩格式的公钥数据,记作x'。
注意压缩格式的公钥和非压缩格式的公钥是可以互相转换的,但均不可反向推导出私钥。
非压缩格式的公钥目前已很少使用,原因是非压缩格式的公钥签名脚本数据会更长。
/* Dependencies */ typedef enum MotBaseTypes_ECCPoint_PR { MotBaseTypes_ECCPoint_PR_NOTHING, /* No components present */ MotBaseTypes_ECCPoint_PR_x_only, MotBaseTypes_ECCPoint_PR_fill, MotBaseTypes_ECCPoint_PR_compressed_y_0, MotBaseTypes_ECCPoint_PR_compressed_y_1, MotBaseTypes_ECCPoint_PR_uncompressedP256 } MotBaseTypes_ECCPoint_PR; /* ECCPoint */ typedef struct MotBaseTypes_ECCPoint { MotBaseTypes_ECCPoint_PR present; union MotBaseTypes_ECCPoint_u { OCTET_STRING_t x_only; NULL_t fill; OCTET_STRING_t compressed_y_0; OCTET_STRING_t compressed_y_1; UncompressedP256_t uncompressedP256; } choice; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } MotBaseTypes_ECCPoint_t;
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。