区块链的后量子迁移

本文讨论了区块链技术在后量子时代的迁移问题,特别是针对量子计算对当前区块链基础设施构成的威胁。

区块链的后量子迁移

我们行业中的许多人都希望事情保持不变,希望网络安全领域永远不会发生变化。但是一场巨大的颠覆即将来临,每一位网络安全专业人员都需要了解其后果。

因此,在未来五年内,将会发生一些彻底改变我们区块链基础设施的事情——量子稳健迁移。为什么是五年?因为 NIST 已经确定,所有高风险系统都必须在 2030 年之前迁移到量子稳健的基础设施,其余的在 2035 年之前完成。对于区块链,我们交易的是 token 和加密资产,因此它相当于金融应用程序,因此属于高风险。那么,让我们来看看这个迁移过程。

PKI 和数字钱包的魔力

在一个传统的 PKI(公钥基础设施)应用中,Bob 会对一条消息进行哈希运算,然后用他的私钥(sk)对哈希值进行签名。这样会生成一个(r,s)签名。Alice 收到消息后,也会对消息进行哈希运算。然后,她使用 Bob 的公钥来验证签名。如果验证通过,则签名已被验证。Alice 也需要确认 Bob 的公钥是正确的,所以她会收到一份包含 Bob 公钥的数字证书,这份证书由 Trent(她信任的人)签名:

图 1

但是,在区块链世界中,没有 Trent,一切都是去中心化的。有了这个,中本聪定义了一个系统,允许区块链上的每个人检查交易的有效性。为此,中本聪使用了 ECDSA 签名方法,我们对公钥进行哈希运算,然后只取前 160 位作为钱包 ID(虽然图示显示的是 SHA-3 哈希,但中本聪使用的是 RIPEMD160 哈希)。ECDSA 的一个特点是,公钥可以从签名中恢复。这意味着 Bob 不再需要将他的公钥发送给 Alice,因为她可以从他签名的交易中提取公钥。她还可以通过对公钥进行 SHA-3 哈希运算(并使用前 160 位)来检查发送交易的钱包 ID,并证明交易中的发送者与签名者是同一个人:

图 2

这是一个很棒的系统,具有较小的密钥和较小的交易规模。但是,随着我们需要移除椭圆曲线方法,并用量子稳健的方法来代替它们,这一切都将改变。此外,我们的量子稳健方法不太可能支持 PKR,因此我们将不得不将公钥与签名一起发送(从而增加网络和存储开销)。

迈向量子稳健的世界

幸运的是,NIST 一直在制定取代 ECC 和 RSA 的标准,并且已经为数字签名定义了三个主要标准:Dilithium (ML-DSA)、Falcon (FN-DSA) 和 SPHINCS+ (SLH-DSA)。在后量子世界中,我们的 ECDSA 和 EdDSA 签名将变成这些签名之一。

密钥和签名的大小现在是:

签名:
                        方法   安全等级    公钥     私钥     签名
-----------------------------------------------------------------------------------------------------
                  ECDSA 256-bit           1     65          32          71
                     ML-DSA-44           2     1312        2560        2420
                     ML-DSA-65           3     1952        4032        3309
                     ML-DSA-87           5     2592        4896        4627
                    Falcon-512           1     897        1281         752
                   Falcon-1024           5     1793        2305        1462
     SPHINCS+-SHA2-128f-simple           1     32          64       17088
     SPHINCS+-SHA2-128s-simple           1     32          64        7856
     SPHINCS+-SHA2-192f-simple           3     48          96       35664
     SPHINCS+-SHA2-192s-simple           3     48          96       16224
     SPHINCS+-SHA2-256f-simple           5     64         128       49856
     SPHINCS+-SHA2-256s-simple           5     64         128       29792
    SPHINCS+-SHAKE-128f-simple           1     32          64       17088
    SPHINCS+-SHAKE-128s-simple           1     32          64        7856
    SPHINCS+-SHAKE-192f-simple           3     48          96       35664
    SPHINCS+-SHAKE-192s-simple           3     48          96       16224
    SPHINCS+-SHAKE-256f-simple           5     64         128       49856
    SPHINCS+-SHAKE-256s-simple           5     64         128       29792

对于 ECDSA,r 和 s 的值都是 32 字节,我们添加其他信息字节,得到一个 71 字节的签名。

从上表可以看出,Dilithium(ML-DSA-44)的公钥大小为 1,312 字节,签名大小为 2,420 字节。不幸的是,我们无法从 Dilithium 签名中提取公钥,因此我们必须将公钥添加到签名中,这会给交易增加 3,732 字节的签名。使用 ECDSA,我们只有 71 字节的签名(因为不需要添加公钥)。添加公钥的方法可以用下图说明:

图 3

使用 Falcon (FL-DSA),我们可以使用 Falcon512 PKR 和 Falcon1024 PKR 从签名中提取公钥。使用 Falcon-512,我们有一个 752 字节的签名,而这不需要添加公钥(如图 2 所示)。因此,开销现在将是 752 字节(远小于 ML-DSA 签名方法)。虽然 Falcon 的处理性能比 Dilithium 慢,但减少区块大小的优势带来了巨大的好处。

对于 SPHINCS+,我们可以看到签名大小相对较大,而且它也是一种比 Dilithium 和 Falcon 慢的方法,因此它不太可能在许多区块链应用中使用。

后量子密码学的钱包 ID

正如我们所看到的,对于 PQC,我们基本上会对公钥进行 SHA-3 哈希运算,然后将其作为钱包 ID(取前 160 位)。如果我们使用 liboqs,代码如下:

