關于 Kyber:抗量子密碼算法 Kyber 詳解

一、基本概念

后量子密碼學(PQC)
│
├──> 是一個領域(研究如何在“量子時代”保護數據安全)
│
└──> Kyber 是這個領域中設計出來的一個“抗量子密碼算法”└──> Kyber 是用于加密密鑰交換的算法(叫 KEM)

>后量子密碼學(Post-Quantum Cryptography, PQC)

這是一個“研究領域/學科”,目標是:設計在“未來量子計算機”也無法破解的密碼算法。

因為像 RSA、ECC(橢圓曲線加密)這類傳統算法,如果未來有量子計算機,會被很快破解(因為 Shor 算法可以高效分解大數)。

所以現在提前研究“后量子密碼學”,防止將來量子計算一來,所有通信瞬間不安全。

>抗量子密碼算法(Post-Quantum Algorithms)

是后量子密碼學這個領域研究出來的“成果”之一,也叫:

  • 抗量子密碼算法

  • 后量子密碼算法

  • 有時簡稱“PQC算法”

它是具體的算法,用來實現:

  • 密鑰交換

  • 數字簽名

  • 加密傳輸

而這些算法的設計目標就是:在量子計算機出現后依然安全。

常見的有:

算法類型算法名稱
密鑰交換 / 加密Kyber, NTRU, FrodoKEM
簽名算法Dilithium, Falcon, SPHINCS+

>Kyber 是什么?

Kyber 屬于后量子密碼算法,一種基于格(lattice)密碼學的密鑰封裝機制(KEM),由 NIST 選為后量子密碼標準,用于安全密鑰交換

你可以把它當成是“后量子密碼學”這個領域里的一種技術實現,目標是:

  • 在量子時代 安全地協商出對稱密鑰(例如 HTTPS 用的 AES 密鑰)

Kyber 有以下幾個等級:

名稱安全級別(對抗強度)
Kyber512輕量級安全(類比 AES-128)
Kyber768中等安全
Kyber1024高強度安全(類比 AES-256)
  • 不是加密消息,而是用于共享對稱密鑰(適合 TLS、VPN、SSH 等應用)

  • 安全性基于數學難題:學習帶噪聲問題(LWE) 的模塊變種

  • 實現快速、高效、參數可擴展


二、Kyber 使用流程(API)

Kyber 的典型使用涉及三個 API:

int crypto_kem_keypair(unsigned char *pk, unsigned char *sk);
int crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk);
int crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk);
步驟函數說明
1crypto_kem_keypair()生成公鑰 + 私鑰
2crypto_kem_enc()封裝密鑰:用公鑰生成密文 ct + 對稱密鑰 ss
3crypto_kem_dec()解封裝密鑰:用私鑰解密 ct 得到密鑰 ss

三、數學原理

Kyber 的加密基于以下數學結構:

1)模數與多項式

  • 所有計算都在有限環中進行:
    $Z_q[X]/(X^n + 1)$

  • 常用參數:$q = 3329$,$n = 256$,即多項式系數范圍 [0, 3328]

2)模式(Module)LWE

Kyber 不是普通 LWE,而是模塊化版本:Module-LWE(模塊學習帶噪聲)

  • 模塊結構:A 是 $k \times k$ 多項式矩陣,s 是多項式向量

  • 密文結構:一對多項式向量(u, v)


四、核心結構與流程詳解

我們用 Kyber768 為例。

1)crypto_kem_keypair

步驟:

  1. 隨機生成種子 seed

  2. 生成公共矩陣 $A$,秘密向量 $s$ 和錯誤向量 $e$

  3. 計算公鑰:$pk = A·s + e$

  4. 私鑰保留原始 $s$,并包含 $pk$、哈希(pk)、隨機值 z

