首页 > 编程语言 >SM9 - 密钥封装机制和公钥加密算法

SM9 - 密钥封装机制和公钥加密算法

时间:2025-01-20 15:20:36浏览次数:1  
标签:公钥 加密 SM9 比特 klen right 密钥 加密算法 left

符号
A,B:使用公钥密码系统的两个用户。
\(cf\):椭圆曲线阶相对于\(N\)的余因子。
\(cid\):用一个字节表示的曲线的标识符,其中\(\mbox{0x10}\)表示\(F_p\)(素数\(P>2^{191}\))上常曲线(即非超奇异曲线),\(\mbox{0x11}\)表示\(F_p\)表示超奇异曲线,\(\mbox{0x12}\)表示\(F_p\)上常曲线及其扭曲线。
\(Dec()\):分组解密算法。
\(de_B\):用户B的加密私钥。
\(Enc()\):分组加密算法。
\(e\):从\(G_1×G_2\)到\(G_T\)的双线性对。
\(eid\):用一个字节表示的双线性对\(e\)的标识符,其中\(\mbox{0x01}\)表示Tate对,\(\mbox{0x02}\)表示Weil对,\(\mbox{0x03}\)表示Ate对,\(\mbox{0x04}\)表示R-ate对。
\(G_T\):阶为素数\(N\)的乘法循环群。
\(G_1\):阶为素数\(N\)的加法循环群。
\(G_2\):阶为素数\(N\)的加法循环群。
\(g^u\):乘法群\(G_T\)中元素\(g\)的\(u\)次幂,\(g^{u} = \underset{u\text{个}}{\underbrace{g \cdot g \cdot \ldots \cdot g}}\),\(u\)是正整数。
\(H_v ()\),\(Hash()\):密码杂凑函数。
\(H_1 ()\):由密码杂凑函数派生的密码函数。
\(hid\):本部分中,用一个字节表示的加密私钥生成函数识别符,由KGC选择并公开。
\(ID_B\):用户B的表示,可以唯一确定用户B的公钥。
\(KDF()\):密钥派生函数。
\(M\):待加密的消息。
\(M'\):解密得到的消息。
\(MAC()\):消息认证码函数。
\(N\):循环群\(G_1\)、\(G_2\)和\(G_T\)的阶,为大于\(2^{191}\)的素数。
\(P_{pub-e}\):加密主公钥。
\(P_1\):群\(G_1\)的生成元。
\(P_2\):群\(G_2\)的生成元。
\(ke\):加密主私钥。
\(〈P〉\):由元素\(P\)生成的循环群。
\([u]P\):加法群\(G_1\)、\(G_2\)中元素\(P\)的\(u\)倍。
\(⌈x⌉\):顶函数,大于或等于\(x\)的最小整数。例如,\(⌈7⌉=7\),\(⌈8.3⌉=9\)。
\(⌊x⌋\):底函数,小于或等于\(y\)的最大整数。例如,\(⌊7⌋=7\),\(⌊8.3⌋=8\)。
\(x‖y\):\(x\)与\(y\)的拼接,其中\(x\)和\(y\)是比特串或字节串。
\([x,y]\):大于或等于\(x\)且小于或等于\(y\)的整数的集合。
\(⊕\):长度相等的两个比特串按比特的模\(2\)加运算。
\(β\):扭曲线参数。

系统加密主密钥和用户加密密钥的产生
KGC产生随机数\(ke∈[1,N-1]\)作为加密主私钥,计算\(G_1\)中的元素\(P_{pub-e}=[ke] P_1\)作为加密主公钥,则加密主密钥对为\((ke,P_{pub-e} )\)。KGC秘密保存\(ke\),公开\(P_{pub-e}\)。
KGC选择并公开用一个字节表示的加密私钥生成函数识别符\(hid\)。
用户B的标识为\(ID_B\),为产生用户B的加密私钥\(de_B\),KGC首先在有限域\(F_N\)上计算\(t_1=H_1⁡(ID_B ‖hid,N)+ke\),若\(t_1=0\)则需重新产生加密主私钥,计算和公开加密主公钥,并更新已有用户的加密私钥;否则计算\(t_2=ke⋅t_3^{-1}\),然后计算\(de_B=[t_2 ] P_2\)。

密码杂凑函数\(H_v ()\)
密码杂凑函数\(H_v ()\)的输出是长度恰为\(v\)比特的杂凑值。本部分规定使用国家密码管理主管部门批准的密码杂凑函数,如SM3密码杂凑算法。

密码函数\(H_1 ()\)
密码函数\(H_1⁡(Z,n)\)的输入为比特串\(Z\)和整数\(n\),输出为一个整数\(h_1∈[1,n-1]\)。\(H_1⁡(Z,n)\)需要调用密码杂凑函数\(H_v ()\)。
密码函数\(H_1⁡(Z,n)\):
输入:比特串\(Z\),整数\(n\)。
输出:整数\(h_1∈[1,n-1]\)。

  1. 初始化一个32比特构成的计数器\(ct=\mbox{0x00000001}\);
  2. 计算\(hlen=8×⌈(5×(\log{2}{⁡n}))⁄32⌉\);
  3. 对\(i\)从\(1\)到\(⌈hlen⁄v⌉\)执行:
    3.1. 计算\(Ha_i=H_v⁡(\mbox{0x01}‖Z‖ct)\);
    3.2. \(ct++\);
  4. 若\(hlen⁄v\)是整数,令\(Ha!_{⌈hlen⁄v⌉} =Ha_{⌈hlen⁄v⌉}\) ,否则令\(Ha!_{⌈hlen⁄v⌉}\) 为\(Ha_{⌈hlen⁄v⌉}\) 最左边的\((hlen-(v×⌊hlen⁄v⌋))\)比特;
  5. 令\(Ha=Ha_1 ‖Ha_2 ‖⋯‖Ha_{⌈hlen⁄v⌉-1} ‖Ha!_{⌈hlen⁄v⌉}\) ;
  6. 计算\(h_1=(Ha\mod{(n-1)})+1\)。

密钥派生函数
设密码杂凑函数为\(H_v ()\),其输出是长度为\(v\)比特的杂凑值。
密钥派生函数\(KDF⁡(Z,klen)\):
输入:比特串\(Z\),整数\(klen\)(表示要获得的密钥数据的比特长度,要求该值小于\((2^{32}-1)v\))。
输出:长度为\(klen\)的密钥数据比特串\(K\)。

  1. 初始化一个32比特构成的计数器\(ct=\mbox{0x00000001}\);
  2. 对\(i\)从\(1\)到\(⌈klen⁄v⌉\)执行:
    2.1. 计算\(Ha_i=H_v⁡(Z‖ct)\);
    2.2. \(ct++\);
  3. 若\(klen⁄v\)是整数,令\(Ha!_{⌈klen⁄v⌉} =Ha_{⌈klen⁄v⌉}\) ,否则令\(Ha!_{⌈klen⁄v⌉}\) 为\(Ha_{⌈klen⁄v⌉}\) 最左边的\((klen-(v×⌊klen⁄v⌋))\)比特;
  4. 令\(K=Ha_1 ‖Ha_2 ‖⋯‖Ha_{⌈klen⁄v⌉-1} ‖Ha!_{⌈klen⁄v⌉}\) 。

分组密码算法
分组加密算法包括加密算法\(Enc⁡(K_1,m)\)和解密算法\(Dec⁡(K_1,c)\)。\(Enc⁡(K_1,m)\)表示用密钥\(K_1\)对明文\(m\)进行加密,其输出为密文比特串\(c\);\(Dec⁡(K_1,c)\)表示用密钥\(K_1\)对密文\(c\)进行解密,其输出为明文比特串\(m\)或“错误”。密钥\(K_1\)的比特长度记为\(K_1\_len\)。
本部分规定使用国家密码管理主管部门批准的分组密码算法,如SM4分组密码算法。

消息认证码函数
消息认证码函数\(MAC⁡(K_2,Z)\)的作用是防止消息数据\(Z\)被非法篡改,它在密钥\(K_2\)的控制下,产生消息数据比特串\(Z\)的认证码,密钥\(K_2\)的比特长度记为\(K_2\_len\)。在本部分的基于标识的加密算法中,消息认证码函数使用密钥派生函数生成的密钥对密文比特串求取消息认证码,从而使解密者可以鉴别消息的来源和检验数据的完整性。
消息认证码函数需要调用密码杂凑函数。
设密码杂凑函数为\(H_v ()\),其输出是长度为\(v\)比特的杂凑值。
消息认证码函数\(MAC⁡(K_2,Z)\):
输入:比特串\(K_2\)(比特长度为\(K_2\_len\)的密钥),比特串\(Z\)(待求取消息认证码的消息)。
输出:长度为\(v\)的消息认证码数据比特串\(K\)。

  1. \(K=H_v⁡(Z‖K_2 )\)

密钥封装机制
密钥封装算法
为了封装比特长度为\(klen\)的密钥给用户B,作为封装者的用户A需要执行以下运算步骤:
 A1.计算群\(G_1\)中的元素\(Q_B=[H_1⁡(ID_B ‖hid,N) ] P_1+P_{pub-e}\);
 A2.产生随机数\(r∈[1,N-1]\);
 A3.计算群\(G_1\)中的元素\(C=[r] Q_B\);
 A4.计算群\(G_T\)中的元素\(g=e⁡(P_{pub-e},P_2 )\);
 A5.计算群\(G_T\)中的元素\(w=g^r\);
 A6.计算\(K=KDF⁡(C‖w‖ID_B,klen)\),若\(K\)为全0比特串,则返回A2;
 A7.输出\((K,C)\),其中\(K\)是被封装的密钥,\(C\)是封装密文。

解封装算法
用户B收到封装密文\(C\)后,为了对比比特长度为\(klen\)的密钥解封装,需要执行以下运算步骤:
 B1.验证\(C∈G_1\)是否成立,若不成立则报错并退出;
 B2.计算群\(G_T\)中的元素\(w'=e⁡(C,de_B )\);
 B3.计算封装的密钥\(K'=KDF⁡(C‖w'‖ID_B,klen)\),若\(K'\)为全0比特串,则报错并退出;
 B4.输出密钥\(K'\)。

公钥加密算法
加密算法
设需要发送的消息为比特串\(M\),\(mlen\)为\(M\)的比特长度,\(K_1\_len\)为分组密码算法中密钥\(K_1\)的比特长度,\(K_2\_len\)为函数\(MAC⁡(K_2,Z)\)中密钥\(K_2\)的比特长度。
为了加密明文\(M\)给用户B,作为加密者的用户A应实现以下运算步骤:
 A1.计算群\(G_1\)中的元素\(Q_B=[H_1⁡(ID_B ‖hid,N) ] P_1+P_{pub-e}\);
 A2.产生随机数\(r∈[1,N-1]\);
 A3.计算群\(G_1\)中的元素\(C_1=[r] Q_B\);
 A4.计算群\(G_T\)中的元素\(g=e⁡(P_{pub-e},P_2 )\);
 A5.计算群\(G_T\)中的元素\(w=g^r\);
 A6.按加密明文的方法分类进行计算:
  a) 如果加密明文的方法是基于密钥派生函数的序列密码算法,则
   1) 计算整数\(klen=mlen+K_2\_len\),然后计算\(K=KDF⁡(C_1 ‖w‖ID_B,klen)\)。令\(K_1\)为\(K\)最左边的\(mlen\)比特,\(K_2\)为剩下的\(K_2\_len\)比特,若\(K_1\)为全0比特串,则返回A2;
   2) 计算\(C_2=M⊕K_1\)。
  b) 如果加密明文的方法是结合密钥派生函数的分组密码算法,则
   1) 计算整数\(klen=K_1\_len+K_2\_len\),然后计算\(K=KDF⁡(C_1 ‖w‖ID_B,klen)\)。令\(K_1\)为\(K\)最左边的\(K_1\_len\)比特,\(K_2\)为剩下的\(K_2\_len\)比特,若\(K_1\)为全0比特串,则返回A2;
   2) 计算\(C_2=Enc⁡(K_1,M)\)。
 A7.计算\(C_3=MAC⁡(K_2,C_2 )\);
 A8.输出密文\(C=C_1 ‖C_2 ‖C_3\)。

