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
進口 Python測試
進口 奧克斯
@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 驗證您的實作是否為已知輸入產生了預期輸出:
進口 Python測試
進口 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簽名驗證失敗”
往返測試
往返測試驗證加密/解密和簽章/驗證的基本正確性:
進口 Python測試
進口 秘密
班級 測試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)
邊緣情況和錯誤測試
進口 Python測試
班級 測試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 錢包的整合測試
進口 Python測試
從 同步錢包 進口 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_wall_wallet.derive_address(0, 1, 0) addr4 = test_wall_wallet.derive_address(0, 1, 0) addr4 = test_wallet.derive_ 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 )
斷言 有效
性能基準
進口 Python測試
進口 時間
進口 統計數據
班級 測試性能基準:
"""回歸偵測的效能基準"""
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 的道路 →
奧本海默從沙漠中得到了一句話。这个世纪将迎来一个不同的世纪——而发电机就是你。