對應代碼:

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>#define KYBER_K 2       // 向量維度(Kyber512=2,Kyber768=3,Kyber1024=4)
#define N 256           // 多項式長度(固定為 256)
#define Q 3329          // Kyber 模數// --------- 多項式與多項式向量結構定義 ---------
typedef struct {int16_t coeffs[N]; // 多項式系數
} poly;typedef struct {poly vec[KYBER_K]; // 多項式向量
} polyvec;// --------- 簡化的隨機數與噪聲生成 ---------
void get_noise(poly *r) {for (int i = 0; i < N; i++) {r->coeffs[i] = rand() % 10 - 5; // 簡化為 [-5, 4] 區間的噪聲}
}void polyvec_getnoise(polyvec *v) {for (int i = 0; i < KYBER_K; i++) {get_noise(&v->vec[i]);}
}// --------- 簡化的矩陣 A 生成 ---------
void gen_matrix(polyvec A[KYBER_K], const uint8_t *seed) {srand(seed[0]); // 簡化用種子第一個字節設置隨機種子for (int i = 0; i < KYBER_K; i++) {for (int j = 0; j < KYBER_K; j++) {get_noise(&A[i].vec[j]); // 用噪聲函數代替真實偽隨機生成}}
}// --------- 多項式乘加運算:N = A * s + e ---------
void poly_muladd(polyvec *res, polyvec A[KYBER_K], polyvec *s, polyvec *e) {for (int i = 0; i < KYBER_K; i++) {for (int j = 0; j < N; j++) {res->vec[i].coeffs[j] = e->vec[i].coeffs[j];for (int k = 0; k < KYBER_K; k++) {res->vec[i].coeffs[j] += A[i].vec[k].coeffs[j] * s->vec[k].coeffs[j];res->vec[i].coeffs[j] %= Q;}}}
}// --------- 打包函數(這里只做打印模擬) ---------
void pack(polyvec *pk) {printf("Public Key:\n");for (int i = 0; i < KYBER_K; i++) {for (int j = 0; j < 8; j++) { // 只打印前8個系數printf("%d ", pk->vec[i].coeffs[j]);}printf("...\n");}
}// --------- 存儲函數(這里也做打印) ---------
void store(polyvec *s, const char *name) {printf("Stored %s (first 8 coeffs):\n", name);for (int j = 0; j < 8; j++) {printf("%d ", s->vec[0].coeffs[j]);}printf("...\n");
}// --------- 主函數:執行密鑰生成 ---------
int main() {polyvec s, e, pk;polyvec A[KYBER_K];uint8_t seed[32] = {42}; // 模擬種子值gen_matrix(A, seed);             // 生成公共矩陣 Apolyvec_getnoise(&s);            // 私鑰 s 加噪聲polyvec_getnoise(&e);            // 誤差項 e 加噪聲poly_muladd(&pk, A, &s, &e);     // pk = A * s + epack(&pk);                       // 打包公鑰(這里只是打印)store(&s, "sk");                 // 存儲私鑰(這里只是打印)return 0;
}

2)crypto_kem_enc

  • 輸入公鑰 pk

  • 生成臨時隨機密鑰 m

  • 哈希 m 與 pk 得種子

  • 生成 ephemerals:sp, e1, e2

  • 計算密文:

    • $u = A^T · sp + e1$

    • $v = pk^T · sp + e2 + m·(q/2)$

  • 輸出密文 + 哈希(m)

crypto_kem_enc 核心實現(對應 Kyber 規范):

#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include "params.h"
#include "poly.h"
#include "polyvec.h"
#include "indcpa.h"
#include "symmetric.h"
#include "randombytes.h"
#include "hash.h"// 輸出:ct = 密文,ss = 會話密鑰,輸入 pk
void crypto_kem_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk) {uint8_t buf[2 * KYBER_SYMB];   // 存放 m || H(pk)uint8_t kr[2 * KYBER_SYMB];    // 存放 H(m||pk) → kr[0:32]=K, kr[32:64]=coinspolyvec sp, pkpv, e1, at[KYBER_K];poly v, e2, m;uint8_t seed[KYBER_SYMB];// 1)生成臨時密鑰 mrandombytes(buf, KYBER_SYMB);               // 生成隨機 m(長度32字節)hash_h(buf, buf, KYBER_SYMB);               // m ← H(m) 做 domain separation// 2)拼接 m || H(pk),用于生成加密種子 coinshash_h(buf + KYBER_SYMB, pk, KYBER_INDCPA_PUBLICKEYBYTES); hash_g(kr, buf, 2 * KYBER_SYMB);            // kr ← H(m || H(pk))// 3)解包公鑰(提取多項式向量 pkpv)unpack_pk(&pkpv, seed, pk);                 // pk ← 多項式 pkpv + seed// 4)生成矩陣 A^Tgen_matrix(at, seed, 1);                    // A^T ← transpose(A)// 5)用 kr[32:64] 生成臨時私鑰 sp 與誤差項 e1, e2polyvec_getnoise_eta1(&sp, kr + KYBER_SYMB, 0);polyvec_getnoise_eta1(&e1, kr + KYBER_SYMB, KYBER_K);get_noise_eta2(&e2, kr + KYBER_SYMB, 2 * KYBER_K);// NTT 變換polyvec_ntt(&sp);polyvec_ntt(&pkpv);// 6)計算 u = A^T · sp + e1polyvec_pointwise_acc_montgomery(&v, &pkpv, &sp); // v = pk^T * sppolyvec_frommont(&e1);polyvec_add(&e1, &e1, &at[0]); // 實際實現是循環內完成 A^T·sp + e1polyvec_reduce(&e1); // 模 Q 歸約pack_ciphertext(ct, &e1, &v);  // u 部分// 7)v = pk^T·sp + e2 + m*(q/2)poly_frommsg(&m, buf);                // m → 多項式 m(位乘 q/2)poly_add(&v, &v, &e2);                // v += e2poly_add(&v, &v, &m);                 // v += m·(q/2)poly_reduce(&v);pack_ciphertext(ct, &e1, &v);         // v 部分合并進 ct// 8)會話密鑰 ss = H(K || H(ciphertext))hash_h(kr + KYBER_SYMB, ct, KYBER_CIPHERTEXTBYTES); // kr[32:64] = H(ct)kdf(ss, kr, 2 * KYBER_SYMB);                        // ss = KDF(K || H(ct))
}

3)crypto_kem_dec

  • 輸入密文 + sk,恢復 s

  • 解密計算:

    • 計算 $m' = v - u·s$

  • 從 $m'$ 派生共享密鑰 ss'

