sm2和sm4加密算法浅析

sm2和sm4加密算法浅析sm2和sm4加密算法浅析一:SM2简介:SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法,SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。ECC256位(SM2采用的就是ECC256位的一种)安全强度比RSA2048位高,但运算速度快于RSA。SM2和RSA算法比较SM2性能更优更安全:密码复杂度高、处理速度快、机器性能消耗更小①:加密算法以及流程:输入:需要发送的消息为比特串M,klen为M的比特

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

sm2和sm4加密算法浅析

一: SM2

简介:SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法 ,SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。

SM2和RSA算法比较

C:\Users\hwlb\AppData\Local\Temp\1592545292805

SM2性能更优更安全:密码复杂度高、处理速度快、机器性能消耗更小

①:加密算法以及流程:

输入:需要发送的消息为比特串M,klen为M的比特长度。

1.用随机数发生器产生随机数k∈[1,n-1],k的值为1到n-1

2.计算椭圆曲线点C1=[k]G=(x1,y1),将C1的数据类 型转换为比特串

3.计算椭圆曲线点S=[h]PB,若S是无穷远点,则报错并退出

4.计算椭圆曲线点[k]PB=(x2,y2),按本文本第1部分4.2.5和4.2.4给出的细节,将坐标x2、y2 的 数据类型转换为比特串

5.计算t=KDF(x2 ∥y2, klen),若t为全0比特串,则返回A1

6.计算C2 = M ⊕t

7.计算C3 = Hash(x2 ∥ M ∥ y2)

8.输出密文C = C1 ∥ C2 ∥ C3

加密算法流程:
在这里插入图片描述

②:解密算法以及流程

klen为密文中C2的比特长度,对密文C=C1 ∥ C2 ∥ C3 进行解密,需要实现以下步骤

1.从C中取出比特串C1,按本文本第1部分4.2.3和4.2.9给出的细节,将C1的数据类型转换为椭 圆曲线上的点,验证C1是否满足椭圆曲线方程,若不满足则报错并退出

2.计算椭圆曲线点S=[h]C1,若S是无穷远点,则报错并退出

3.计算[dB]C1=(x2,y2),按本文本第1部分4.2.5和4.2.4给出的细节,将坐标x2、y2的数据类型转 换为比特串

4.计算t=KDF(x2 ∥y2, klen),若t为全0比特串,则报错并退出

5.从C中取出比特串C2,计算M′ = C2 ⊕t

6.计算u = Hash(x2 ∥ M′ ∥ y2),从C中取出比特串C3,若u ̸= C3,则报错并退出
7.输出明文M′

解密算法流程:
在这里插入图片描述

③:SM2椭圆曲线公钥密码算法推荐曲线参数

椭圆曲线方程:y2 = x3 + ax + b。

曲线参数:

p=FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFF 

a=FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFC 

b=28E9FA9E 9D9F5E34 4D5A9E4B CF6509A7 F39789F5 15AB8F92 DDBCBD41 4D940E93 

n=FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF 7203DF6B 21C6052B 53BBF409 39D54123 

Gx=32C4AE2C 1F198119 5F990446 6A39C994 8FE30BBF F2660BE1 715A4589 334C74C7 

Gy=BC3736A2 F4F6779C 59BDCEE3 6B692153 D0A9877C C62A4740 02DF32E5 2139F0A0

二:SM4

简介:SM4由国家密码管理局于2012年3月21日发布,SM4 无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。

算法定义:该算法的分组长度为 128 比特,密钥长度为 128 比特。加密算 法与密钥扩展算法都采用 32 轮非线性迭代结构。解密算法与加密算法的结构相同,只是轮 密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序

(1)基本运算:

​ ⊕ 32 比特异或

​ i 32比特循环左移 i 位

(2)密钥及密钥参量 :
在这里插入图片描述

(3)轮函数 F:
在这里插入图片描述

(4)合成置换 T:
在这里插入图片描述
(5) 非线性变换τ
在这里插入图片描述

(6): 线性变换 L
在这里插入图片描述
(7):S 盒
在这里插入图片描述

(8)加/解密算法
在这里插入图片描述
(9):密钥扩展算法
在这里插入图片描述

00070e15, 1c232a31, 383f464d, 545b6269, 
70777e85, 8c939aa1, a8afb6bd, c4cbd2d9,
e0e7eef5, fc030a11, 181f262d, 343b4249, 
50575e65, 6c737a81, 888f969d, a4abb2b9, 
c0c7ced5, dce3eaf1, f8ff060d, 141b2229, 
30373e45, 4c535a61, 686f767d, 848b9299,
a0a7aeb5, bcc3cad1, d8dfe6ed, f4fb0209, 
10171e25, 2c333a41, 484f565d, 646b7279 

这边有个小demo:以供参考:https://download.csdn.net/download/kawayiyy123/12535104?spm=1001.2014.3001.5503

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/185419.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • pycharm全文搜索_pycharm查找快捷键

    pycharm全文搜索_pycharm查找快捷键在pycharm中如何全局搜索关键词

  • pycharm在linux系统汉化,PyCharm中文乱码问题的解决

    pycharm在linux系统汉化,PyCharm中文乱码问题的解决这几天一直挺困扰的是使用PyCharm之后一直对中文的乱码,即使添加了很多别人说的类似于#coding:utf-8的语句但是还是报错,让我抓狂,但是今天终于找到了解决的办法,还真的是让人很高兴啊,哈哈哈这是报错的窗口:典型的无法识别中文,在头添加#coding:utf-8之后还是报错的状态,所以就用了下面的方法,首先,我用的是PyCharm的4.5.3最新的版本进入设置界面,找到Editor–…

  • 什么是前端架构?[通俗易懂]

    什么是前端架构?[通俗易懂]什么是前端架构

    2022年10月31日
  • php redis设置过期的键,redis 设置键过期时间[通俗易懂]

    php redis设置过期的键,redis 设置键过期时间[通俗易懂]键过期功能的相关命令设置生存时间:EXPIRE命令和PEXPIRE命令。设置过期时间:EXPIREAT命令和PEXPIREAT命令。查看剩余生存时间:TTL命令和PTTL命令。删除生存时间或过期时间:PERSIST命令。设置生存时间EXPIREkeyseconds将键key的生存时间设置为指定的秒数。PEXPIREkeymilliseconds将键ke…

  • oracle定义游标例子_sqlserver游标实例

    oracle定义游标例子_sqlserver游标实例大佬教程收集整理的这篇文章主要介绍了Oracle游标的使用实例详解,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。什么是游标?①从表中检索出结果集,从中每次指向一条记录进行交互的机制。②关系数据库中的操作是在完整的行集合上执行的。由SELECT语句返回的行集合包括满足该语句的WHERE子句所列条件的所有行。由该语句返回完整的行集合叫做结果集。应用程序,尤其是互动和在线应用程序…

    2022年10月29日
  • hibernate和hibernation_unique sql

    hibernate和hibernation_unique sql Useruser=(Users)query.uniqueResult();//如果有多个值抛错;//如果有值且只有一个,返回一个object;//如果没值,返回null

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号