[终端安全]-7 后量子密码算法
本文参考资料来源:NSA Releases Future Quantum-Resistant (QR) Algorithm Requirements for National Security Systems > National Security Agency/Central Security Service > Article
Commercial National Security Algorithm Suite 2.0” (CNSA 2.0) Cybersecurity Advisory (CSA)
(第6文终端安全之应用安全,稍后时日补上)
1 CNSA2.0
CISA、NIST 和 NSA 敦促各个行业安全应用开始为实施后量子密码学做准备。NSA发布了《商业国家安全算法套件 2.0》(CNSA 2.0) 未来抗量子 (QR) 算法要求,如下所示:

备注:
Crystal-Kyber算法标准,可参照NIST.FIPS.203.ipd.pdf(draft)
Crystal-Dilithium算法标准,可参照NIST.FIPS.204.ipd.pdf(draft)
附:以下为CNSA1.0发布算法需求

2 Crystal-Kyber
Crystal-Kyber 是一种基于格的加密方案用于密钥封装机制(KEM),可高效安全且适应未来量子计算攻击。
1)数学原理
Crystal-Kyber 基于Learning with Errors(LWE)和Ring-LWE问题,这些问题在量子计算机上被认为是难解的。Ring-LWE 难题,对于环 R =Z[x]/(x^n + 1) 和模数q,给定一个秘密向量 s∈R_q 和多个采样 (a_i, b_i = a_i s + e_i)模q,其中 a_i 是从 R_q 中均匀分布的随机元素,e_i是从某个误差分布中采样的错误向量,目标是从 (a_i, b_i) 中恢复 s 。
1.1)公钥生成:pk = a s + e mod q
1.2)加密过程:c_1 = a r + e_1 mod q;c_2 = pk r + e_2 + m⌊q/2⌋mod q
1.3)解密过程:m' = c_2 - s c_1 mod q;m = Decode(m')
2)算法步骤
2.1)参数生成:模数 q 、环的度 n 和误差分布χ。
2.2)密钥生成:
- 生成一个随机多项式 a ∈ R_q 。
- 选择秘密多项式 s, e 从χ中采样。
- 计算公钥 pk = a s + e 。
- 私钥为 sk = s 。
2.3)加密:
- 选择随机多项式 r, e_1, e_2 从χ中采样。
- 计算密文 c_1 = a r + e_1 和 c_2 = pk r + e_2 + m⋅ ⌊q/2⌋,其中m 是明文消息。
2.4)解密:
- 计算 m' = c_2 - s c_1 。
- 解码 m' 得到明文消息m 。
3)硬件实现
多项式运算单元:实现多项式乘法、加法、减法和模运算;使用Number Theoretic Transform (NTT)加速多项式乘法。
随机数生成器:用于生成密钥和随机噪声。
模运算模块:实现模q运算,用于多项式系数的约束。
存储单元:用于存储密钥、多项式系数和中间运算结果。
3 Crystal-Dilithium
Crystal-Dilithium 是一种基于格的数字签名方案,它的设计目标是提供高效和安全的签名和验证过程,适应未来量子计算攻击。
1)数学原理
Crystal-Dilithium 基于Module Learning with Errors(Module-LWE)和Module Short Integer Solution(Module-SIS)难题。对于环R =Z[x]/(x^n+1)和模数q,Module-LWE 问题定义如下:给定一个秘密矩阵S∈Rqk×l和多个采样A_i, B_i = A_i S + E_i模q,其中A_i是从 Rqk×l中均匀分布的随机矩阵,E_i 是从某个误差分布中采样的错误矩阵,目标是从(A_i, B_i)中恢复S。
1.1)公钥生成:pk = A S + E mod q
1.2)签名过程:W = A y mod q; c = H(W, μ); z = y + c S mod q
1.3)验证过程:W' = A z - c pk mod q;验证 c = H(W', μ)
2)算法步骤
2.1)参数生成:
- 模数 q 、环的度 n 和误差分布χ。
- 选择参数k 和l 。
2.2)密钥生成:
- 生成随机矩阵A ∈Rqk×l。
- 选择秘密矩阵 S, E 从χ 中采样。
- 计算公钥 pk = A S + E 。
- 私钥为 sk = S 。
2.3)签名:
- 选择随机矩阵 y 从某个分布中采样。
- 计算 W = A y 并计算 c = H(W, μ),其中 H是哈希函数,μ是消息。
- 计算签名 z = y + c S。如果 z 的系数太大,则重新生成 y 并重复。
- 最终签名为 (μ, z, c) 。
2.4)验签:
- 计算 W' = A z - c pk 。
- 检查 c = H(W', μ) 是否成立。如果成立验证通过;否则验证失败。
3)硬件实现
多项式运算单元:实现多项式乘法、加法、减法和模运算;使用NTT加速多项式乘法。
哈希单元:实现SHA-3和Keccak函数,用于消息哈希和挑战生成。
随机数生成器:用于生成随机挑战和密钥。
存储单元:用于存储密钥、多项式系数、哈希值和中间运算结果。
4 基于哈希的数字签名算法
XMSS(eXtended Merkle Signature Scheme)和 LMS(Leighton-Micali Signature)是两种基于Merkle树的哈希函数数字签名方案,被NSA推荐用于软件和固件签名。
备注:参照[终端安全]-1 总体介绍 ,[终端安全]-5 移动终端之操作系统安全,终端设备的安全启动非常重要。XMSS和LMS作为后量子密码算法,用于在软件和固件中实现安全的数字签名和认证功能以防止恶意软件或未经授权对固件的修改,同时可应对未来可能出现的量子计算攻击。
1)XMSS
XMSS使用一棵 Merkle 树来组织多个一次性签名(WOTS+,Winternitz One-Time Signatures),每个叶子节点对应一个一次性签名的公钥,每次签名一个消息后对应的 OTS 就不能再使用;XMSS基于哈希函数的抗碰撞性和 Merkle 树的结构安全性高,适用于需要处理大量签名的应用如区块链。
1.1)密钥生成
- 参数选择:选择安全参数,包括哈希函数(通常是SHA-256或者SHA-3等安全的哈希函数)、树的高度、叶子节点哈希链长度(WOTS+ 参数)等;生成一个随机的种子作为生成所有私钥相关信息的起点。
- 生成主私钥和公钥:使用种子和适当的参数,通过哈希函数生成主私钥,通常是一个随机数或特定格式的数据。通过主私钥使用同样的哈希函数生成对应的主公钥。
- 生成签名树:根据选择的树高度生成Merkle树结构,每个叶子节点存储一个哈希链,用于后续签名生成过程中的一次性使用。
1.2)签名生成
- 消息哈希:使用选择的哈希函数对消息进行哈希,得到消息的摘要。
- 生成签名链:根据消息的哈希值确定要使用的Merkle树中的叶子节点索引,从选定的叶子节点开始使用哈希函数链生成一系列的哈希值,形成签名链并更新对应的叶子节点的哈希值、Merkle树的内部节点,确保树的完整性。
1.3)签名验证
- 消息哈希:使用同样的哈希函数对接收到的消息进行哈希得到摘要。
- 验证签名:根据签名中的一部分信息(通常是与签名相关的部分)确定要验证的叶子节点索引,使用公钥和相应的Merkle树中的哈希值,验证从选定的叶子节点到根节点的哈希值链是否与签名中的哈希链一致。如果验证成功说明签名有效,否则签名无效。
2)LMS
LMS使用HORS(Hash to Obtain Random Subsets)来生成签名,适用于嵌入式系统和IoT设备。
2.1)密钥生成
- 参数选择:选择安全参数,包括哈希函数(通常是SHA-256或者SHA-3等安全的哈希函数)、签名树的高度和哈希函数链长度;生成一个随机的种子作为生成所有私钥相关信息的起点。
- 生成主私钥和主公钥:使用种子和适当的参数通过哈希函数生成主私钥;通过主私钥使用同样的哈希函数生成对应的主公钥。
- 生成认证路径:根据签名树的高度生成一系列的认证路径,认证路径是从叶子节点到根节点的哈希值链,用于验证签名。
2.2)签名生成
- 消息哈希:使用选择的哈希函数对消息进行哈希得到摘要。
- 计算签名:根据消息哈希值的一部分(例如最低位的一些比特)选择要使用的签名树的叶子节点,使用哈希函数链生成一系列的哈希值,直到生成根节点的哈希值。结合消息摘要生成最终的数字签名。
2.3)签名验证
- 消息哈希:使用同样的哈希函数对接收到的消息进行哈希,得到消息的摘要。
- 验证签名:依据签名中的一部分信息(通常是与签名相关的部分)选择相应的签名树节点,使用公钥和事先生成的认证路径,验证从选定的叶子节点到根节点的哈希值链是否与签名中的哈希链一致。如果验证成功说明签名有效,否则签名无效。
相关文章:
[终端安全]-7 后量子密码算法
本文参考资料来源:NSA Releases Future Quantum-Resistant (QR) Algorithm Requirements for National Security Systems > National Security Agency/Central Security Service > Article Commercial National Security Algorithm Suite 2.0” (CNSA 2.0) C…...
uniapp 支付宝小程序 芝麻免押 免押金
orderStr参数如下: my.tradePay({orderStr:res, // 完整的支付参数拼接成的字符串,从 alipay.fund.auth.order.app.freeze 接口获取success: (res) > {console.log(免押成功);console.log(JSON.stringify(res),不是JOSN);console.log(JSON.stringify…...
Python爬虫教程第一篇
一、爬虫基础概念 1. 什么是爬虫 爬虫(Spider,又称网络爬虫),是指向网站/网络发起请求,获取资源后分析并提取有用数据的程序。从技术层面来说,爬虫通过程序模拟浏览器请求站点的行为,把站点返…...
AI时代:探索个人潜能的新视角
文章目录 Al时代的个人发展1 AI的高速发展意味着什么1.1 生产力大幅提升1.2 生产关系的改变1.3 产品范式1.4 产业革命1.5 Al的局限性1.5.1局限一:大模型的幻觉 1.5.2 局限二:Token 2 个体如何应对这种改变?2.1 职场人2.2 K12家长2.3 大学生2.4 创业者 3 人工智能发…...
【Python学习笔记】Optuna + Transformer B站视频实践
【Python学习笔记】Optuna Transformer 实践 背景前摇(省流可不看): 之前以泰坦尼克号数据集为案例,学习了Optuna的基本操作,为了进一步巩固知识和便于包装简历,决定找个唬人一点的项目练练手。 ————…...
【自动驾驶/机器人面试C++八股精选】专栏介绍
目录 一、自动驾驶和机器人技术发展前景二、C在自动驾驶和机器人领域的地位三、专栏介绍四、订阅需知 一、自动驾驶和机器人技术发展前景 随着人工智能、机器学习、传感器技术和计算能力的进步,自动驾驶和机器人的技术水平不断提升,使得它们更加智能、可…...
Unity中一键生成具有身体感知的虚拟人物动作
在虚拟现实(VR)和增强现实(AR)的浪潮中,如何让虚拟人物的动作更加自然、真实,已经成为一个重要课题。AI4Animation项目,一个由 Sebastian Starke 主导的开源框架,为Unity开发者提供了强大的工具集,以实现这一目标。本文…...
谷粒商城实战-25-分布式组件-SpringCloud Alibaba-Nacos配置中心-加载多配置集
文章目录 一,拆分配置集二,配置文件中配置多配置集1,引用多配置集2,验证 三,多配置集总结1,使用场景2,优先级 这一节介绍如何加载多个配置集。 大多数情况下,我们把配置全部放在一个…...
UART编程
Q:为什么使用串口前要先在电脑上安装CH340驱动? 中断的作用? 环形buffer的作用? static和valitate的作用 三种编程方式简介 也可以通过DMA方式减小CPU资源的消耗 直接把数据在SRAM内存和UART模块进行传输 ,流程: …...
C++:右值引用
右值与左值 在讲解右值引用之前,我们就需要先辨析一下左值与右值的区别。 左值 左值是一个表示数据的表达式,我们可以获取它的地址并且对其赋值,左值可以出现在赋值操作符的左边,但是右值不能。 int i 0; int* p &i; do…...
(算法)硬币问题
问题:有1元,5元,10元,50元,100元,500元的硬币各有C1,C5,C10.C50,C100,C500个。 现在要用这些硬币来支付A元,最小需要多少枚硬币? 该题使用递归算法,利用局部最优解来推导…...
如何隐藏 Ubuntu 顶部状态栏
如何隐藏 Ubuntu 顶部状态栏 Chapter1 如何隐藏 Ubuntu 顶部状态栏Chapter2 Ubuntu增大屏幕可用面积之——自动隐藏顶部状态栏Chapter3 Ubuntu18.04隐藏顶栏与侧栏 Chapter1 如何隐藏 Ubuntu 顶部状态栏 https://www.sysgeek.cn/hide-top-bar-ubuntu/ 准备工作:安…...
【C++】入门基础(引用、inline、nullptr)
目录 一.引用 1.引用的定义 2.引用的特性 3.引用的使用场景 4.const引用 5.引用和指针的区别 二.inline 三.nullptr 一.引用 1.引用的定义 引用不是新定义一个变量,而是给已经存在的变量取一个别名,编译器不会给引用变量开辟内存空间,…...
24/07/10数据结构(5.1213)链表OJ
继续练习题: 7.判断链表是不是回文结构 对于一个链表,设计一个时间复杂度O(n)空间复杂度O(1)的算法,判断是否为回文结果 给定一个链表的头指针A,返回一个bool值代表其是否为回文结构. 测试样例:1->2->2->1 返回:ture bool chkPalindrome(ListNode* A){ …...
C++ 入门基础:开启编程之旅
引言 C 是一种高效、灵活且功能强大的编程语言,广泛应用于系统软件、游戏开发、嵌入式系统、科学计算等多个领域。作为 C 语言的扩展,C 不仅继承了 C 语言的过程化编程特性,还增加了面向对象编程(OOP)的支持ÿ…...
据传 OpenAI秘密研发“Strawberry”项目
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
简单的SQL字符型注入
目录 注入类型 判断字段数 确定回显点 查找数据库名 查找数据库表名 查询字段名 获取想要的数据 以sqli-labs靶场上的简单SQL注入为例 注入类型 判断是数字类型还是字符类型 常见的闭合方式 ?id1、?id1"、?id1)、?id1")等,大多都是单引号…...
HttpClient调用SpringBoot项目的文件上传接口实现文件上传
1.导入httpclient的jar包 这里导入了httpclient、httpmime11 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sch…...
[leetcode]kth-smallest-element-in-a-sorted-matrix 有序矩阵中第k小元素
. - 力扣(LeetCode) class Solution { public:bool check(vector<vector<int>>& matrix, int mid, int k, int n) {int i n - 1;int j 0;int num 0;while (i > 0 && j < n) {if (matrix[i][j] < mid) {num i 1;j;…...
【经典面试题】是否形成有环链表
1.环形链表oj 2. oj解法 利用快慢指针: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; bool hasCycle(struct ListNode *head) {ListNode* slow head, *fast…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