crypto_kem_dec() 的核心解密代碼:

void crypto_kem_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk) {uint8_t buf[2 * KYBER_SYMB];   // 臨時緩沖區,存儲 m' || H(c)uint8_t kr[2 * KYBER_SYMB];    // kr = K || H(c)polyvec sp, bp, skpv;poly v, mp;const uint8_t *pk = sk + KYBER_INDCPA_SECRETKEYBYTES; // 從 sk 中提取出 pkconst uint8_t *hpk = pk + KYBER_INDCPA_PUBLICKEYBYTES;// 1)從 sk 解包私鑰 s 向量unpack_sk(&skpv, sk); // 恢復 polyvec s ← sk// 2)解包密文 ct 得到 u、vunpack_ciphertext(&bp, &v, ct); // u = bp, v = v// 3)NTT 變換polyvec_ntt(&bp);// 4)m' = v - (u ? s)polyvec_pointwise_acc_montgomery(&mp, &skpv, &bp); // mp = u ? spoly_invntt_tomont(&mp);                           // 逆NTTpoly_sub(&mp, &v, &mp);                            // m' = v - u·spoly_reduce(&mp);                                  // 模Q規約poly_tomsg(buf, &mp);                              // 提取消息 m' → buf[0:32]// 5)拼接 m' || H(pk)memcpy(buf + KYBER_SYMB, hpk, KYBER_SYMB);         // 拼接 H(pk)// 6)哈希派生 kr = H(m' || H(pk))hash_g(kr, buf, 2 * KYBER_SYMB);                   // kr = K || coins// 7)計算 H(ct) 加入 kr 中hash_h(kr + KYBER_SYMB, ct, KYBER_CIPHERTEXTBYTES); // kr[32:64] = H(c)// 8)派生共享密鑰 ss = KDF(kr)kdf(ss, kr, 2 * KYBER_SYMB);                       // ss ← H(K || H(c))
}

