SM2官方文档整理

算法原理

SM2算法介绍

我国自主知识产权的商业密码算法,是ECC(椭圆加密算法)的一种,基于椭圆曲线离散对数问题(公钥密码体制所依据的难题主要为大素数分解问题、离散对数问题、椭圆曲线),计算复杂度是指数级。同等安全条件下,椭圆曲线密码较其他公钥算法所需密钥长度小很多。

ElGamal离散对数密码体制

(一)公钥密钥生成

  1. Alice首先构造一条椭圆曲线E,在曲线上选择一点G作为生成元,并求G的阶为n,要求n必须为质数。此时构成了一个循环群<G>。

  2. Alice选择一个私钥k (k < n),生成公钥 Q = kG

  3. Alice将公钥组E、Q、G发送给Bob

(二)加密过程

  1. Bob收到信息后,将明文编码为M,M为曲线上一点,并选择一个随机数r(r < n, n为G的阶)
  2. 2.Bob计算点Cipher1与Cipher2即两段密文,计算方法如下
  • Cipher1 = M + rQ
  • Cipher2 = rG
  1. Bob把Cipher1和Cipher2发给Alice

(三)解密过程

  1. Alice收到密文后,为了获得M,只需要Cipher1 - k · Cipher2,因为
Cipher1 - k*Cipher2 = M + rQ - krG = M + rkG - krG = M
  1. 将M解码即可

SM2官方文档

标准文档链接:国家商业密码标准

总则

  1. 规定了椭圆曲线的系统参数以及验证方法
  2. 规定了椭圆曲线公钥的验证方法
  3. 附录中给出了椭圆曲线示例

第二部分 数字签名算法

签名算法流程

(一)置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官方文档整理的更多相关文章

  1. Es官方文档整理-3.Doc Values和FieldData

    Es官方文档整理-3.Doc Values和FieldData 1.Doc Values 聚合使用一个叫Doc Values的数据结构.Doc Values使聚合更快.更高效且内存友好. Doc Va ...

  2. Es官方文档整理-2.分片内部原理

    Es官方文档整理-2.分片内部原理 1.集群      一个运行的Elasticsearch实例被称为一个节点,而集群是有一个或多个拥有相同claster.name配置的节点组成,他们共同承担数据和负 ...

  3. Spring JMS 官方文档学习

    最后部分的XML懒得写了,因为个人更倾向于JavaConfig形式. 为知笔记版本见这里,带格式~ 做了一个小demo,放到码云上了,有兴趣的点我. 说明:需要先了解下JMS的基础知识. 1.介绍 S ...

  4. 【Java架构:基础技术】一篇文章搞掂:Spring Boot 官方文档解读

    本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文内容大部分是翻译和总结官方文档,可以到https://docs.spring.io/spring-boot/docs查看(此地 ...

  5. Kotlin开发语言文档(官方文档)-- 目录

    开始阅读Kotlin官方文档.先上文档目录.有些内容还未阅读,有些目录标目翻译还需琢磨琢磨.后续再将具体内容的链接逐步加上. 文档链接:https://kotlinlang.org/docs/kotl ...

  6. Spark官方文档 - 中文翻译

    Spark官方文档 - 中文翻译 Spark版本:1.6.0 转载请注明出处:http://www.cnblogs.com/BYRans/ 1 概述(Overview) 2 引入Spark(Linki ...

  7. Spring 4 官方文档学习 Spring与Java EE技术的集成

    本部分覆盖了以下内容: Chapter 28, Remoting and web services using Spring -- 使用Spring进行远程和web服务 Chapter 29, Ent ...

  8. Spring 4 官方文档学习(十四)WebSocket支持

    个人提示:如果需要用到页面推送,高频且要低延迟,WebSocket无疑是最佳选择.否则还是轮询和long polling吧. 做了一个小demo放在码云上,有兴趣的可以看一下,简单易懂:websock ...

  9. Android 触摸手势基础 官方文档概览

    Android 触摸手势基础 官方文档概览 触摸手势检测基础 手势检测一般包含两个阶段: 1.获取touch事件数据 2.解析这些数据,看它们是否满足你的应用所支持的某种手势. 相关API: Moti ...

随机推荐

  1. Go语言中利用append巧妙的删除slice切片中的元素

    package main import ( "fmt" ) //删除函数 func remove(s []string, i int) []string { return appe ...

  2. 热门跨平台方案对比:WEEX、React Native、Flutter和PWA

    本文主要对WEEX.React Native.Flutter和PWA几大热门跨平台方案进行简单的介绍和对比.内容选自<WEEX跨平台开发实战> (WEEX项目负责人力荐,从入门到实战,教你 ...

  3. N皇后求解。万万没想到,只用一个一维数组就搞定了。还体现了回溯。

    一.啥是N皇后?先从四皇后入手 给定一个4x4的棋盘,要在棋盘上放置4个皇后.他们的位置有这样的要求,每一列,每一行,每一对角线都能有一个皇后. 你可能会对这个对角线有疑惑,其实就是每一个小正方形的对 ...

  4. 优化 ASP.NET Core Docker 镜像的大小

    在这容器化的世界里,我们已经很少直接通过文件发布来运行asp.net core程序了.现在大多数情况下,我们都会使用docker来运行程序.在使用docker之前,我们往往需要打包我们的应用程序.as ...

  5. 思维导图趋势大分析(MindMaster与百度脑图)

    思维导图现在可以说是大流行期间,涉及学习.工作.生活方方面面的内容. 一.什么是思维导图 思维导图的英文名称是The Mind Map,也叫做心智导图,脑图,心智地图,脑力激荡图等.思维导图应用图文兼 ...

  6. C++并发与多线程学习笔记--参数传递详解

    传递临时对象 陷阱 总结 临时对象作为线程参数 线程id的概念 临时对象构造时的抓捕 成员函数指针做线程函数 传递临时对象作为线程参数 创建的工作线程不止一个,线程根据编号来确定工作内容.每个线程都需 ...

  7. 【C++】 C++知识点总结

    作者:李春港 出处:https://www.cnblogs.com/lcgbk/p/14643010.html 目录 前言 一.C++常用后缀 二.头文件 1.C++输入输出 2.在C++中使用C的库 ...

  8. [Fundamental of Power Electronics]-PART II-8. 变换器传递函数-8.3 阻抗和传递函数图形的构建

    8.3 阻抗和传递函数图形的构建 通常,我们可以通过观察来绘制近似的bode图,这样没有大量混乱的代数和不可避免的有关代数错误.使用这种方法可以对电路运行有较好的了解.在各种频率下哪些元件主导电路的响 ...

  9. 带你全面认识CMMI V2.0(三)——实践域

    实践域以往被称为称为"过程域",如:配置管理,现在叫做"实践域".对于2.0版,则有25个适用的实践域.与以前版本的CMMI模型一样,"实践域&quo ...

  10. ternux的ssh和ftp

    ssh的连接 pkg install ssh ssh -p 8022 username@hostname_ip ftp的创建 安装python 升级pip python -m pip install ...