现代密码学-国密算法

商用密码算法种类

商用密码算法 

密码学概念、协议与算法之间的依赖关系

数字签名、证书-公钥密码、散列类算法

消息验证码-对称密码 ,散列类

安全目标与算法之间的关系

机密性--对称密码、公钥密码

完整性--散列类算法

可用性--散列类、公钥密码

真实性--公钥密码

不可否认--公钥密码

SM2椭圆曲线公钥加密

公钥密码体制

公钥体制加密

  1. 接收者B产生一对密钥:私钥--SK_{_{B}},公钥--PK_{_{B}}
  2. A想向B发消息m,则使用B的公钥加密m,表示为c=\varepsilon _{PK_{B}}[m], c是加密后的密文,\varepsilon是加密算法
  3. B收到密文c后,用自己的私钥SK_{_{B}}解密,表示为m=D_{SK_{B}}[c],D是解密算法

只能由B进行解密

公钥体制认证

用户A用自己的私钥对m进行加密,c=\varepsilon _{SK_{A}}[m],将c发给B,B用A的公钥解密m=D_{PK_{A}}[c]

 从m得到c的过程是经过A的私钥加密的,只能A才能做到,因此c可以当作A对m的数字签名。

双重加密、解密

为了同时具有保密功能和认证功能,可以使用双重加、解密

发送方先用自己的私钥对消息加密,用于提供数字签名。再用接收方的公钥加密,表示为

 c=\varepsilon _{PK_{B}}[\varepsilon _{SK_{A}}[m]]

接收者收到后,x先用自己的私钥,再用发送方的公钥进行两次解密,解密过程为

m=D_{PK_{A}}[D_{SK_{B}}[c]]

椭圆曲线密码体制

椭圆曲线密码 Elliptic CurveCryptography ECC:利用椭圆曲线实现密码技术

椭圆曲线上的离散对数问题

本质:已知xG求数x的问题

椭圆曲线密码中,先确定一条椭圆曲线,然后对椭圆曲线上的某一些点之间的“运算”进行定义,利用这些“运算”来进行密码技术相关的计算。

已知

        椭圆曲线E

        椭圆曲线E上的一点G(基点)

        椭圆曲线上的一点xG(G的x倍)

求解

        数x

椭圆曲线Diffie-Hellman密钥交换

AB需要共享一个对称密码的密钥,用椭圆曲线Diffie-Hellman密钥交换,生成共享密钥

  • A向B发送点G。G被窃听无影响
  • A生成随机数a,将a作为A的私钥
  • B生成随机数b,将b最为B的私钥
  • A向B发送点aG
  • B向A发送bG
  • A对收到的bG计算其在椭圆曲线上a倍的点,a(bG)=abG==共享密钥
  • B对收到的aG计算其在椭圆曲线上b倍的点,b(aG)=baG=abG==共享密钥

每次通信使用不同的随机数,共享密钥也会随之改变==保证了前向安全性forward secrecy

SM2

SM2是国家密码管理局颁布的中国商用公钥密码标准算法,是一组椭圆曲线密码算法,包含加解密算法、数字签名算法。

SM2与国际ECC比较

        ECC算法采用国际机构建议的曲线和参数,SM2算法的参数需要利用一定的算法产生,算法中加入了用户特异性的曲线参数、基点、用户的公钥点信息,安全性更高

        ECC中,用户可以选择MD5或SHA-1等国际通用的哈希算法,SM2使用SM3哈希算法,SM3哈希算法输出为256比特,与SHA-256算法安全性相当

SM2椭圆曲线公钥密码加密算法

基本参数

基于素数域F_{p}的SM2算法参数如下:

F_{p}的特征p为m比特长的素数,p要尽可能大;

长度不小于192比特的比特串SEED;

F_{p}上的2个元素a,b,满足4{a^{3}}+27{b^2}\neq 0,定义曲线E(F_{p}):y^2=x^2+ax+b

基点G=(x_G,y_G)\in E(F_p),G\neq 0;