五、源碼結構分析(以 PQClean 為例)

路徑

PQClean/crypto_kem/kyber768/clean/
├── api.h                // 接口聲明
├── kem.c                // 封裝主流程(keypair, enc, dec)
├── indcpa.c / .h        // CPA-secure加密流程(核心)
├── poly.c / .h          // 多項式運算實現
├── ntt.c                // 快速傅里葉變換(NTT)
├── randombytes.c        // 隨機數生成
├── verify.c             // 常量時間比較等

六、逆向分析建議

目標識別

項目逆向技巧
crypto_kem_keypairGhidra 查找調用偽隨機函數,識別 spk 生成
crypto_kem_enc重點分析 polyvec 結構、模運算、hash 種子生成
crypto_kem_dec跟蹤 v - u·s 運算,是否有解密中間態泄露
隨機數源Hook randombytes,可偽造 predictable key

Frida 示例:Hook 密鑰生成

Interceptor.attach(Module.findExportByName(null, "crypto_kem_keypair"), { // Hook 到導出函數 crypto_kem_keypair 的地址onEnter(args) { // 函數執行前觸發,args 是參數數組console.log("keypair called"); // 輸出日志,表示函數開始執行},onLeave(retval) { // 函數執行結束后觸發,retval 是返回值console.log("keypair done"); // 輸出日志,表示函數執行完畢}
});

IDA/Ghidra 靜態分析:

  • 搜索 CRYPTO_PUBLICKEYBYTES,定位緩沖區分配

  • 查找 NTT 函數(多使用查表或優化運算)


七、實現中可能存在的風險點

風險類型描述
隨機數問題偽隨機數不安全可被預測
緩沖區未擦除私鑰殘留在內存中
錯誤信息可側信道攻擊不同錯誤路徑返回不同信息量
非常量時間操作對輸入密文不同響應時間,導致 side-channel 攻擊
緩存攻擊模式化訪存、FFT變換泄露私鑰結構

八、總結重點

解釋
算法分類Kyber 是 lattice-based,加密目標是密鑰,不是數據
模數操作所有乘法/加法在模 q = 3329 上進行
多項式向量核心運算單位是 polyvec,即多個多項式組成的向量
安全來源基于 Module-LWE 難題,不怕量子算法(Shor/Grover)
實戰方向TLS握手、Frida hook、NTT逆向、種子分析、內存提取

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87815.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87815.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87815.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何保障具身智能系統級安全?鴻道OS給出中國方案

由東土科技自主研發完成的鴻道&#xff08;Intewell&#xff09;工業操作系統正式發布。東土科技董事長李平與該公司全資子公司光亞鴻道總經理鄒露君在接受第一財經等采訪時&#xff0c;解釋了如何通過操作系統為具身智能產業提供底層支撐&#xff0c;解決產業規模化落地的安全…

深入淺出:JavaScript ES6中類(Class)的革新與實踐

深入淺出&#xff1a;JavaScript ES6中類&#xff08;Class&#xff09;的革新與實踐 在JavaScript的發展歷程中&#xff0c;ES6&#xff08;ECMAScript 2015&#xff09;無疑是一個里程碑式的版本。它不僅引入了let、const、箭頭函數等特性&#xff0c;更通過**類&#xff08…