##include <stdio.h>
##include <string.h>
##include <time.h>
##include "oqs/oqs.h"

static void clear8(uint8_t* a, size_t count) {
    for (size_t i = 0; i < count; ++i) {
        a[i] = 0;
    }
}
char * bytes2hex(uint8_t bytes[], int len)
{
    char *out =(char *) malloc(2*len+1);
    *out = (char)' \0';
    char s[3];
    for (int j = 0; j < len; j++) {
        sprintf(s,"%02x", bytes[j]);
        strcat(out,s);

    }
    return (out);
}

int main(int argc, char** argv)
{

    int type = 0;
    const char* sig_name = "ML-DSA-44";
    OQS_SIG* sig = NULL;
    OQS_STATUS rc, ret = OQS_ERROR;

    OQS_init();

    if (argc > 1) sig_name = argv[1];

    sig = OQS_SIG_new(sig_name);

 printf("%s\n\n", sig_name);

    int publicKeySize = sig->length_public_key;
    int secretKeySize = sig->length_secret_key;
    int sigSize= sig->length_signature;

    uint8_t * public_key = (uint8_t *)malloc(publicKeySize);
   uint8_t *secret_key = (uint8_t *)malloc(secretKeySize);

 rc = OQS_SIG_keypair(sig, public_key, secret_key);

 char* pub_str = (char*)malloc(publicKeySize);
 pub_str = bytes2hex(public_key, publicKeySize);
    printf("Public key size %d\n", publicKeySize);
 printf("Public key (First 200 bytes): %.400s\n\n", pub_str);

 char* priv_str = (char*)malloc(secretKeySize);
 priv_str = bytes2hex(secret_key, secretKeySize);
    printf("Private key size %d\n", secretKeySize);
    printf("Private key (First 200 bytes): %.400s\n\n", priv_str);

    uint8_t output[32];
    clear8(output, 32);
    OQS_SHA3_sha3_256(output, public_key, publicKeySize);

    char* wallet_id = (char*)malloc(20*2);
    wallet_id = bytes2hex(output, 20*2);
    printf("Wallet ID: %.40s\n\n", wallet_id);

    return 0;
}

一个示例运行显示了一个示例钱包 ID:

ML-DSA-44

Public key size 1312
Public key (First 200 bytes): 287478e62cd1bcbe1a8813b51c47c50dfd937e9ecb0bd190cde8263829f11296fef2cbf7cac8ecb60faa71d7b0d26942f02bb5b158f9222f690f2f6945dbf5fbc221e9a662907055d31a461811610c9d111efef51a0c5d6dbb9f8725b3d6ae76076b7698031c50781de6baf53ba330593193ab98804fe172db5a6799db526d81874c7f29903e90de1aa903c65c62ae7b0963a8d0b5846ade9343c9098b0c220cffc284da3c3bc99dfb5277703c715e57de68f6eb75747c2aa6903cb22f6b417215591cb0a60e6f7e

Private key size 2560
Private key (First 200 bytes): 287478e62cd1bcbe1a8813b51c47c50dfd937e9ecb0bd190cde8263829f112962c11432568f4d53e9de9a1d1906fd347e21f7040ba29b38c81d1502d9848f43d9aa84796ab5894be8baab18717aa3aa080473b42869d27f94d4578e06171cfa64152e754ac00a0027d20d03c92da97929b05637f64d2e631b21f4cd6792632a442a2445122202002291b30520b0321e21600412082c9c2658914319b228409052600a58922302149246461c061802230c8348a63480419136908100881c6448c186c402821da8410

Wallet ID: 7e4ae86970a543d40ccc5db3ceba545c9bae11ee

用于身份识别的智能合约

对于 ML-DSA,将公钥添加到交易中可能会产生相当大的开销。但是,克服这个问题的一种方法是使用智能合约来存储用户的公钥。最初,用户会注册他们的公钥,当他们想要登录系统时,用户将使用他们的私钥创建一个签名,然后发送智能合约的地址。然后,登录系统可以调用智能合约,智能合约将根据公钥验证签名。这样做的一个缺点是,后量子方法将具有更大的智能合约大小。使用身份验证系统,我们的智能合约大小为 150 字节,而使用 ML-DSA-44,则为 1,429 字节 [1]。这将意味着部署合约的 gas 成本增加。

结论

在第二轮的补充签名中,还有其他一些正在出现的方法可能会带来更小的签名大小(例如使用 Oil and Vinegar 方法);它们尚未标准化。因此,Dilithium(ML-DSA)和 Falcon(FN-DSA)很可能是下一代区块链的真正竞争者。但是,ML-DSA 的密钥大小和签名比 Falcon 大,而且它不支持公钥恢复,因此 Falcon 可能是取代区块链应用中 ECDSA 的最佳选择。

总的来说,现有区块链的安全性在迁移后会很好,因为区块的安全性是基于哈希方法的,而 SHA-256 是量子稳健的。

最后,毫无疑问需要进行迁移。区块链必须在 2030 年之前进行迁移,并且它们在交易大小和交易时间方面会受到性能影响。但是,这是必须要发生的!

参考文献

[1] Marchsreiter, D. (2025). Towards quantum‐safe blockchain: Exploration of PQC and public‐key recovery on embedded systems. IET Blockchain, 5(1), e12094.

  • 原文链接: medium.com/asecuritysite...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
asecuritysite
asecuritysite
江湖只有他的大名,没有他的介绍。