G的阶n为m比特长的素数,满足n> 2^191 and n> 4\sqrt{p};

h=\frac{\left | E(F_p) \right |}{n}余因子,其中 |E(F_p)|是曲线E(F_p)的点数。

SEED,a,b产生的算法:

  1. 任意选取长度不小于192比特的比特串SEED;
  2. 计算H=H_{256}(SEED),记H=(h_{255},h_{254},...,h_0),其中H_{256}表示256比特输出的SM3哈希算法
  3. R=\sum_{255}^{0}h_i2^i;
  4. r=R mod p
  5. F_{p}上任意选择2个元素a,b,满足 rb^2=a^3 mod p;
  6. 若 4{a^{3}}+27{b^2}= 0 mod p,则返回1;
  7. 所选择的F_{p}上的曲线是E(F_{p}):y^2=x^2+ax+b
  8. 输出(SEED,a,b)

密钥产生

假设接收方为B,B的秘密钥取{1,2,...,n-1}中的一个随机数d_B,记为d_B\leftarrow\left \{ 1,2,...,n-1 \right \}_R,其中G的阶n

B的公开钥取为椭圆曲线上的点:P_B=d_BG,其中,G=G(x,y)是基点

加密算法

假设发送方是A,A要发送的消息表示为M比特串,M的长度为klen.算法如下:

  1. 选择随机数k\leftarrow\left \{ 1,2,...,n-1 \right \}_R
  2. 计算椭圆曲线点C_1=kG=(x_1,y_1)),将x1,y1表示为比特串;
  3. 计算椭圆曲线点S=HP_B,若S为无穷远点,则报错退出;
  4. 计算椭圆曲线kP_B=(x_2,y_2),将x2,y2表示为比特串;
  5. 计算t=KDF(x_2 || y_2,klen),若t为全0的比特串,则返回1;
  6. 计算C_2=M\oplus t----(mod 2 加法)
  7. 计算C_3=Hash(x_2 || M || y_2)
  8. 输出密文C=(C1,C2,C3)

KDF(*)是密钥派生函数,本质为一个伪随机数产生函数,用来产生密钥,这里KDF为SM3,第(3)步的H也是SM3

解密算法

B收到密文C后,进行解密,过程如下:

  1. 从C中取出C1,将C1表示为椭圆曲线上的点,验证C1是否满足椭圆曲线方程。不满足就报错退出;
  2. 计算椭圆曲线点S=HC1,若S为无穷远点,则报错退出;
  3. 计算d_BC_1=(x_2,y_2),将x2,y2表示为比特串;
  4. 计算t=KDF(x_2 || y_2,klen),若t为全0的比特串,则报错退出;
  5. 从C中取出C2,计算{M}'=C_2\oplus t;
  6. 计算u=Hash(x_2 || {M}' || y_2),从C中取出C3,若u \neq C_3则报错退出;
  7. 输出明文{M}'

SM2椭圆曲线公钥密码签名算法

基本参数

与前面加密算法的参数设置相同

密钥产生

与与前面加密算法产生方法一样,记为d_A,P_A=(x_A,y_A)

ID_A是A的长度为entlen_A比特的标识,ENTL_Aentlen_A转换而成的两个字节,A计算Z_A=H_{256}(ENTL_A || ID_A || a||b||x_G||y_G||x_A||y_A),其中a,b是椭圆曲线方程的参数,x_G,y_G是基点G的坐标,x_A,y_AP_A的坐标。将这些值转换为比特串后,在进行H_{256}。验证方B验证签名时,也需要计算Z_A

签名算法

设待签名的消息为M,操作如下:

  1. \tilde{M}=Z_A || M
  2. 计算e=H_v(\tilde{M}),将e转换为整数,Hv是输出为v比特长的哈希函数
  3. 用随机数产生器生成随机数k\leftarrow\left \{ 1,2,...,n-1 \right \}_R
  4. 计算椭圆曲线点C_1=kG=(x_1,y_1))
  5. 计算r=(r+x_1) mod n,若r=0或者r+k=n,则返回3
  6. 计算s=((1+d_A)^{-1})\cdot (k-r\cdot d_A))mod n,若s=0,则返回3
  7. 消息M的签名为(r,s)

