求 国密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