现代密码学-国密算法

商用密码算法种类

商用密码算法 

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

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

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

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

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

完整性--散列类算法

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

真实性--公钥密码

不可否认--公钥密码

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}'是否成立,若成立则验证通过,否则,验证失败

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Boost 网络库

asio 网络编程的基本流程创建 socket绑定acceptor连接指定的端点服务器接受连接 网络编程的基本流程 服务端 1)socket----创建socket对象。 2)bind----绑定本机ipport。 3)listen----监听来电,若在监听到来电,则建…

系统之家教你安装最新Win10 22H2版本!一看就会!

当前很多用户办公或学习都喜欢使用Win10系统,但很多新手用户不知道怎么操作才能安装上最新的Win10 22H2版本?接下来系统之家小编就给大家带来最简单的安装方法,帮助大家轻松快速给电脑安装上Win10系统最新版本22H2,体验22H2版本带…

zlib安装教程(Windows)

开源项目地址:madler/zlib: A massively spiffy yet delicately unobtrusive compression library. (github.com) 下载代码 可以选择git clone 或直接下载release包 Releases madler/zlib (github.com) git clone https://github.com/madler/zlib.git release…

深度学习入门5——为什么神经网络可以学习?

在理解神经网络的可学习性之前,需要先从数学中的导数、数值微分、偏导数、梯度等概念入手,从而理解为什么神经网络具备学习能力。 1.数值微分的定义 先从导数出发理解什么是梯度。某一点的导数直观理解就是在该点的切线的斜率。在数学中导数表示某个瞬…

【Unity】Animator动画倒播,与StartRecording动画录制

一、Animator动画倒播 正常我们修改速度,只需要修改Animator.speed即可,但如果设置为负值,Animator系统会自动将其改为0值。 1.创建动画速度参数 (1)设置动画 我们需要创建表示速度的动画参数Speed,将其付给需要倒播的动画片段…

JAVA-字符串每X个字符自动换行

话不多说,先看示例: 代码: //50可以改为你需要的多少个字符换行 String str context.replaceAll("(.{50})", "$1\n");

Android Kotlin 中的闭包函数

闭包函数是现代编程语言中一个重要的概念,Kotlin 作为一种现代的 JVM 语言,自然也支持闭包函数。本文将详细介绍闭包函数的概念、在Kotlin 中的使用方法,以及一些常见的应用场景。 什么是闭包函数? 闭包函数,也称为闭…

threejs材质的贴图(四)

效果 代码实现 import ./style.css import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls.js//相机轨道控制器 import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader.js"//加载hdr文件作为环境贴…

一次完整的web渗透测试(文件上传getshell)

一、背景 日常空闲事件会进行一些公益SRC的挖掘,今天也是空闲,摸鱼有点浪费时间,那就拿几个公益SRC练练手(有waf的我会直接跳过,毕竟没钱去挂代理)。上号! 二、测试过程 2.1、目录扫描 先给…

Python抓取天气信息

Python的详细学习还是需要些时间的。如果有其他语言经验的,可以暂时跟着我来写一个简单的例子。 2024年最新python教程全套,学完即可进大厂!(附全套视频 下载) (qq.com) 我们计划抓取的数据:杭州的天气信息…

JAVA云HIS医院管理系统源码:可医保对接的云HIS运维平台源码 SaaS模式

JAVA云HIS医院管理系统源码:可医保对接的云HIS运维平台源码 SaaS模式 云HIS系统运用云计算、大数据、物联网等新兴信息技术,为医疗机构提供全面的医疗信息管理服务。该系统支持医保功能,通过与医保系统的对接,实现了医疗费用的自…

Mcgs屏幕脚本程序

目录 1.脚本程序概述1.1 脚本程序简介1.2 脚本程序编辑环境 2.脚本程序语言要素2.1 变量和常量2.2 对象2.3 事件2.4 表达式2.5 联行符2.6 运算符2.7 系统函数 3. 基本语句3.1 赋值语句3.2 条件语句3.3 循环语句3.4 跳出语句3.5 退出语句3.6 注释语句3.7 声明语句3.6 命名规则 1…

SpringCloud Alibaba Sentinel 流量控制之流控模式实践总结

官网文档:https://sentinelguard.io/zh-cn/docs/flow-control.html 本文版本: spring-cloud-starter-alibaba:2.2.0.RELEASE 如下图所示,我们可以针对某个资源添加流控规则,流控模式有直接、关联和链路。 【1】直接 …

为什么Mid journey很容易就能做出很有氛围感的图而SD却容易做图很丑?

前言 6月12日,Midjourney更新了一项新的功能——模型个性化,这一项功能最重要的作用就是能够让生成的图像更加符合你自己的审美标准。就像每个艺术家都有自己的独特风格一样,有了这项模型个性化功能的加持,每个人都能生成具有鲜明…

MyBatisPlus基础学习

一、简介 二、集成MP 三、入门HelloWorld 四、条件构造器EntityWrapper 五、ActiveRecord(活动记录 ) 六、代码生成器 七、插件扩展 八、自定义全局操作 九、公共字段自动填充 十、Oracle主键Sequence 十一、Idea快速开发插件 十二、mybatis-plus实践及架构原理

【机器学习】第3章 K-近邻算法

一、概念 1.K-近邻算法:也叫KNN 分类 算法,其中的N是 邻近邻居NearestNeighbor的首字母。 (1)其中K是特征值,就是选择离某个预测的值(例如预测的是苹果,就找个苹果)最近的几个值&am…

【JS重点16】对象原型

目录 一:对象原型是什么 二:对象原型作用 三:constructor属性 四:如何赚钱 一:对象原型是什么 每个对象都有一个属性__proto__(称为原型对象),该属性是一个对象 __proto__是JS非标准属性在实例对象中,…

LabVIEW在中国航天中的应用

​LabVIEW是一种系统设计平台及开发环境,由美国国家仪器公司(NI)开发。它在中国航天领域的应用非常广泛,涵盖了测试与测量、数据采集、控制系统设计等多个方面。以下是LabVIEW在中国航天中的几个主要应用实例: 1. 测试…

CobaltStrike后渗透进阶篇

0x01 网络钓鱼攻击 钓鱼攻击简介 钓鱼攻击主要通过生成的木马诱使受害者运行后上线,其中木马一般都伪装成正常的程序。与此同时配合钓鱼网站可帮助攻击者模拟真实网站诱骗受害者访问,达到获取账号密码、上线木马等目的。接下来主要介绍后门程序的生成及…

算法 |数字计数

给出n个数字,请你求出在给出的这n个数字当中,最大的数字与次大的数字之差,最大的数字与次小的数字之差,次大的数字与次小的数字之差,次大的数字与最小的数字之差. 易错点 1 1 2 3 4 4 次小不是a[1]了 次大也不是a[n-2]了 #include<bits/stdc.h> using namespace std; …