国家密码标准-商密SM2官方文档整理
SM2官方文档整理
算法原理
SM2算法介绍
我国自主知识产权的商业密码算法,是ECC(椭圆加密算法)的一种,基于椭圆曲线离散对数问题(公钥密码体制所依据的难题主要为大素数分解问题、离散对数问题、椭圆曲线),计算复杂度是指数级。同等安全条件下,椭圆曲线密码较其他公钥算法所需密钥长度小很多。
ElGamal离散对数密码体制
(一)公钥密钥生成
Alice首先构造一条椭圆曲线E,在曲线上选择一点G作为生成元,并求G的阶为n,要求n必须为质数。此时构成了一个循环群<G>。
Alice选择一个私钥k (k < n),生成公钥 Q = kG
Alice将公钥组E、Q、G发送给Bob
(二)加密过程
- Bob收到信息后,将明文编码为M,M为曲线上一点,并选择一个随机数r(r < n, n为G的阶)
- 2.Bob计算点Cipher1与Cipher2即两段密文,计算方法如下
- Cipher1 = M + rQ
- Cipher2 = rG
- Bob把Cipher1和Cipher2发给Alice
(三)解密过程
- Alice收到密文后,为了获得M,只需要Cipher1 - k · Cipher2,因为
Cipher1 - k*Cipher2 = M + rQ - krG = M + rkG - krG = M
- 将M解码即可
SM2官方文档
标准文档链接:国家商业密码标准
总则
- 规定了椭圆曲线的系统参数以及验证方法
- 规定了椭圆曲线公钥的验证方法
- 附录中给出了椭圆曲线示例
第二部分 数字签名算法
签名算法流程
(一)置M' = ZA || M M为待签名数据 ZA为A的可辨识标识、部分椭圆曲线系统参数和用户A的公钥的Hash值
(二)计算e = Hash(M') 并将其转化为整数
(三)用随机数发生器生成随机数k (k>1 k< n-1) n 椭圆曲线的阶数 可以通过G计算出
(四)计算椭圆曲线点(x1,y1) = [k]G,并将其转化为整数 G为椭圆上一点 [k]G指椭圆乘法k倍G
(五)计算r= (e + x1)mod n,若r=0或r+k=n返回(三)
(六)计算s= ((1+da) ^(-1) * (k-r*da))mod n,若s=0则返回(三) da为用户A的私钥
(七)将r、s数据类型转化成字节串,消息M的签名为(r,s)
验签算法流程
(一)验证r>1 r<n-1
(二)验证s>1 s<n-1
(三)置M' = ZA || M
(四)计算e = Hash(M') 并将其转化为整数
(五)将r s数据类型转换为整数 计算 t= (r+s)mod n ,若t=0则验证不通过
(六)计算椭圆曲线点(x1,y1) = [s]G + [t]Pa Pa为A的公钥
(七) 将x1的数据类型转换成整数,计算R=(e+x1)mod n,验证R=r,成立则验证通过
第三部分 密钥交换协议
密钥交换流程
第四部分 公钥加密算法
加密算法流程
(一)用随机数发生器产生随机数k (k>1 k<n-1)
(二)计算椭圆曲线点C1=[k]G=(x1,y1),并将其转换为比特串(A的私钥生成公钥)
(三)计算椭圆曲线点S=[h]Pb,若S是无穷远点,则报错并退出 h为n的余因子
(四)计算椭圆曲线点[k]Pb=(x2,y2),并将其转换为比特串(A的私钥乘B的公钥)
(五)计算t=KDF(x2||y2,klen),若t为全0比特串,则返回(一) KDF为密钥派生函数
(六)计算C2=M⊕t
(七)计算C3=Hash(x2||M||y2)
(八)输出密文C=C1||C3||C2
解密算法流程
(一)从C中取出比特串C1,将其转换为椭圆曲线上的点,验证C1是否满足椭圆曲线方程
(二)计算椭圆曲线点S=[h]Pb,若S是无穷远点,则报错并退出
(三)计算[db]C1=(x2,y2),并将其转换为比特串 db B的公钥
(四)计算t=KDF(x2||y2,klen),若t为全0比特串,则返回(一) KDF为密钥派生函数
(五)从C中取出比特串C2,计算M=C2⊕t
(六)计算u=Hash(x2||M||y2),从C中取出比特串C3,若u不等于C3,则报错并退出
(七)输出明文M
第五部分 参数定义
给出了SM2使用素数域256位椭圆曲线参数
国家密码标准-商密SM2官方文档整理的更多相关文章
- Es官方文档整理-3.Doc Values和FieldData
Es官方文档整理-3.Doc Values和FieldData 1.Doc Values 聚合使用一个叫Doc Values的数据结构.Doc Values使聚合更快.更高效且内存友好. Doc Va ...
- Es官方文档整理-2.分片内部原理
Es官方文档整理-2.分片内部原理 1.集群 一个运行的Elasticsearch实例被称为一个节点,而集群是有一个或多个拥有相同claster.name配置的节点组成,他们共同承担数据和负 ...
- Spring JMS 官方文档学习
最后部分的XML懒得写了,因为个人更倾向于JavaConfig形式. 为知笔记版本见这里,带格式~ 做了一个小demo,放到码云上了,有兴趣的点我. 说明:需要先了解下JMS的基础知识. 1.介绍 S ...
- 【Java架构:基础技术】一篇文章搞掂:Spring Boot 官方文档解读
本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文内容大部分是翻译和总结官方文档,可以到https://docs.spring.io/spring-boot/docs查看(此地 ...
- Kotlin开发语言文档(官方文档)-- 目录
开始阅读Kotlin官方文档.先上文档目录.有些内容还未阅读,有些目录标目翻译还需琢磨琢磨.后续再将具体内容的链接逐步加上. 文档链接:https://kotlinlang.org/docs/kotl ...
- Spark官方文档 - 中文翻译
Spark官方文档 - 中文翻译 Spark版本:1.6.0 转载请注明出处:http://www.cnblogs.com/BYRans/ 1 概述(Overview) 2 引入Spark(Linki ...
- Spring 4 官方文档学习 Spring与Java EE技术的集成
本部分覆盖了以下内容: Chapter 28, Remoting and web services using Spring -- 使用Spring进行远程和web服务 Chapter 29, Ent ...
- Spring 4 官方文档学习(十四)WebSocket支持
个人提示:如果需要用到页面推送,高频且要低延迟,WebSocket无疑是最佳选择.否则还是轮询和long polling吧. 做了一个小demo放在码云上,有兴趣的可以看一下,简单易懂:websock ...
- Android 触摸手势基础 官方文档概览
Android 触摸手势基础 官方文档概览 触摸手势检测基础 手势检测一般包含两个阶段: 1.获取touch事件数据 2.解析这些数据,看它们是否满足你的应用所支持的某种手势. 相关API: Moti ...
随机推荐
- WinForm的Socket实现简单的聊天室 IM
1:什么是Socket 所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象. 一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制. 从 ...
- 08、元组tuple
元组(tuple) 是一个有序且不可变的容器,在里面可以存放多个不同类型的元素 元组是在最后多一个逗号,用于表示它是一个元组 tuple = (11,22,'阿斯顿','媚媚',) #后面多加一个逗号 ...
- 【LeetCode】4. Median of Two Sorted Arrays(思维)
[题意] 给两个有序数组,寻找两个数组组成后的中位数,要求时间复杂度为O(log(n+m)). [题解] 感觉这道题想法非常妙!! 假定原数组为a,b,数组长度为lena,lenb. 那么中位数一定是 ...
- PTA 中序输出度为1的结点
6-9 中序输出度为1的结点 (10 分) 本题要求实现一个函数,按照中序遍历的顺序输出给定二叉树中度为1的结点. 函数接口定义: void InorderPrintNodes( BiTree T ...
- visualvm工具远程对linux服务器上的JVM虚拟机进行监控与调优
文/朱季谦 最近在做了一些JVM监控与调优的事情,算是第一次实践,还比较陌生,故而先把这一次经验简单记下笔记,这样,对后面学习调优方面时,不至于又想不起来了.本文档主要总结在window本地环境远程对 ...
- csss3属性 — will-change
1. CPU和GPU CPU即中央处理器,它的功能主要是解释计算机指令以及处理计算机软件中的数据,也被称为主板. GPU即图形处理器,是与处理和绘制图形相关的硬件.GPU是专为执行复杂的数学和几何计算 ...
- Leedcode算法专题训练(分治法)
归并排序就是一个用分治法的经典例子,这里我用它来举例描述一下上面的步骤: 1.归并排序首先把原问题拆分成2个规模更小的子问题. 2.递归地求解子问题,当子问题规模足够小时,可以一下子解决它.在这个例子 ...
- Manjaro 安装教程
1 概述 本文讲述了如何在单硬盘下对Manjaro进行安装. 2 写U盘 首先第一步是下载镜像,官网下载地址戳这里,如果下载速度慢可以选择国内镜像,比如戳这里. 笔者选择的是XFCE桌面: 下载好后将 ...
- 【WPF】将控件事件中的参数,传递到ViewModel中
在MVVM模式下,在通常使用命令(Command)绑定的方式的时候 ,使用的是 CommandParameter 属性进行参数的传递. 但是很多时候,有一些事件我们需要使用其中的一些事件里面的参数,以 ...
- 一图看懂 ASP.NET Core 中的服务生命周期
翻译自 Waqas Anwar 2020年11月8日的文章 <ASP.NET Core Service Lifetimes (Infographic)> [1] ASP.NET Core ...