本文讨论了区块链技术在后量子时代的迁移问题,特别是针对量子计算对当前区块链基础设施构成的威胁。
我们行业中的许多人都希望事情保持不变,希望网络安全领域永远不会发生变化。但是一场巨大的颠覆即将来临,每一位网络安全专业人员都需要了解其后果。
因此,在未来五年内,将会发生一些彻底改变我们区块链基础设施的事情——量子稳健迁移。为什么是五年?因为 NIST 已经确定,所有高风险系统都必须在 2030 年之前迁移到量子稳健的基础设施,其余的在 2035 年之前完成。对于区块链,我们交易的是 token 和加密资产,因此它相当于金融应用程序,因此属于高风险。那么,让我们来看看这个迁移过程。
在一个传统的 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 慢的方法,因此它不太可能在许多区块链应用中使用。
正如我们所看到的,对于 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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!