小王的尴尬日常(三)--Openssl 实现国密算法(加密和解密)

上一次讲了产生密钥,这次我们讲一下加密解密的实现。
先说一下加密解密的流程,一下这些内容都是从国密局发布的国密标准文档里面摘录出来的。大家可以去国密局的网站上自己下载。

下列符号适用于本部分。
A,B:使用公钥密码系统的两个用户。
a,b: Fq中的元素,它们定义Fq上的一条椭圆曲线E。
dB:用户B的私钥。
E(Fq): Fq上椭圆曲线E 的所有有理点(包括无穷远点O)组成的集合。
Fq
:包含q个元素的有限域。
G:椭圆曲线的一个基点,其阶为素数。
2Hash( ):密码杂凑函数。
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(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)的阶

加密过程

设需要发送的消息为比特串M, klen为M的比特长度。
为了对明文M进行加密,作为加密者的用户A应实现以下运算步骤:
A1:用随机数发生器产生随机数k∈[1,n-1];
A2:计算椭圆曲线点C1=[k]G=(x1,y1),按本文本第1部分4.2.8和4.2.4给出的细节,将C1的数据类
型转换为比特串;
A3:计算椭圆曲线点S=[h]PB,若S是无穷远点,则报错并退出;
A4:计算椭圆曲线点[k]PB=(x2,y2),按本文本第1部分4.2.5和4.2.4给出的细节,将坐标x2、 y2 的
数据类型转换为比特串;
A5:计算t=KDF(x2 ∥ y2, klen),若t为全0比特串,则返回A1;
A6:计算C2 = M ⊕ t;
A7:计算C3 = Hash(x2 ∥ M ∥ y2);
A8:输出密文C = C1 ∥ C2 ∥ C3。

道人家给画好了,我们需要做的就是把它转化成代码….对了,还有一张流程图。
加密流程图

接下来上代码:

    unsigned char* t, *hm;
    BIGNUM* rand;
    EC_POINT* rG, *rK;
    BIGNUM *rKx, *rKy, *rGx, *rGy;

    unsigned char bK[65] = {
  0};
    unsigned char C3[
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值