解密算法
设\(mlen\)为密文\(C=C_1 ‖C_2 ‖ C_3\)中\(C_2\)的比特长度,\(K_1\_len\)为分组密码算法中密钥\(K_1\)的比特长度,\(K_2\_len\)为函数\(MAC⁡(K_2,Z)\)中密钥\(K_2\)的比特长度。
为了对\(C\)进行解密,作为解密者的用户B应实现以下运算步骤:
 B1.从\(C\)中取出比特串\(C_1\),验证\(C_1∈G_1\)是否成立,若不成立则报错并退出;
 B2.计算群\(G_T\)中的元素\(w'=e⁡(C_1,de_B )\);
 B3.按加密明文的方法分类进行计算:
  a) 如果加密明文的方法是基于密钥派生函数的序列密码算法,则
   1) 计算整数\(klen=mlen+K_2\_len\),然后计算\(K'=KDF⁡(C_1 ‖w'‖ID_B,klen)\)。令\(K_1'\)为\(K'\)最左边的\(mlen\)比特,\(K_2'\)为剩下的\(K_2\_len\)比特,若\(K_1'\)为全0比特串,则报错并退出;
   2) 计算\(M'=C_2⊕K_1'\)。
  b) 如果加密明文的方法是结合密钥派生函数的分组密码算法,则
   1) 计算整数\(klen=K_1\_len+K_2\_len\),然后计算\(K'=KDF⁡(C_1 ‖w'‖ID_B,klen)\)。令\(K_1'\)为\(K'\)最左边的\(K_1\_len\)比特,\(K_2'\)为剩下的\(K_2\_len\)比特,若\(K_1'\)为全0比特串,则报错并退出;
   2) 计算\(M'=Dec⁡(K_1',C_2 )\)。
 B4.计算\(u=MAC⁡(K_2',C_2 )\),从\(C\)中取出比特串\(C_3\),若\(u≠C_3\),则报错并退出;
 B5.输出明文\(M'\)。

注1:注意到加密主公钥为\(P_{pub-e}=[ke] P_1\),且用户B的加密私钥为

$ \left. t_{1} = {H_{1}\left( {\left. {ID}_{B} \right\| hid,N} \right)} + ke\Rightarrow t_{2} = ke \cdot {t_{1}}^{- 1}\Rightarrow{de}_{B} = \left\lbrack t_{2} \right\rbrack P_{2} \right. $
进而步骤A1(进对公钥加密算法部分进行讨论,密钥封装机制已包含在算法之中)有
$ Q_{B} = \left\lbrack {H_{1}\left( {\left. {ID}_{B} \right\| hid,N} \right)} \right\rbrack P_{1} + P_{pub - e} = \left\lbrack {{H_{1}\left( {\left. {ID}_{B} \right\| hid,N} \right)} + ke} \right\rbrack P_{1} = \left\lbrack t_{1} \right\rbrack P_{1} $
则对于步骤A3有
$ C_{1} = \lbrack r\rbrack Q_{B} = \left\lbrack {r \bullet t_{1}} \right\rbrack P_{1} $
此时,观察步骤A5及B2获得$w$及$w'$具有如下关系(双线性对的性质参阅注2)
$ w = g^{r} = {e\left( {P_{pub - e},P_{2}} \right)}^{r} = {e\left( {P_{1},P_{2}} \right)}^{ke \cdot r} = {e\left( {\left\lbrack {r \bullet t_{1}} \right\rbrack P_{1},\left\lbrack {ke \cdot {t_{1}}^{- 1}} \right\rbrack P_{2}} \right)} = {e\left( {C_{1},{de}_{B}} \right)} = w^{'} $
所以,步骤A6及B3的计算
$ \left\{ \begin{array}{l} {K = {\mathit{KDF}\left( {\left. C_{1} \right\|\left. w \right\|{ID}_{B},klen} \right)}} \\ {K' = {\mathit{KDF}\left( {\left. C_{1} \right\|\left. w' \right\|{ID}_{B},klen} \right)}} \end{array} \right. $
有$K=K'$,即用户A、B会获得相同的共享秘密密钥。同时,对于验证步骤A7及B4有
$ C_{3} = {\mathit{MAC}\left( {K_{2},C_{2}} \right)} = {\mathit{MAC}\left( {K_{2}',C_{2}} \right)} = u $
即在计算无误、传输无误、过程中无篡改、未受伪造、未受密码分析的攻击等情况时验证可通过,且可以保证用户双方共享相同的秘密密钥。

注2:双线性对
设\((G_1,+)\)、\((G_2,+)\)和\((G_T,⋅)\)是3个循环群,\(G_1\)、\(G_2\)和\(G_T\)的阶均为素数\(N\),\(P_1\)是\(G_1\)的生成元,\(P_2\)是\(G_2\)的生成元,存在\(G_2\)到\(G_1\)的同态映射\(ψ\)使得\(ψ⁡(P_2 )=P_1\)。
双线性对\(e\)是\(G_1×G_2→G_T\)的映射,满足如下条件:
 a) 双线性性:对任意的\(P∈G_1\),\(Q∈G_2\),\(a,b∈Z_N\),有\(e⁡([a]P,[b]Q)={e⁡(P,Q)}^{ab}\);
 b) 非退化性:\(e(P_1,P_2 )≠1_(G_T )\);
 c) 可计算性:对任意的\(P∈G_1\),\(Q∈G_2\),存在有效的算法计算\(e⁡(P,Q)\)。
标准GM/T 0044.1—2016中7.1节、GM/T 0044.5—2016中3.1节规定了,SM9算法使用R-ate对(\(eid\):\(\mbox{0x04}\))。

标签:公钥,加密,SM9,比特,klen,right,密钥,加密算法,left
From: https://www.cnblogs.com/miro-cnblogs/p/18681264

相关文章

  • 【密码学与网络安全】拉宾公钥密码加密解密
    实验目的与要求1.学会用任意编程语言完成初步加解密算法编程;2.掌握拉宾公钥的加密和解密原理;3.学会用规范的方法书写实验报告。实验原理与内容共两个实验,分别如下:一、拉宾公钥加密解密1.拉宾公钥加解密原理Alice要求Bob将信息m加密传送回.(1)密钥生成:Alice找到......
  • SM9 - 密钥交换协议
    符号A,B:使用公钥密码系统的两个用户。\(cf\):椭圆曲线阶相对于\(N\)的余因子。\(cid\):用一个字节表示的曲线的标识符,其中\(\mbox{0x10}\)表示\(F_p\)(素数\(P>2^{191}\))上常曲线(即非超奇异曲线),\(\mbox{0x11}\)表示\(F_p\)表示超奇异曲线,\(\mbox{0x12}\)表示\(F_p\)上常曲线及其扭......
  • #渗透测试#网络安全# 一文搞懂什么是公钥和私钥!!!
    免责声明本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。目录一、什么是公钥和私钥公钥和私钥的基本概念一、私钥二......
  • 网站扫描出的漏洞解决:检测到目标Content-Security-Policy、X-XSS-Protection/Content-
    网站扫描出的漏洞解决:检测到目标Content-Security-Policy、X-XSS-Protection/Content-Security-Policy响应头缺失、加密算法等处理修复方法使用一些漏洞扫描工具对服务器进行搜查,总得扫出一些漏洞,比如检测到目标X-…响应头缺失之类的,扫描后报了不少头漏洞问题,之前碰到过也......
  • 10.18软件设计——工厂方法模式之加密算法
    软件设计——工厂方法模式之加密算法1、类图   2、源代码 2.1结构目录   2.2所需jar包 这里分享几个下载jar包的网址: http://www.mvnrepository.com/ http://mvnrepository.com/ http://findjar.com http://sourceforge.net/ 注:将......
  • 自定义加密算法
    常见的哈希算法如Caesar,Base64,MurmurHash等已经被安全研究人员盯上了,经常使用这些算法作为特征定位恶意软件,因此最好使用自定义算法或不常见算法。base58加密cmd.exe#include<winsock2.h>#include<string.h>#include<stdio.h>#include<stdlib.h>constchar*const......
  • 恶意软件常用加密算法
    前面主要是加密字符串信息,加密算法还可以加密shellcode、通信数据包、配置信息等一、常用加密算法概述加密配置信息、加密通信信道、加密窃取数据、混淆代码放置静态分析总体来说就是加密shellcode、代码模块、配置信息、通信等二、加密配置信息设置一个场景,恶意dll文件,放在h......
  • 使用公钥通过mobaxterm登录sshd被拒绝
    问题现象是,使用mobaxterm登录ubuntu24.04后台失败。mobaxterm上提示ServerrefusedourkeyNosupportedauthenticationmethodsavailable(serversent:publickey) 启用sshd最低调试级别日志vi/etc/ssh/sshd_configLogLevelDEBUG3看到的错误信息是userauth_pubkey......
  • 《深入挖掘Python加解密:自定义加密算法的设计与实现》
    利用python实现加解密在正式编写各种加解密前,我们先写个小案例,如下。封面在文末呦!基础加解密-源码# 加密def encode():    source01 = '乐茵'    for c in source01:        ascii01 = ord(c)        ascii01 += 1      ......
  • 若依(spring-cloud)修改登陆密码加密算法
    文章目录前言一、解决办法二、解决过程1为啥要改加密算法2找不到校验代码总结前言若依是一套快速集成各种中间件的配套Java后端框架,本文旨在描述修改其登陆的加密算法。文章的大前提是后端框架是若依哈,不是的话可以跳过了~!文章创作原因:系统针对登陆密码是密文......