求 国密sm2 算法 第四部分 公钥加密算法 c语言实现代码,该怎么解决
求 国密sm2 算法 第四部分 公钥加密算法 c语言实现代码
本人初学者,,,算法实现摸不着头脑啊,c或c++语言实现公钥加密部分代码,请各位高手赐教,规范如下。。。
SM2椭圆曲线公钥密码算法
第4部分:公钥加密算法
Public Key Cryptographic Algorithm SM2 Based on Elliptic Curves
Part 4: Public Key Encryption Algorithm
国家密码管理局
2010年12月
《SM2椭圆曲线公钥密码算法》分为四个部分:
第1部分:总则
第2部分:数字签名算法
第3部分:密钥交换协议
第4部分:公钥加密算法
本部分为第4部分。
本部分的附录A为资料性附录。
II
引引引 言言言
N.Koblitz和V.Miller在1985年各自独立地提出将椭圆曲线应用于公钥密码系统。椭圆曲线公钥密码
所基于的曲线性质如下:
有限域上椭圆曲线在点加运算下构成有限交换群,且其阶与基域规模相近;
类似于有限域乘法群中的乘幂运算,椭圆曲线多倍点运算构成一个单向函数。
在多倍点运算中,已知多倍点与基点,求解倍数的问题称为椭圆曲线离散对数问题。对于一般椭
圆曲线的离散对数问题,目前只存在指数级计算复杂度的求解方法。与大数分解问题及有限域上离散
对数问题相比,椭圆曲线离散对数问题的求解难度要大得多。因此,在相同安全程度要求下,椭圆曲
线密码较其它公钥密码所需的密钥规模要小得多。
本部分描述了基于椭圆曲线的公钥加密算法。
III
SM2椭圆曲线公钥密码算法
第4部分:公钥加密算法
1 范范范围围围
本部分规定了SM2椭圆曲线公钥密码算法的公钥加密算法,并给出了消息加解密示例和相应的流
程。
本部分适用于国家商用密码应用中的消息加解密,消息发送者可以利用接收者的公钥对消息进行
加密,接收者用对应的私钥进行解密,获取消息。同时,本部分还可为安全产品生产商提供产品和技
术的标准定位以及标准化的参考,提高安全产品的可信性与互操作性。
2 规规规范范范性性性引引引用用用文文文件件件
下列文件中的条款通过本部分引用而成为本部分的条款。凡是注日期的引用文件,其随后所有的
修改单(不包括勘误的内容)或修订版均不适用于本部分,然而,鼓励根据本部分达成协议的各方研
究是否可使用这些文件的最新版本。凡是不注日期的引用文件,其最新版本适用于本部分。
SM2椭圆曲线公钥密码算法 第1部分:总则
3 术术术语语语和和和定定定义义义
下列术语和定义适用于本部分。
3.1
非非非对对对称称称密密密码码码算算算法法法 asymmetric cryptographic algorithm
使用公钥进行加密而使用私钥进行解密的一类密码算法,已知公钥求私钥在计算上不可行。
[ANSI X9.63-2001]
3.2
密密密钥钥钥 key
确定密码函数运算的一个参数,它用于:
a) 加密或解密变换;
b) 同步产生共享秘密;
c) 数字签名的生成或验证。
[ANSI X9.63-2001]
3.3
私私私钥钥钥 private key
在非对称密码体制中,实体自己保持的、只有实体自身知道的一种密钥。
[ISO/IEC 15946-3 3.24]
3.4
公公公钥钥钥 public key
在非对称密码体制中,实体的一种可以公开的密钥。
[ISO/IEC 15946-3 3.25]
3.5
秘密密钥 secret key
在密码体制中收发双方共同拥有的、而第三方不知道的一种密钥。
[ISO/IEC 15946-3 3.26]
3.6
1
消息 message
任意有限长度的比特串。
[ISO/IEC 15946-4 3.7]
3.7
明文 plaintext
无需利用密码技术即可得出语义内容的数据。
[GB/T 5271.8-2001 03.07]
3.8
密文 ciphertext
利用加密技术产生的数据,若不使用密码技术,则得不到其语义内容。
[GB/T 5271.8-2001 03.08]
3.9
加密 encipherment
为了产生密文,即隐藏数据的信息内容,由密码算法对数据进行(可逆)变换。
[GB/T 15843.1-1999 3.3.10]
3.10
解密 decipherment
加密对应的逆过程。
[GB/T 15843.1-1999 3.3.8]
3.11
杂凑函数 hash function
将一个比特串映射为一个固定长度比特串的函数。该函数满足如下性质:
a) 对于任意给定的输出,要找到其对应的输入,在计算上是不可行的;
b) 对于任意给定的输入,要找到输出相同的另一个输入,在计算上是不可行的。
注:计算可行性依赖于具体的安全需求和环境。
[ISO/IEC 15946-2 3.1.3]
3.12
杂凑值 hash value
杂凑函数作用于一条消息时输出的比特串。
[ISO/IEC 15946-2 3.1.2]
3.13
密钥派生函数key derivation function
通过作用于共享秘密和双方都知道的其它参数,产生一个或多个共享秘密密钥的函数。
[ANSI X9.63-2001]
4 符符符号号号
下列符号适用于本部分。
A,B:使用公钥密码系统的两个用户。
a,b:Fq中的元素,它们定义Fq上的一条椭圆曲线E。
d
B:用户B的私钥。
E(Fq
):Fq上椭圆曲线E的所有有理点(包括无穷远点O)组成的集合。
Fq:包含q个元素的有限域。
G:椭圆曲线的一个基点,其阶为素数。
2
Hash( ):密码杂凑函数。
Hv
( ):消息摘要长度为v比特的密码杂凑函数。
KDF( ):密钥派生函数。
M:待加密的消息。
M
′
:解密得到的消息。
n:基点G的阶(n是# E(Fq
)的素因子)。
O:椭圆曲线上的一个特殊点,称为无穷远点或零点,是椭圆曲线加法群的单位元。
PB:用户B的公钥。
q:有限域Fq中元素的数目。
x∥y:x与y的拼接,其中x、y可以是比特串或字节串。
[k]P:椭圆曲线上点P的k倍点,即,[k]P=P+P+·· ·+P
| {z }
k个
,k是正整数。
[x,y]:大于或等于x且小于或等于y的整数的集合。
⌈x⌉:顶函数,大于或等于x的最小整数。例如⌈7⌉=7,⌈8.3⌉=9。
⌊x⌋:底函数,小于或等于x的最大整数。例如⌊7⌋=7,⌊8.3⌋=8。
#E(Fq
):E(Fq
)上点的数目,称为椭圆曲线E(Fq
)的阶。
5 算算算法法法参参参数数数与与与辅辅辅助助助函函函数数数
5.1 总则
公钥加密算法规定发送者用接收者的公钥将消息加密成密文,接收者用自已的私钥对收到的密文
进行解密还原成原始消息。
5.2 椭圆曲线系统参数
椭圆曲线系统参数包括有限域Fq的规模q(当q=2
m
时,还包括元素表示法的标识和约化多项式);
定义椭圆曲线E(Fq
)的方程的两个元素a、b∈Fq;E(Fq
)上的基点G=(x
G
,y
G
)(G̸=O),其中x
G和y
G是Fq中
的两个元素;G的阶n及其它可选项(如n的余因子h等)。
椭圆曲线系统参数及其验证应符合本文本第1部分第5章的规定。
5.3 用户密钥对
用户B的密钥对包括其私钥d
B和公钥PB
=[d
B
]G。
用户密钥对的生成算法与公钥验证算法应符合本文本第1部分第6章的规定。
5.4 辅助函数
5.4.1 概述
本部分规定的椭圆曲线公钥加密算法涉及到三类辅助函数:密码杂凑函数、密钥派生函数和随机
数发生器。这三类辅助函数的强弱直接影响加密算法的安全性。
5.4.2 密码杂凑函数
本部分规定使用国家密码管理局批准的密码杂凑算法,如SM3密码杂凑算法。
3
5.4.3 密钥派生函数
密钥派生函数的作用是从一个共享的秘密比特串中派生出密钥数据。在密钥协商过程中,密钥派
生函数作用在密钥交换所获共享的秘密比特串上,从中产生所需的会话密钥或进一步加密所需的密钥
数据。
密钥派生函数需要调用密码杂凑函数。
设密码杂凑函数为Hv
( ),其输出是长度恰为v比特的杂凑值。
密钥派生函数KDF(Z, klen):
输入:比特串Z,整数klen(表示要获得的密钥数据的比特长度,要求该值小于(2
32
-1)v)。
输出:长度为klen的密钥数据比特串K。
a)初始化一个32比特构成的计数器ct=0x00000001;
b)对i从1到⌈klen/v⌉执行:
b.1)计算Hai
=Hv
(Z∥ct);
b.2)ct++;
c)若klen/v是整数,令Ha!
⌈klen=v⌉ =Ha⌈klen=v⌉,否则令Ha!
⌈klen=v⌉为Ha⌈klen=v⌉最左边的(klen−
(v× ⌊klen=v⌋))比特;
d)令K=Ha1
||Ha2
||· · ·||Ha⌈klen=v⌉−1
||Ha!
⌈klen=v⌉。
5.4.4 随机数发生器
本部分规定使用国家密码管理局批准的随机数发生器。
6 加加加密密密算算算法法法及及及流流流程程程
6.1 加密算法
设需要发送的消息为比特串M,klen为M的比特长度。
为了对明文M进行加密,作为加密者的用户A应实现以下运算步骤:
A1:用随机数发生器产生随机数k∈[1,n-1];
A2:计算椭圆曲线点C1
=[k]G=(x
1
,y
1
),按本文本第1部分4.2.8和4.2.4给出的细节,将C1的数据类
型转换为比特串;
A3:计算椭圆曲线点S=[h]PB,若S是无穷远点,则报错并退出;
A4:计算椭圆曲线点[k]PB
=(x
2
,y
2
),按本文本第1部分4.2.5和4.2.4给出的细节,将坐标x
2、y
2 的
数据类型转换为比特串;
A5:计算t=KDF(x
2
∥y
2
, klen),若t为全0比特串,则返回A1;
A6:计算C2 =M⊕t;
A7:计算C3 =Hash(x
2
∥M∥y
2
);
A8:输出密文C=C1
∥C2
∥C3。
注:加密过程的示例参见附录A。
4
6.2 加密算法流程
图1 加密算法流程
7 解解解密密密算算算法法法及及及流流流程程程
7.1 解密算法
设klen为密文中C2的比特长度。
为了对密文C=C1
本人初学者,,,算法实现摸不着头脑啊,c或c++语言实现公钥加密部分代码,请各位高手赐教,规范如下。。。
SM2椭圆曲线公钥密码算法
第4部分:公钥加密算法
Public Key Cryptographic Algorithm SM2 Based on Elliptic Curves
Part 4: Public Key Encryption Algorithm
国家密码管理局
2010年12月
《SM2椭圆曲线公钥密码算法》分为四个部分:
第1部分:总则
第2部分:数字签名算法
第3部分:密钥交换协议
第4部分:公钥加密算法
本部分为第4部分。
本部分的附录A为资料性附录。
II
引引引 言言言
N.Koblitz和V.Miller在1985年各自独立地提出将椭圆曲线应用于公钥密码系统。椭圆曲线公钥密码
所基于的曲线性质如下:
有限域上椭圆曲线在点加运算下构成有限交换群,且其阶与基域规模相近;
类似于有限域乘法群中的乘幂运算,椭圆曲线多倍点运算构成一个单向函数。
在多倍点运算中,已知多倍点与基点,求解倍数的问题称为椭圆曲线离散对数问题。对于一般椭
圆曲线的离散对数问题,目前只存在指数级计算复杂度的求解方法。与大数分解问题及有限域上离散
对数问题相比,椭圆曲线离散对数问题的求解难度要大得多。因此,在相同安全程度要求下,椭圆曲
线密码较其它公钥密码所需的密钥规模要小得多。
本部分描述了基于椭圆曲线的公钥加密算法。
III
SM2椭圆曲线公钥密码算法
第4部分:公钥加密算法
1 范范范围围围
本部分规定了SM2椭圆曲线公钥密码算法的公钥加密算法,并给出了消息加解密示例和相应的流
程。
本部分适用于国家商用密码应用中的消息加解密,消息发送者可以利用接收者的公钥对消息进行
加密,接收者用对应的私钥进行解密,获取消息。同时,本部分还可为安全产品生产商提供产品和技
术的标准定位以及标准化的参考,提高安全产品的可信性与互操作性。
2 规规规范范范性性性引引引用用用文文文件件件
下列文件中的条款通过本部分引用而成为本部分的条款。凡是注日期的引用文件,其随后所有的
修改单(不包括勘误的内容)或修订版均不适用于本部分,然而,鼓励根据本部分达成协议的各方研
究是否可使用这些文件的最新版本。凡是不注日期的引用文件,其最新版本适用于本部分。
SM2椭圆曲线公钥密码算法 第1部分:总则
3 术术术语语语和和和定定定义义义
下列术语和定义适用于本部分。
3.1
非非非对对对称称称密密密码码码算算算法法法 asymmetric cryptographic algorithm
使用公钥进行加密而使用私钥进行解密的一类密码算法,已知公钥求私钥在计算上不可行。
[ANSI X9.63-2001]
3.2
密密密钥钥钥 key
确定密码函数运算的一个参数,它用于:
a) 加密或解密变换;
b) 同步产生共享秘密;
c) 数字签名的生成或验证。
[ANSI X9.63-2001]
3.3
私私私钥钥钥 private key
在非对称密码体制中,实体自己保持的、只有实体自身知道的一种密钥。
[ISO/IEC 15946-3 3.24]
3.4
公公公钥钥钥 public key
在非对称密码体制中,实体的一种可以公开的密钥。
[ISO/IEC 15946-3 3.25]
3.5
秘密密钥 secret key
在密码体制中收发双方共同拥有的、而第三方不知道的一种密钥。
[ISO/IEC 15946-3 3.26]
3.6
1
消息 message
任意有限长度的比特串。
[ISO/IEC 15946-4 3.7]
3.7
明文 plaintext
无需利用密码技术即可得出语义内容的数据。
[GB/T 5271.8-2001 03.07]
3.8
密文 ciphertext
利用加密技术产生的数据,若不使用密码技术,则得不到其语义内容。
[GB/T 5271.8-2001 03.08]
3.9
加密 encipherment
为了产生密文,即隐藏数据的信息内容,由密码算法对数据进行(可逆)变换。
[GB/T 15843.1-1999 3.3.10]
3.10
解密 decipherment
加密对应的逆过程。
[GB/T 15843.1-1999 3.3.8]
3.11
杂凑函数 hash function
将一个比特串映射为一个固定长度比特串的函数。该函数满足如下性质:
a) 对于任意给定的输出,要找到其对应的输入,在计算上是不可行的;
b) 对于任意给定的输入,要找到输出相同的另一个输入,在计算上是不可行的。
注:计算可行性依赖于具体的安全需求和环境。
[ISO/IEC 15946-2 3.1.3]
3.12
杂凑值 hash value
杂凑函数作用于一条消息时输出的比特串。
[ISO/IEC 15946-2 3.1.2]
3.13
密钥派生函数key derivation function
通过作用于共享秘密和双方都知道的其它参数,产生一个或多个共享秘密密钥的函数。
[ANSI X9.63-2001]
4 符符符号号号
下列符号适用于本部分。
A,B:使用公钥密码系统的两个用户。
a,b:Fq中的元素,它们定义Fq上的一条椭圆曲线E。
d
B:用户B的私钥。
E(Fq
):Fq上椭圆曲线E的所有有理点(包括无穷远点O)组成的集合。
Fq:包含q个元素的有限域。
G:椭圆曲线的一个基点,其阶为素数。
2
Hash( ):密码杂凑函数。
Hv
( ):消息摘要长度为v比特的密码杂凑函数。
KDF( ):密钥派生函数。
M:待加密的消息。
M
′
:解密得到的消息。
n:基点G的阶(n是# E(Fq
)的素因子)。
O:椭圆曲线上的一个特殊点,称为无穷远点或零点,是椭圆曲线加法群的单位元。
PB:用户B的公钥。
q:有限域Fq中元素的数目。
x∥y:x与y的拼接,其中x、y可以是比特串或字节串。
[k]P:椭圆曲线上点P的k倍点,即,[k]P=P+P+·· ·+P
| {z }
k个
,k是正整数。
[x,y]:大于或等于x且小于或等于y的整数的集合。
⌈x⌉:顶函数,大于或等于x的最小整数。例如⌈7⌉=7,⌈8.3⌉=9。
⌊x⌋:底函数,小于或等于x的最大整数。例如⌊7⌋=7,⌊8.3⌋=8。
#E(Fq
):E(Fq
)上点的数目,称为椭圆曲线E(Fq
)的阶。
5 算算算法法法参参参数数数与与与辅辅辅助助助函函函数数数
5.1 总则
公钥加密算法规定发送者用接收者的公钥将消息加密成密文,接收者用自已的私钥对收到的密文
进行解密还原成原始消息。
5.2 椭圆曲线系统参数
椭圆曲线系统参数包括有限域Fq的规模q(当q=2
m
时,还包括元素表示法的标识和约化多项式);
定义椭圆曲线E(Fq
)的方程的两个元素a、b∈Fq;E(Fq
)上的基点G=(x
G
,y
G
)(G̸=O),其中x
G和y
G是Fq中
的两个元素;G的阶n及其它可选项(如n的余因子h等)。
椭圆曲线系统参数及其验证应符合本文本第1部分第5章的规定。
5.3 用户密钥对
用户B的密钥对包括其私钥d
B和公钥PB
=[d
B
]G。
用户密钥对的生成算法与公钥验证算法应符合本文本第1部分第6章的规定。
5.4 辅助函数
5.4.1 概述
本部分规定的椭圆曲线公钥加密算法涉及到三类辅助函数:密码杂凑函数、密钥派生函数和随机
数发生器。这三类辅助函数的强弱直接影响加密算法的安全性。
5.4.2 密码杂凑函数
本部分规定使用国家密码管理局批准的密码杂凑算法,如SM3密码杂凑算法。
3
5.4.3 密钥派生函数
密钥派生函数的作用是从一个共享的秘密比特串中派生出密钥数据。在密钥协商过程中,密钥派
生函数作用在密钥交换所获共享的秘密比特串上,从中产生所需的会话密钥或进一步加密所需的密钥
数据。
密钥派生函数需要调用密码杂凑函数。
设密码杂凑函数为Hv
( ),其输出是长度恰为v比特的杂凑值。
密钥派生函数KDF(Z, klen):
输入:比特串Z,整数klen(表示要获得的密钥数据的比特长度,要求该值小于(2
32
-1)v)。
输出:长度为klen的密钥数据比特串K。
a)初始化一个32比特构成的计数器ct=0x00000001;
b)对i从1到⌈klen/v⌉执行:
b.1)计算Hai
=Hv
(Z∥ct);
b.2)ct++;
c)若klen/v是整数,令Ha!
⌈klen=v⌉ =Ha⌈klen=v⌉,否则令Ha!
⌈klen=v⌉为Ha⌈klen=v⌉最左边的(klen−
(v× ⌊klen=v⌋))比特;
d)令K=Ha1
||Ha2
||· · ·||Ha⌈klen=v⌉−1
||Ha!
⌈klen=v⌉。
5.4.4 随机数发生器
本部分规定使用国家密码管理局批准的随机数发生器。
6 加加加密密密算算算法法法及及及流流流程程程
6.1 加密算法
设需要发送的消息为比特串M,klen为M的比特长度。
为了对明文M进行加密,作为加密者的用户A应实现以下运算步骤:
A1:用随机数发生器产生随机数k∈[1,n-1];
A2:计算椭圆曲线点C1
=[k]G=(x
1
,y
1
),按本文本第1部分4.2.8和4.2.4给出的细节,将C1的数据类
型转换为比特串;
A3:计算椭圆曲线点S=[h]PB,若S是无穷远点,则报错并退出;
A4:计算椭圆曲线点[k]PB
=(x
2
,y
2
),按本文本第1部分4.2.5和4.2.4给出的细节,将坐标x
2、y
2 的
数据类型转换为比特串;
A5:计算t=KDF(x
2
∥y
2
, klen),若t为全0比特串,则返回A1;
A6:计算C2 =M⊕t;
A7:计算C3 =Hash(x
2
∥M∥y
2
);
A8:输出密文C=C1
∥C2
∥C3。
注:加密过程的示例参见附录A。
4
6.2 加密算法流程
图1 加密算法流程
7 解解解密密密算算算法法法及及及流流流程程程
7.1 解密算法
设klen为密文中C2的比特长度。
为了对密文C=C1