国密算法c语言实现,求 国密sm2 算法 第四部分 公钥加密算法 c语言实现代码,该怎么解决...

当前位置:我的异常网» C++ » 求 国密sm2 算法 第四部分 公钥加密算法 c语言实现

求 国密sm2 算法 第四部分 公钥加密算法 c语言实现代码,该怎么解决

www.myexceptions.net  网友分享于:2014-07-26  浏览:0次

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

文章评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值