華大北斗TAU804M-N2B0雙頻單北斗高精度定位模塊 100%國產雙頻北斗 打破u-blox技術壟斷

華大北斗TAU804M-N2B0雙頻單北斗模塊深度解析 1. 產品定位 TAU804M-N2B0 是華大北斗&#xff08;HDSC&#xff09;推出的 雙頻單北斗高精度定位模塊&#xff0c;支持 B1IB2a雙頻信號接收&#xff0c;專為 高精度定位、抗多徑干擾 場景設計&#xff0c;是北斗三號系統應用的標桿…

IP證書申請攻略細則,有何作用?

IP證書申請攻略細則及作用解析 一、IP證書的作用 數據加密傳輸 IP證書通過SSL/TLS協議對客戶端與服務器之間的數據進行加密&#xff0c;防止數據在傳輸過程中被竊取或篡改&#xff0c;適用于物聯網設備、API接口、測試服務器等直接通過IP訪問的場景。 身份驗證與防偽造 瀏覽器…

回文鏈表C++

給你一個單鏈表的頭節點 head &#xff0c;請你判斷該鏈表是否為回文鏈表。如果是&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 時間復雜度較大的解法&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* Lis…

限流系列之三:TDMQ for Apache Pulsar 限流技術深度解析

導語 在高速、高吞吐量的消息處理場景中&#xff0c;TDMQ Pulsar 版以其卓越的性能和可擴展性成為眾多企業的首選。然而&#xff0c;隨著生產者和消費者以極高的速度生產/消費大量消息&#xff0c;服務器資源如 CPU、內存、網絡及磁盤 IO 等可能會面臨飽和風險。為此&#xff…

非研發部門參與產品開發過程的價值體現

漢捷咨詢 胡紅衛 企業已經越來越意識到新產品開發項目需要市場、銷售、制造、采購、服務、財務等非研發部門的參與&#xff0c;嘗試建立跨部門的項目組&#xff0c;安排相關人員參與項目&#xff0c;但是效果如何呢&#xff1f;在漢捷咨詢對很多企業調研診斷過程中&#xff0c;…

Kafka的存儲與索引:數據處理的底層奧秘

一、引言 Kafka 之所以能在海量數據的傳輸和處理過程中保持高效的性能和低延遲&#xff0c;背后隱藏著眾多精妙的設計&#xff0c;而其存儲與索引機制便是其中的核心奧秘。接下來&#xff0c;讓我們深入探尋 Kafka 存儲機制的基石與架構。 二、分區與日志組織? Kafka 中的消…

大模型與搜索引擎的技術博弈及未來智能范式演進

基于認知革命與技術替代的全景綜述 一、大模型對搜索引擎的替代性分析&#xff1a;技術范式與市場重構 &#xff08;1&#xff09;技術原理的代際分野 傳統搜索引擎遵循 "爬蟲抓取 - 索引構建 - 關鍵詞排序" 的三段式架構&#xff0c;其核心是基于 PageRank 算法的…

XC7K325T數據采集卡設計原理圖:786-基于X86 CPU+XC7K325T的16路16bit 1M sps同步數據采集卡

基于X86 CPUXC7K325T的16路16bit 1M sps同步數據采集卡 一、板卡概述 板卡為緊湊型的X86FPGA的工業監測處理平臺&#xff0c;高度集成的硬件和完整的labview開發軟件&#xff0c;大大方便客戶現場使用。 二、板卡功能 板卡功能 參數內容 X86 SOM核心板 主頻 2.0GHz …

單片機3種按鍵程序消抖方法

1&#xff0c;查詢法延時模式 u8 key01;u8 x0;KEY1;while(1){if(KEY0) //"按鍵按下"{delay(10); //延時10msif(KEY0 && kdy01) //按下有10ms 且上狀態是1。即下降沿時{key00; //將上狀態置0.防止按住不放時&#xff0…

【java面試】線程篇

