新闻  |   论坛  |   博客  |   在线研讨会
公钥
电子禅石 | 2020-02-27 17:07:35    阅读:47   发布文章
公钥

比特币的公钥是根据私钥计算出来的。

私钥本质上是一个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;


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客