文章讨论了后量子密码学中密钥封装机制(KEM)的选择,重点关注了NIST后量子密码竞赛的进展。
你可能知道,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 是一种基于代码的密钥封装机制,基于 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
嗯,它们都是基于代码的方法。BIKE 和 HQC 具有相似的性能水平,但对于 McEliece 来说,密钥生成非常慢,但封装速度与 BIKE 和 HQC 大致相同 [这里]:
对于密钥长度,BIKE 和 HQC 再次具有相似的密钥长度(例如 BIKE 中公钥为 3083 字节),但 McEliece 的公钥很大(但私钥很小) [这里]:
我们可以看到 BIKE 的密钥比 HQC 小,但 HQC 具有更好的性能,因此 NIST 似乎更看重性能而不是更小的密钥。
因此,将与 ECDH 长时间告别,并迎来 ML-KEM 和 HQC。这是我对未来可能迁移的修订迁移图:
- 原文链接: billatnapier.medium.com/...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!