验证算法

B收到消息{M}'以及其签名({r}',{s}'),进行验证操作:

检验{r}'\in [1,n-1]是否成立,若不成立,验证失败;

检验{s}'\in [1,n-1]是否成立,若不成立,验证失败;

{\tilde{M}}'=Z_A || {M}'

计算{e}'=H_v({\tilde{M}}'),并将其转换为整数;

计算t=({r}'+{s}')mod n,若t=0,验证失败

计算椭圆曲线点({x}',{y}')={s}'G+tP_A

计算R=({e}'+{x_1}')mod n,检查R={r}'是否成立,若成立则验证通过,否则,验证失败

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/679363.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构之初始泛型

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:数据结构(Java版) 目录 深入了解包装类 包装类的由来 装箱与拆箱 面试题 泛型 泛型的语法与使用…

可长期操作的赚钱项目,时间自由,但不适合大学生

如何评价现在的csgo市场? 可长期操作的赚钱项目,时间自由,但不适合大学生。 都在问,有哪些可以长期做下去的赚钱项目,童话就不拐弯抹角了,csgo/steam游戏搬砖一定是最适合长期做下去的赚钱项目。 不说别人…

CondaSSLError: OpenSSL appears to be unavailable on this machine.

conda create -n x1 python3.7报错 PS C:\Users\Richardo.M.Song\Desktop\lele_seg\x1> conda create -n x1 python3.7 Collecting package metadata (current_repodata.json): failed CondaSSLError: OpenSSL appears to be unavailable on this machine. OpenSSL is requ…

Varnish讲解文章、缓存代理配置、核心功能、优势、Varnish在什么情况下会选择缓存哪些类型的内容、Varnish如何实现负载均衡功能?

varnish官网链接 Varnish文章概览 Varnish是一款高性能的HTTP加速器(web应用加速器),是一款开源软件,它能够显著提高网站的响应速度和减少服务器的负载。Varnish的设计理念是利用缓存技术,将频繁访问的静态内容存储在…

【Python】 探索Pytz库中的时区列表

基本原理 在Python中,处理时区是一个常见但复杂的问题。pytz是一个Python库,它提供了对时区的精确和丰富的支持。pytz库是datetime模块的补充,它允许更准确地处理时区信息。pytz库包括了IANA时区数据库,这个数据库包含了全球的时…

13-至少有5名直接下属的经理(高频 SQL 50 题基础版)

13-至少有5名直接下属的经理 select name from Employee where id in (select managerId -- 查找大于5的经理idfrom Employeegroup by managerId -- 根据id分组having count(*)>5); -- 根据分组的数据进行求个数

小白级教程—安装Ubuntu 20.04 LTS服务器

下载 本教程将使用20.04版进行教学 由于官方速度可能有点慢,可以下方的使用清华镜像下载 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/ 点击20.24版本 选择 ubuntu-20.04.6-live-server-amd64.iso 新建虚拟机 下载好后 我们使用 VMware 打开它 这里选…

使用Python和wxPython将PNG文件转换为JPEG文件

简介: 在图像处理中,有时候我们需要将PNG格式的图像文件转换为JPEG格式。本篇博客将介绍如何使用Python编程语言和wxPython图形用户界面库,以及Pillow图像处理库来实现这一转换过程。通过本文的指导,您将学习如何快速将指定文件夹…

Docker run 命令常用参数详解

