cryptape / ckb-crypto-demo

Fundamental cryptography libraries for CKB
4 stars 4 forks source link

ec-schnorr相关 #6

Closed timfaner closed 4 years ago

timfaner commented 4 years ago

ec-schnorr 使用openssl中的ec,迁移到botan难度如何

  1. 使用的曲线族
  2. 代码上的兼容
  3. 编译上的兼容
Maellys commented 4 years ago

ec-schnorr 使用 secp256k1 曲线。 OpenSSL 使用的是 ANS1 标准中规定的 Object 结构;曲线的 NID 是 714 。 NID 的定义在 obj_mac.h

#define SN_secp256k1            "secp256k1"
#define NID_secp256k1           714
#define OBJ_secp256k1           OBJ_secg_ellipticCurve,10L
Maellys commented 4 years ago

secp256k1 曲线的参数在 ec_curve.c 中给出:

static const struct {
    EC_CURVE_DATA h;
    unsigned char data[0 + 32 * 6];
} _EC_SECG_PRIME_256K1 = {
    {
        NID_X9_62_prime_field, 0, 32, 1
    },
    {
        /* no seed */
        /* p */
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFC, 0x2F,
        /* a */
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        /* b */
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
        /* x */
        0x79, 0xBE, 0x66, 0x7E, 0xF9, 0xDC, 0xBB, 0xAC, 0x55, 0xA0, 0x62, 0x95,
        0xCE, 0x87, 0x0B, 0x07, 0x02, 0x9B, 0xFC, 0xDB, 0x2D, 0xCE, 0x28, 0xD9,
        0x59, 0xF2, 0x81, 0x5B, 0x16, 0xF8, 0x17, 0x98,
        /* y */
        0x48, 0x3a, 0xda, 0x77, 0x26, 0xa3, 0xc4, 0x65, 0x5d, 0xa4, 0xfb, 0xfc,
        0x0e, 0x11, 0x08, 0xa8, 0xfd, 0x17, 0xb4, 0x48, 0xa6, 0x85, 0x54, 0x19,
        0x9c, 0x47, 0xd0, 0x8f, 0xfb, 0x10, 0xd4, 0xb8,
        /* order */
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFE, 0xBA, 0xAE, 0xDC, 0xE6, 0xAF, 0x48, 0xA0, 0x3B,
        0xBF, 0xD2, 0x5E, 0x8C, 0xD0, 0x36, 0x41, 0x41
    }
};
timfaner commented 4 years ago

明白。有一些问题:

EC-Schnorr的标准化问题

我注意到EC-Schnorr在实现上不像ECDSA一样标准化程度较高,这里有相关讨论。遵循不同标准实现起来可能导致不同结果,在后期实际开发时候我们尽量选择与比特币相同的实现,以加强互操作性。这个可能需要注意一下

EdDSA签名

比较多区块链项目使用EdDSA作为签名使用,EdDSA是schnorr类签名,基于ed25519、sha512,我们后期或许可以实现EdDSA而非RSA?你觉得如何

Maellys commented 4 years ago

明白你的意思。

关于第一点,EC-Schnorr 由于专利保护导致的标准化问题一直是令人诟病的,这个我在前期调研的时候也有注意到。调研文档里 EC-Schnorr 部分介绍参考的是 BSI TR-03111 的实现方法。

但不同标准之间的区别主要体现在参与签名的参数不同,以及签名者公布的消息不同。这可能会影响到算法的某些具体实现方法,但只要采用的曲线相同就可以保证公私钥和地址无需改变,就应该不会出现大的兼容性问题。可以参考之前 Bitcoin Cash 从 ECDSA 升级到 Schnorr 的情况。目前比特币关于 Schnorr 签名的 BIP 提案 还没有正式通过,但我认为可以作为我们的重要参考,以期保证你提到的互操作性。

对第二点表示赞同。RSA 应该一直是不在重点开发计划里的吧。

timfaner commented 4 years ago

了解 那麻烦你调研一下EdDSA的实现,为第二阶段的开发做准备,并将结果更新到 开发设计中 。之后在中跟进 #14