HQC为互联网的未来提供了一种关键工具

文章讨论了后量子密码学中密钥封装机制(KEM)的选择,重点关注了NIST后量子密码竞赛的进展。

HQC 为互联网的未来提供关键载体

你可能知道,Shor 算法将破解我们现有的公钥方法,包括 RSA 和椭圆曲线方法。对于数字签名,NIST 正在考虑用 ML-DSA (Dilitium)、SLH-DSA (SPHINCS+) 和 Falcon 替换 ECDSA、EdDSA 和 RSA,但对于密钥交换和公钥加密,我们将用 ML-KEM (Kyber) 替换 RSA。因此,对于密钥协商,我们只有一种方法可以选择,为此,NIST 一直在调查其他三种非格方法:BIKE、HQC 和 McEliece。最近,他们宣布只有 HQC (Hamming Quasi-Cyclic) 将继续推进 [这里]:

在 NIST PQC 密钥协商竞赛的第三轮中,Kyber 被选中进行标准化,现在被定义为 ML-KEM (FIPS 203)。总的来说,Kyber 是第三轮候选方法中最好的方法,并且在密钥生成、封装和解封装方面速度最快。然后,NIST 转向定义第四轮,评估了 BIKE、Classic McEliece、HQC 和 SIKE。HQC 和 BIKE 具有相似的性能水平,并且都是基于代码的,而 SIKE 因为一组弱参数而被破解而撤回。不幸的是,McEliece 虽然高度安全和稳健,但存在严重的性能问题,因此许多人认为接下来要标准化的将是 BIKE 和 HQC 之间的竞争。

Kyber 和其他 PQC 方法的密钥长度为:

Type      Public key size (B)   Secret key size (B)  Ciphertext size (B)
------------------------------------------------------------------------
Kyber512              800              1,632                  768  Learning with errors (Lattice)
Kyber738            1,184              2,400                1,088  Learning with errors (Lattice)
Kyber1024           1,568              3,168                1,568  Learning with errors (Lattice)

Bike128             1,541              3,114                1,573  Code-based
Bike192             3,083              6,198                3,115  Code-based
Bike256             5,122             10,276                5,154  Code-based

HQC128              2,249              2,289                4,497  Code-based
HQC192              4,522              4,562                9,042  Code-based
HQC256              7,245              7,285               14,485  Code-based

McEliece348864    261,120              6,492                  196  Code based
McEliece460896    524,160             13,608                  156  Code based
McEliece6688128 1,044,992             13,932                  208  Code based
McEliece6960119 1,047,319             13,948                  194  Code based
McEliece8192128 1,357,824             14,120                  208  Code based
NTRUhps2048509        699                935                  699  Lattice
NTRUhps2048677        930              1,234                  930  Lattice
NTRUhps4096821      1,230              1,590                1,230  Lattice
SIKEp434              330                 44                  346  Isogeny
SIKEp503              378                 56                  402  Isogeny
SIKEp751              564                 80                  596  Isogeny
SIDH                  564                 48                  596  Isogeny
LightSABER            672              1,568                  736  Learning with rounding (Lattice)
SABER                 992              2,304                1,088  Learning with rounding (Lattice)
FireSABER           1,312              3,040                1,472  Learning with rounding (Lattice)

HQC

HQC 是一种基于代码的密钥封装机制,基于 Hamming Quasi-Cyclic。它有三个安全级别:HQC-128、HQC-192 和 HQC-256。虽然 Kyber-512 的公钥为 800 字节,但 HQC128 使用 2,249 字节的公钥。对于私钥,Kyber512 的密钥长度为 1,632 字节,而 Bike128 的公钥为 2,289 字节。Kyber512 的密文为 768 字节,而 HQC128 的密文为 4,497 字节。

我们可以使用以下命令为 .NET 8.0 创建一个 Dotnet 控制台项目 [这里]:

dotnet new console

首先,我们安装 Bouncy Castle 库 [这里]:

dotnet add package BouncyCastle.Cryptography

接下来是一些代码 [这里]:

namespace Hqc
{
    using Org.BouncyCastle.Pqc.Crypto.Hqc;
    using Org.BouncyCastle.Security;
    class Program
    {
        static void Main(string[] args)
        {
try {
                var size="128";
                if (args.Length >0) size=args[0];
                var random = new SecureRandom();
                var keyGenParameters = new   HqcKeyGenerationParameters(random, HqcParameters.hqc128);
                if (size=="192") keyGenParameters = new HqcKeyGenerationParameters(random, HqcParameters.hqc192);
                else if (size=="256") keyGenParameters = new HqcKeyGenerationParameters(random, HqcParameters.hqc256);
                var HqcKeyPairGenerator = new HqcKeyPairGenerator();
                HqcKeyPairGenerator.Init(keyGenParameters);

                var aKeyPair = HqcKeyPairGenerator.GenerateKeyPair();
                var aPublic = (HqcPublicKeyParameters)aKeyPair.Public;
                var aPrivate = (HqcPrivateKeyParameters)aKeyPair.Private;

                var pubEncoded =aPublic.GetEncoded();
                var privateEncoded = aPrivate.GetEncoded();
                var bobHqcKemGenerator = new HqcKemGenerator(random);
                var encapsulatedSecret = bobHqcKemGenerator.GenerateEncapsulated(aPublic);
                var bobSecret = encapsulatedSecret.GetSecret();
                var cipherText = encapsulatedSecret.GetEncapsulation();
                var aliceKemExtractor = new HqcKemExtractor(aPrivate);
                var aliceSecret = aliceKemExtractor.ExtractSecret(cipherText);
                Console.WriteLine("Hqc-{0}",size);
                Console.WriteLine("Private key length:\t\t{0} bytes",aPrivate.GetEncoded().Length);
                Console.WriteLine("Public key length:\t\t{0} bytes",aPublic.GetEncoded().Length);
                Console.WriteLine("Ciphertext length:\t\t{0} bytes",cipherText.Length);
                Console.WriteLine("\nAlice private (first 50 bytes):\t{0}",Convert.ToHexString(aPrivate.GetEncoded())[..100]);
                Console.WriteLine("Alice public (first 50 bytes):\t{0}",Convert.ToHexString(aPublic.GetEncoded())[..100]);
                Console.WriteLine("\nCipher (first 50 bytes):\t{0}",Convert.ToHexString(cipherText)[..100]);
                Console.WriteLine("\nBob secret:\t\t{0}",Convert.ToHexString(bobSecret));
                Console.WriteLine("Alice secret:\t\t{0}",Convert.ToHexString(aliceSecret));
            } catch (Exception e) {
                Console.WriteLine("Error: {0}",e.Message);
            }
        }
    }
}

一个示例运行,显示了密文以及公钥和私钥:

Hqc-128
Private key length:     2289 bytes
Public key length:      2249 bytes
Ciphertext length:      4497 bytes

Alice private (first 50 bytes): 4968C8C6628D90FA7E79A339BC16E7CEC9B723E9B067C5BB0EC82192E484092E02991B9B8E94DCD87936B7278B9D8BE375F8
Alice public (first 50 bytes): 7936B7278B9D8BE375F88E4ED9BE33F6B06A2CC90559FECF2ACB989DFBE8BF5AC1C260CCE367C1668C4C98D7E7E43BA921A8
Cipher (first 50 bytes): 191F37628688CB54F26217CE932831D6DD0C376F2634272A447548DE0E2DA14B9CFA04021C09C0A7C468F474B16D43AAFD69
Bob secret:  55A3B3632AE7C70ED3E17BF9D6F952482C61E28B2EE4159817703EE0AC469D00DB59EE7799F0D935C41DAF9F7826B33DFC76F1E95364B3088ABB23FDDF7BC2D2
Alice secret:  55A3B3632AE7C70ED3E17BF9D6F952482C61E28B2EE4159817703EE0AC469D00DB59EE7799F0D935C41DAF9F7826B33DFC76F1E95364B3088ABB23FDDF7BC2D2

为什么选择 HQC 而不是 BIKE?

嗯,它们都是基于代码的方法。BIKE 和 HQC 具有相似的性能水平,但对于 McEliece 来说,密钥生成非常慢,但封装速度与 BIKE 和 HQC 大致相同 [这里]:

对于密钥长度,BIKE 和 HQC 再次具有相似的密钥长度(例如 BIKE 中公钥为 3083 字节),但 McEliece 的公钥很大(但私钥很小) [这里]:

我们可以看到 BIKE 的密钥比 HQC 小,但 HQC 具有更好的性能,因此 NIST 似乎更看重性能而不是更小的密钥。

结论

因此,将与 ECDH 长时间告别,并迎来 ML-KEM 和 HQC。这是我对未来可能迁移的修订迁移图:

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

0 条评论

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