Docker run 命令提供了丰富的参数选项,用于配置容器的各种设置。以下是docker run命令的主要参数详解, 主要参数详解 后台运行与前台交互 -d, --detach: 在后台运行容器,并返回容器ID。-it: 分配一个伪终端(pseudo-TTY&#xff0…

路由策略案例

一、路由策略案例 如图所示,某公司内终端通过Switch接入公司内部网络。如果该公司内存在非如图1所示,运行OSPF协议的网络中,RouterA从Internet网络接收路由,并头RouterB提供了部分Internet路由。其中: RouterA仅提供172.1…

Unity DOTS技术(五)Archetype,Chunk,NativeArray

文章目录 一.Chunk和Archetype什么是Chunk?什么是ArchType 二.Archetype创建1.创建实体2.创建并添加组件3.批量创建 三.多线程数组NativeArray 本次介绍的内容如下: 一.Chunk和Archetype 什么是Chunk? Chunk是一个空间,ECS系统会将相同类型的实体放在Chunk中.当一个Chunk…

蓝桥杯物联网竞赛_STM32L071_20_用printf将数据显示在OLED上

需求: 第十五届国赛确实有点变态,显示部分大概有6个所以需要大量将sprintf与OLED_ShowString配合使用才能显示相应格式的数据,所以我在想能不能简化一下这一部分直接用写好的printf语句将数据显示到显示屏上呢? 代码&#xff1a…

重学java 61.IO流 字节流 ② 字节输出流

夜色难免黑凉,前行必有曙光 —— 24.6.4 一、I0流介绍以及输入输出以及流向的介绍 1.单词: output:输出 Input:输入 write:写数据 read:读数据 2.IO流: 将一个设备上的数据传输到另外一个设备上,称之为IO流技术 3.为什么要学IO流? 之前学了…

树的知识总结

一:树的基本术语(只写了查漏的部分 1 双亲:就是父节点 2 层序编号 3 有序无序树 4 森林 二:逻辑结构上与线性结构的比较 三:树的存储结构 ①双亲表示节点法:

第一个SpringBoot项目

目录 💭1、新建New Project IDEA2023版本创建Sping项目只能勾选17和21,却无法使用Java8?🌟 2、下载JDK 17🌟 💭2、项目创建成功界面 1、目录 🌟 2、pom文件🌟 💭3、…

基础篇03——SQL约束

概述 约束示例 完成以下案例&#xff1a; create table user (id int primary key auto_increment comment 主键,name varchar(10) not null unique comment 姓名,age tinyint unsigned check ( age > 0 and age < 120 ) comment 年龄,status char(1) default 1 commen…

VUE3 学习笔记(13):VUE3 下的Element-Plus基本使用

UI是页面的门面&#xff0c;一个好的UI自然令人赏心悦目&#xff1b;国人团队开发的ElementUI在众多UI中较为常见&#xff0c;因此通过介绍它的使用让大家更好的了解第三方UI的使用。 安装 Npm install element-plus --save 或 Cnpm install element-plus --save 配置 全局配置…

广告联盟是不是看广告就有米

如果你在别人app里面看广告&#xff0c;你是个普通用户&#xff0c;那么你可以随时提现&#xff0c;如果你是app主&#xff0c;那么你自己看广告和用户帮你看广告的收益都是广告平台次月结算给你&#xff0c;一般是次月15号出账单、开票审核打款。 但是如果你在这期间自刷被平台…

【电子书赠送福利】蘇小沐电子数据取证实务教程!风吹哪页读哪页,哪页不会撕哪页!

【电子书赠送福利】蘇小沐电子数据取证实务教程&#xff01;风吹哪页读哪页&#xff0c;哪页不会撕哪页&#xff01; 合并文章的时候才发现自己写了那么多&#xff0c;受限于时间&#xff0c;第一次合集版本只收录了已发博客的三分之二左右&#xff0c;暂时先这样&#xff01;…

突破开源天花板!最强文本转语音工具ChatTTS:对话式高可控的语音合成模型

ChatTTS 一夜爆火&#xff0c; 极速出圈&#xff0c; 3 天就斩获 9k 的 Star 量&#xff0c; 截止 2024.06.04&#xff0c; 已经 19.3k 的 star&#xff0c; 极速接近 GPT-soVITs 当天的 26.2k 的 star 数。 什么是ChatTTS&#xff1f; TTS全称&#xff1a;Text To Speech&am…