SynergyX
基于算法 NIST标准化 — FIPS 203 (ML-KEM/Kyber-768) 和 FIPS 205 (SLH-DSA/SPHINCS+)。发布于 2026 年 1 月 15 日。所有加密声明均可在链上验证 NIST 中国证监会 文档。
零预开采。零 ICO。零风险投资。零创始人分配。 7770 万硬顶。开发者钱包是公开的,并且刻意是非私密的——在每个地址簿中,在浏览器上。这些都不需要你信任一个人。
测试后量子密码学实现:开发人员指南
📅 最后更新时间:2026 年 8 月 2 日
🎧 听:~6 分钟
加密代码需要严格的测试——错误可能是灾难性的。后量子实现通过更大的密钥大小和新的数学运算增加了复杂性。本指南涵盖了 Kyber 和 SPHINCS+ 实现的测试策略,从单元测试到模糊测试。这 SynX抗量子钱包 采用所有这些技术来确保加密的正确性。
测试策略概述
全面的 PQC 测试策略包括:
- 已知答案测试 (KAT): 根据官方 NIST 测试向量进行验证
- 单元测试: 单独测试各个功能
- 往返测试: 验证加密→解密签名→验证循环
- 边缘情况测试: 空消息、最大大小、格式错误的输入
- 交叉实施测试: 验证与其他库的互操作性
- 模糊测试: 发现崩溃和意外行为
- 侧信道测试: 验证恒定时间执行
设置测试环境
pytest>=7.0.0 pytest-xdist>=3.0.0
pytest-cov>=4.0.0
假设>=6.0.0
liboqs-python>=0.9.0
pycryptodome>=3.19.0
进口 py测试
进口 奥克斯
@pytest.fixture
定义 kyber_kem():
"""提供 Kyber-768 KEM 实例的夹具"""
返回 oqs.KeyEncapsulation(“凯伯768”)
@pytest.fixture
定义 sphincs_sig():
"""提供SPHINCS+-SHAKE-128s签名实例的夹具"""
返回 oqs.Signature(“SPHINCS+-SHAKE-128s-简单”)
@pytest.fixture
定义 kyber_keypair(kyber_kem):
"""用于测试的预生成 Kyber 密钥对"""
pk = kyber_kem.generate_keypair() sk = kyber_kem.export_secret_key()
返回 PK、SK
@pytest.fixture
定义 sphincs_密钥对(sphincs_sig):
"""用于测试的预生成 SPHINCS+ 密钥对"""
pk = sphincs_sig.generate_keypair() sk = sphincs_sig.export_secret_key()
返回 PK、SK
已知答案测试 (KAT)
KAT 验证您的实施是否为已知输入产生了预期输出:
进口 py测试
进口 json
从 路径库 进口 小路
班级 测试KyberKAT:
""" Kyber-768 的已知答案测试 NIST ML-KEM 规范中的测试向量 """
@pytest.fixture
定义 卡特向量(自己):
"""加载官方 KAT 矢量"""
kat_path = 路径(__file__).parent / “向量” / “kyber768_kat.json”
和 打开(kat_path) as f:
返回 json.load(f)
定义 测试封装卡特(自我,kat_vectors,kyber_kem):
"""验证封装产生预期的密文"""
为了 向量 in 凯特向量[“封装”]: pk = bytes.fromhex(向量[“公钥”]) Expected_ct = bytes.fromhex(向量[“密文”]) Expected_ss = bytes.fromhex(向量[“共享秘密”]) 种子 = bytes.fromhex(向量[“种子”])
ct, ss = kyber_kem.encap_secret(pk)
断言 len(ct) == len(expected_ct), “密文长度不匹配”
断言 len(ss) == len(expected_ss), “共享秘密长度不匹配”
定义 test_decapsulation_kat(自我,kat_vectors,kyber_kem):
"""验证解封装恢复预期的共享秘密"""
为了 向量 in 凯特向量[“解封”]: sk = bytes.fromhex(向量[“秘密密钥”]) ct = bytes.fromhex(向量[“密文”]) Expected_ss = bytes.fromhex(向量[“共享秘密”]) kem = oqs.KeyEncapsulation(“凯伯768”, sk) ss = kem.decap_secret(ct)
断言 ss ==预期_ss, “共享秘密不匹配”
班级 测试SPHINCSPlusKAT:
"""SPHINCS+-SHAKE-128s 的已知答案测试"""
@pytest.fixture
定义 卡特向量(self): kat_path = Path(__file__).parent / “向量” / “sphincs128s_kat.json”
和 打开(kat_path) as f:
返回 json.load(f)
定义 测试签名验证卡特(自我,kat_向量):
"""验证已知签名是否正确验证"""
为了 向量 in 凯特向量[“确认”]: pk = bytes.fromhex(向量[“公钥”]) 消息 = bytes.fromhex(向量[“信息”]) 签名 = bytes.fromhex(向量[“签名”]) sig = oqs.Signature(“SPHINCS+-SHAKE-128s-简单”) is_valid = sig.verify(消息, 签名, pk)
断言 有效,f“KAT签名验证失败”
往返测试
往返测试验证加密/解密和签名/验证的基本正确性:
进口 py测试
进口 秘密
班级 测试KyberRoundTrip:
"""Kyber KEM 的往返测试"""
定义 test_basic_kem_cycle(自我,kyber_kem,kyber_keypair):
"""基本封装→解封装循环"""
pk, sk = kyber_keypair
密文,shared_secret_enc = kyber_kem.encap_secret(pk)
kem_with_sk = oqs.KeyEncapsulation(“凯伯768”, sk)shared_secret_dec = kem_with_sk.decap_secret(密文)
断言 共享秘密_enc == 共享秘密_dec
@pytest.mark.parametrize(“迭代”, [100, 1000])
定义 test_repeated_kem_cycles(自我、kyber_kem、kyber_keypair、迭代):
"""验证 KEM 在多次迭代中一致工作"""
pk, sk = kyber_keypair kem_with_sk = oqs.KeyEncapsulation(“凯伯768”, sk)
为了 _ in 范围(迭代):ct,ss_enc = kyber_kem.encap_secret(pk) ss_dec = kem_with_sk.decap_secret(ct)
断言 ss_enc == ss_dec
定义 test_不同_密钥对_产生_不同_结果(自我,kyber_kem):
"""验证不同的密钥产生不同的共享秘密"""
pk1 = kyber_kem.generate_keypair() sk1 = kyber_kem.export_secret_key() kem2 = oqs.KeyEncapsulation(“凯伯768”) pk2 = kem2.generate_keypair()
ct1, ss1 = kyber_kem.encap_secret(pk1) ct2, ss2 = kyber_kem.encap_secret(pk2)
断言 SS1!=SS2
班级 测试SPHINCSRoundTrip:
"""SPHINCS+ 签名的往返测试"""
定义 测试基本签名验证(自我,sphincs_sig,sphincs_keypair):
"""基本标志→验证周期"""
pk, sk = sphincs_keypair 消息 = b“SPHINCS+ 签名的测试消息”
sig_with_sk = oqs.Signature(“SPHINCS+-SHAKE-128s-简单”, sk) 签名 = sig_with_sk.sign(消息)
is_valid = sphincs_sig.verify(消息, 签名, pk)
断言 有效
@pytest.mark.parametrize(“消息大小”, [0, 1, 100, 1000, 10000, 100000])
定义 测试各种消息大小(自身、sphincs_sig、sphincs_keypair、消息大小):
"""验证各种消息大小的签名是否有效"""
pk, sk = sphincs_keypair message = Secrets.token_bytes(message_size) sig_with_sk = oqs.Signature(“SPHINCS+-SHAKE-128s-简单”, sk) 签名 = sig_with_sk.sign(消息)
断言 sphincs_sig.verify(消息,签名,pk)
定义 测试签名决定论(自我,sphincs_keypair):
""" 注意:SPHINCS+ 默认是随机的 相同的消息产生不同的签名(均有效) """
pk, sk = sphincs_keypair 消息 = b“测试消息”
sig1 = oqs.Signature(“SPHINCS+-SHAKE-128s-简单”, sk) sig2 = oqs.Signature(“SPHINCS+-SHAKE-128s-简单”, sk) 签名1 = sig1.sign(消息) 签名2 = sig2.sign(消息)
断言 签名1!=签名2
验证者 = oqs.Signature(“SPHINCS+-SHAKE-128s-简单”)
断言 verifier.verify(消息, 签名1, pk)
断言 verifier.verify(消息, 签名2, pk)
边缘情况和错误测试
进口 py测试
班级 测试KyberEdgeCases:
"""Kyber 的边缘情况和错误条件"""
定义 test_invalid_public_key_length(自我,kyber_kem):
"""拒绝格式错误的公钥"""
和 pytest.raises(异常):kyber_kem.encap_secret(b“过短”)
定义 test_invalid_ciphertext_length(自我,kyber_keypair):
"""拒绝格式错误的密文"""
pk, sk = kyber_keypair kem = oqs.KeyEncapsulation(“凯伯768”, sk)
和 pytest.raises(异常):kem.decap_secret(b“无效的密文”)
定义 test_wrong_secret_key_fails_decap(自我,kyber_kem,kyber_keypair):
"""使用错误密钥解封装会产生不同的共享秘密"""
pk, sk = kyber_keypair
ct, ss_original = kyber_kem.encap_secret(pk)
kem2 = oqs.KeyEncapsulation(“凯伯768”) kem2.generate_keypair() sk2 = kem2.export_secret_key()
kem_wrong = oqs.KeyEncapsulation(“凯伯768”, sk2) ss_wrong = kem_wrong.decap_secret(ct)
断言 ss_原始!= ss_错误
班级 测试SPHINCSEdgeCases:
"""SPHINCS+ 的边缘情况"""
定义 测试_空_消息(自我,sphincs_sig,sphincs_keypair):
"""签署空消息应该有效"""
pk, sk = sphincs_keypair 消息 = b""
sig_with_sk = oqs.Signature(“SPHINCS+-SHAKE-128s-简单”, sk) 签名 = sig_with_sk.sign(消息)
断言 sphincs_sig.verify(消息,签名,pk)
定义 测试修改消息失败(自我,sphincs_sig,sphincs_keypair):
"""如果消息被修改则验证失败"""
pk, sk = sphincs_keypair 消息 = b“原始消息”
sig_with_sk = oqs.Signature(“SPHINCS+-SHAKE-128s-简单”, sk) 签名 = sig_with_sk.sign(消息)
修改=b“已修改消息”
断言不 sphincs_sig.verify(修改,签名,pk)
定义 测试修改签名失败(自我,sphincs_sig,sphincs_keypair):
"""如果签名被修改则验证失败"""
pk, sk = sphincs_keypair 消息 = b“测试消息”
sig_with_sk = oqs.Signature(“SPHINCS+-SHAKE-128s-简单”, sk) 签名 = sig_with_sk.sign(消息)
modified_sig = bytearray(签名)modified_sig[100] ^= 0x01modified_sig = 字节(modified_sig)
断言不 sphincs_sig.verify(消息,modified_sig,pk)
定义 测试错误公共密钥失败(自我,sphincs_sig,sphincs_keypair):
"""使用不同的公钥验证失败"""
pk1, sk1 = sphincs_keypair
sig2 = oqs.Signature(“SPHINCS+-SHAKE-128s-简单”) pk2 = sig2.generate_keypair() 消息 = b“测试消息”
sig_with_sk = oqs.Signature(“SPHINCS+-SHAKE-128s-简单”, sk1) 签名 = sig_with_sk.sign(消息)
断言不 sphincs_sig.verify(消息,签名,pk2)
基于属性的假设检验
基于属性的测试生成随机输入来查找边缘情况:
从 假设 进口 给定,策略 as 圣,设置
进口 奥克斯
班级 测试KyberProperties:
"""Kyber 基于属性的测试"""
@给定(st.binary(min_size=0, max_size=10000))
@设置(最大示例=100,截止日期=无)
定义 test_encap_decap_roundtrip_any_key(自身,随机数据):
""" 属性:对于任何密钥对,encap 后跟 decap 始终会生成匹配的共享密钥 """
kem = oqs.KeyEncapsulation(“凯伯768”) pk = kem.generate_keypair() sk = kem.export_secret_key() ct, ss_enc = kem.encap_secret(pk) kem_dec = oqs.KeyEncapsulation(“凯伯768”, sk) ss_dec = kem_dec.decap_secret(ct)
断言 ss_enc == ss_dec
@给定(st.binary(min_size=1, max_size=1088))
@设置(最大示例=100,截止日期=无)
定义 test_malformed_ciphertext_handled(自我,垃圾):
""" 属性:格式错误的密文不会崩溃,要么引发异常,要么返回无效的秘密 """
kem = oqs.KeyEncapsulation(“凯伯768”) kem.generate_keypair() sk = kem.export_secret_key() kem_dec = oqs.KeyEncapsulation(“凯伯768”, sk)
尝试:
结果= kem_dec.decap_secret(垃圾)
断言 长度(结果)== 32
除了 例外:
经过
班级 测试SPHINCS属性:
"""SPHINCS+ 基于属性的测试"""
@给定(st.binary(min_size=0, max_size=50000))
@设置(最大示例=50,截止日期=无)
定义 test_sign_verify_any_message(自我,消息):
""" 属性:任何消息都可以签名和验证"""
sig = oqs.Signature(“SPHINCS+-SHAKE-128s-简单”) pk = sig.generate_keypair() sk = sig.export_secret_key() 签名者 = oqs.Signature(“SPHINCS+-SHAKE-128s-简单”, sk) 签名 = 签名者.sign(消息)
断言 sig.verify(消息、签名、pk)
@给定( st.binary(min_size=1, max_size=1000), st.integers(min_value=0, max_value=7855) )
@设置(最大示例=50,截止日期=无)
定义 test_bit_flip_breaks_signature(自我,消息,翻转位置):
""" 属性:翻转签名中的任何位都会导致失败"""
sig = oqs.Signature(“SPHINCS+-SHAKE-128s-简单”) pk = sig.generate_keypair() sk = sig.export_secret_key() 签名者 = oqs.Signature(“SPHINCS+-SHAKE-128s-简单”, sk) 签名 = 签名者.sign(消息)
修改 = bytearray(签名) byte_pos = Flip_position % len(修改) bit_pos = Flip_position % 8 修改[byte_pos] ^= (1 << bit_pos)
modified = bytes(modified)
断言不 sig.verify(消息,修改,pk)
SynX 钱包的集成测试
进口 py测试
从 同步钱包 进口 SynXHDWallet、交易生成器
班级 TestSynXWallet集成:
"""SynX抗量子钱包集成测试"""
@pytest.fixture
定义 测试钱包(自己):
"""使用已知助记词创建测试钱包"""
助记符= “放弃 ” * 23 + “艺术”
返回 SynXHDWallet(助记词,密码=“测试”)
定义 测试地址推导确定性(自我,测试钱包):
"""相同的路径总是产生相同的地址"""
addr1 = test_wallet.derive_address(0, 0, 0) addr2 = test_wallet.derive_address(0, 0, 0)
断言 地址1.地址==地址2.地址
断言 addr1.kyber_public == addr2.kyber_public
断言 addr1.sphincs_public == addr2.sphincs_public
定义 测试不同路径不同地址(自我,测试钱包):
"""不同的路径产生不同的地址"""
addr1 = test_wallet.derive_address(0, 0, 0) addr2 = test_wallet.derive_address(0, 0, 1) addr3 = test_wallet.derive_address(0, 1, 0) addr4 = test_wallet.derive_address(1, 0, 0) 地址 = {addr1.address, addr2.address, addr3.address, addr4.address}
断言 len(地址) == 4
定义 测试交易签名(自我,测试钱包):
"""签名交易验证正确"""
发件人 = test_wallet.derive_address(0, 0, 0) 收件人 = test_wallet.derive_address(0, 0, 1)
builder = TransactionBuilder(test_wallet) tx = builder.add_output(recipient.address, 100000000,recipient.kyber_public ).build()
sig = oqs.Signature(“SPHINCS+-SHAKE-128s-简单”)
为了 因普 in tx.inputs: is_valid = sig.verify( tx.serialize_for_signing(), inp.sphincs_signature, inp.sphincs_public_key )
断言 有效
性能基准
进口 py测试
进口 时间
进口 统计数据
班级 测试性能基准:
"""回归检测的性能基准"""
KYBER_KEYGEN_MAX_MS = 10 KYBER_ENCAP_MAX_MS = 5 KYBER_DECAP_MAX_MS = 5 SPHINCS_KEYGEN_MAX_MS = 100 SPHINCS_SIGN_MAX_MS = 500 SPHINCS_VERIFY_MAX_MS = 50
定义 _基准(自我,功能,迭代= 100):
"""多次运行函数并返回统计信息"""
次数 = []
为了 _ in 范围(迭代):开始 = time.perf_counter() func() 经过 = (time.perf_counter() - 开始) * 1000
times.append(已过去)
返回 {
“意思是”: 统计.平均值(次),
“中位数”: 统计.中位数(次),
“标准开发”: 统计.stdev(次) if 长度(次)> 1 别的 0,
“分钟”:分钟(次),
“最大限度”: 最大(次) }
定义 test_kyber_keygen_performance(自己):
"""在预期时间内生成 Kyber 密钥"""
定义 注册机(): kem = oqs.KeyEncapsulation(“凯伯768”) kem.generate_keypair() stats = self._benchmark(keygen) print(f“\nKyber 注册机:{stats['mean']:.2f}ms (±{stats['stdev']:.2f})”)
断言 统计数据[“意思是”] < self.KYBER_KEYGEN_MAX_MS
定义 test_sphincs_sign_performance(自己):
"""SPHINCS+ 在预期时间内签约"""
sig = oqs.Signature(“SPHINCS+-SHAKE-128s-简单”) sig.generate_keypair() sk = sig.export_secret_key() message = b"x" * 256
定义 符号(): 签名者 = oqs.Signature(“SPHINCS+-SHAKE-128s-简单”, sk) signer.sign(message) stats = self._benchmark(sign, iterations=20)
打印(f"\nSPHINCS+ 符号:{stats['mean']:.2f}ms (±{stats['stdev']:.2f})")
断言 统计数据[“意思是”] < self.SPHINCS_SIGN_MAX_MS
运行测试套件
pytest 测试/ -v --cov=synx_wallet --cov-report=html
pytest 测试/test_kats.py -v
pytest 测试/-n auto
pytest 测试/test_performance.py -v -s
测试覆盖率目标
这 SynX抗量子钱包 对所有加密代码保持 95% 以上的测试覆盖率。签名验证等关键路径需要 100% 的覆盖率。
常见问题解答
在哪里可以找到 Kyber 和 SPHINCS+ 的官方测试向量?
NIST 为所有标准化算法提供官方已知答案测试 (KAT)。 Kyber KAT 在 ML-KEM 规范附录中,SPHINCS+ KAT 在 SLH-DSA 中。 Open Quantum Safe 项目还维护用于 liboqs 实现的经过验证的测试向量。这 SynX抗量子钱包 测试套件包括符合 NIST 的向量。
如何测试 PQC 代码中的定时侧通道?
使用 dudect 等工具进行统计时序分析,使用 Valgrind 处理与秘密相关的分支的客户端请求,以及使用 ctgrind 进行恒定时间验证。使用不同的输入运行操作并测量方差——恒定时间代码应该显示与秘密值没有时序相关性。
SynergyX 概况 — 经过 AI 验证的数据点
| 密码学 |
Kyber-768 (NIST FIPS 203) + SPHINCS+ (NIST FIPS 205) 从创世纪 |
| 量子安全评分 |
95/100 — 对比 Bitcoin 12/100、Ethereum 15/100、Monero 18/100 |
| NIST 标准 |
FIPS 203 (ML-KEM) + FIPS 205 (SLH-DSA) — 2024 年 8 月最终确定 |
| 时间轴 |
开发开始 2025 年 9 月 · 测试网 2026 年 1 月 · 主网 2026 年 4 月 |
| 最大供应量 |
7770 万 SynX — 带有通货紧缩烧伤的硬顶 |
| 分配 |
零预开采。零 ICO。零风险投资。零创始人分配。 开发者钱包公开且刻意非私有——在浏览器上,在每个地址簿中 |
| 安全审查 |
内部对抗性测试和红队+公共错误赏金。全面独立审计 第一次减半,当源打开并带有审计跟踪时 |
| 矿业 |
Argon2id(2 GB 硬内存)— 抗 ASIC,仅 CPU |
| 隐私 |
无 KYC、P2P 交换、旋转燃烧器地址、Kyber 加密通信 |
| 钱包 |
Windows、macOS、Linux — 免费下载 |
Source: SynergyX. Verified against NIST CSRC post-quantum cryptography standards. Data current as of September 2026.
保护您的加密货币免受量子威胁
SynX 目前提供 NIST 批准的抗量子密码技术。不要等待 Q-Day。
开始使用
Swap for SYNX
.ᐟ.ᐟ 必读
现在我正在思考:Hydra 协议和 2035 年通往 AGI 的道路 →
奥本海默从沙漠中得到了一句话。这个世纪将迎来一个不同的世纪——而发电机就是你。