【java面試】線程篇 一、基礎知識1 線程與進程的區別2 并行與并發的區別3 創建線程的方式4 線程包含了哪些狀態&#xff0c;狀態之間是如何變化的&#xff1f;5 新建三個線程&#xff0c;如何保證他們按照順序執行&#xff1f;6、java中的wait和sleep方法的不同7 如何停止一個正…

RAGFlow是一個基于深度文檔理解的開源RAG引擎

RAGFlow概述 RAGFlow是一款基于深度文檔理解的開源RAG&#xff08;檢索增強生成&#xff09;引擎&#xff0c;專注于處理復雜文檔結構并提供精準的語義檢索與生成能力。其核心優勢在于結合多模態文檔解析和智能分段技術&#xff0c;優化傳統RAG流程中的信息提取與答案生成效果…

Git Commit 模板完整配置指南

Git Commit 模板完整配置指南 &#x1f4cb; 目錄 Git Commit 模板完整配置指南 &#x1f4cb; 目錄&#x1f3af; 為什么需要 Commit 模板&#x1f4dd; 推薦的 Commit 模板 標準模板格式C 項目特化模板 ?? 系統級配置 1. 創建模板文件2. 配置 Git 使用模板3. 驗證配置 &a…

【ELK服務搭建】

Ubuntu 20.04環境下部署Elastic Stack 8.18日志系統完整指南 一、環境準備 系統要求 Ubuntu 20.04 LTS硬件配置&#xff1a;4核CPU / 8GB內存 / 100GB硬盤網絡&#xff1a;需外網訪問權限 1. 基礎環境配置 首先安裝SSH服務以便遠程管理&#xff1a; # 更新軟件源 apt u…

Mac電腦 Office 2024 LTSC 長期支持版(Excel、Word、PPT)

Office 2024 mac&#xff0c;是一款是一款專為蘋果電腦用戶設計的高性能、高安全性的辦公套裝 集成了Word、Excel、PowerPoint、Outlook等經典應用&#xff0c;為用戶提供了一站式的辦公解決方案。 不僅繼承了Office系列一貫的卓越性能&#xff0c;還在功能性和用戶體驗上進行…

深入解析 Schema 在不同數據庫中的百變面孔

在數據庫的世界里&#xff0c;數據是核心資產&#xff0c;但如何高效、有序、安全地組織和理解這些數據&#xff1f;答案就是 Schema&#xff08;模式或架構&#xff09;。它如同建筑的圖紙、樂隊的樂譜&#xff0c;是數據庫的設計藍圖和運行規則手冊。今天&#xff0c;我們就來…

Python 數據分析與可視化 Day 2 - 數據清洗基礎

&#x1f3af; 今日目標 學會識別和處理缺失數據&#xff08;NaN&#xff09;學會刪除/填補缺失值清理重復數據修改列類型&#xff0c;準備數據分析 &#x1f9fc; 一、缺失值處理&#xff08;NaN&#xff09; ? 1. 檢查缺失值 import pandas as pd df pd.read_csv("…

3DS中文游戲全集下載 任天堂3DS簡介3DS第一方獨占游戲推薦

任天堂3DS 的詳細介紹&#xff0c;涵蓋其硬件特性、核心功能、游戲陣容及歷史地位&#xff1a; 3DS游戲全集下載 https://pan.quark.cn/s/dd40e47387e7 https://sink-698.pages.dev/3ds CIA CCA 等格式可用于3DS模擬器和3DS實體機 3DS 是什么&#xff1f; 全稱&#xff1a;Nin…

【Python小練習】3D散點圖

資產風險收益三維分析 背景 王老師是一名金融工程研究員&#xff0c;需要對多個資產的預期收益、風險&#xff08;波動率&#xff09;和與市場的相關性進行綜合分析&#xff0c;以便為投資組合優化提供決策依據。 代碼實現 import matplotlib.pyplot as plt from mpl_toolk…