关于 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…