上一次讲了产生密钥,这次我们讲一下加密解密的实现。

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

下列符号适用于本部分。
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[33] = {0};rG = EC_POINT_new(this->mGroup);rK = EC_POINT_new(this->mGroup);rand = BN_new();//随机数k∈[1,n-1]BN_rand_range(rand, this->z);//C1=[k]G=(x1,y1)EC_POINT_mul(this->mGroup, rG, NULL,this->mGP, rand, this->ctx);rGx = BN_new();rGy = BN_new();if(!EC_POINT_get_affine_coordinates_GFp(this->mGroup, rG, rGx, rGy, this->ctx)){return -3;}BN_bn2bin(rGx, pd);BN_bn2bin(rGy, &pd[32]);//[k]PB=(x2,y2)EC_POINT_mul(this->mGroup, rK, NULL, EC_KEY_get0_public_key(this->mKey), rand, this->ctx);rKx = BN_new();rKy = BN_new();if(!EC_POINT_get_affine_coordinates_GFp(this->mGroup, rK, rKx, rKy, this->ctx)){return -3;}//t=KDF(x2||y2, klen)   BN_bn2bin(rKx, bK);BN_bn2bin(rKy, &bK[32]);t = new BYTE[elen + 1];memset(t, 0, elen + 1);this->mKDF(bK, 64, elen, t);for (int i = elen; i--;){t[i] = t[i]^pe[i];}//C3 = Hash(x2||M||y2)hm = new unsigned char[elen + 65];memset(hm, 0, elen + 65);memcpy(hm, bK, 32);memcpy(&hm[32], pe, elen);memcpy(&hm[elen + 32], &bK[32], 32);hash(hm, elen + 64, C3, "sha256");//C = C1||C2||C3memcpy(&pd[64], t,  elen);memcpy(&pd[64 + elen], C3, 32);delete[] t;delete[] hm;t = NULL;hm = NULL;EC_POINT_free(rG);EC_POINT_free(rK);return 0;

如果细心的朋友会发现我少了两步:

1.A3(校验rK这个点的)
2.校验 是否t为0
怎么说呢….因为我比较懒,而且也没有这个必要,因为我们用的是openssl,以上两种情况不会出现,所以就省略了,当然加上也无可厚非。

加密之后我们就要解密了,能拆就能立能砸就能砌。

解密流程

解密算法
设klen为密文中C2的比特长度。
为了对密文C=C1 ∥ C2 ∥ C3 进行解密,作为解密者的用户B应实现以下运算步骤:
B1:从C中取出比特串C1,按本文本第1部分4.2.3和4.2.9给出的细节,将C1的数据类型转换为椭
圆曲线上的点,验证C1是否满足椭圆曲线方程,若不满足则报错并退出;
B2:计算椭圆曲线点S=[h]C1,若S是无穷远点,则报错并退出;
B3:计算[dB]C1=(x2,y2),按本文本第1部分4.2.5和4.2.4给出的细节,将坐标x2、 y2的数据类型转
换为比特串;
B4:计算t=KDF(x2 ∥ y2, klen),若t为全0比特串,则报错并退出;
B5:从C中取出比特串C2,计算M ′ = C2 ⊕ t;
B6:计算u = Hash(x2 ∥ M ′ ∥ y2),从C中取出比特串C3,若u ̸= C3,则报错并退出;
B7:输出明文M ′。

以及解密流程图

下面是解密的核心代码:

unsigned char* t, *c2, *hm;unsigned char bC1x[65] = {0};unsigned char bC1y[65] = {0};unsigned char bK[65] = {0};unsigned char u[33] = {0}; unsigned int mlen, hm_len;  EC_POINT *rG, *rK;BIGNUM *C1x, *C1y, *rKx, *rKy;//取出rGC1x = BN_new();C1y = BN_new();memcpy(&bC1x[32], pe, 32);memcpy(&bC1y[32], &pe[32], 32);BN_bin2bn(bC1x, 64, C1x);BN_bin2bn(bC1y, 64, C1y);rG = EC_POINT_new(this->mGroup);if(!EC_POINT_set_affine_coordinates_GFp(this->mGroup, rG, C1x, C1y, this->ctx)){EC_POINT_free(rG);return -1;}//求得rKrK = EC_POINT_new(this->mGroup);EC_POINT_mul(this->mGroup, rK, NULL, rG, EC_KEY_get0_private_key(this->mKey), this->ctx);rKx = BN_new();rKy = BN_new();if(!EC_POINT_get_affine_coordinates_GFp(this->mGroup, rK, rKx, rKy, this->ctx)){EC_POINT_free(rG);EC_POINT_free(rK);return -2;}//求取hv 解密 BN_bn2bin(rKx, bK);BN_bn2bin(rKy, &bK[32]);mlen = elen - 96;c2 = new unsigned char[mlen + 1];memset(c2, 0, mlen + 1);memcpy(c2, &pe[64], mlen);t = new unsigned char[mlen + 1];memset(t, 0, mlen + 1);this->mKDF(bK, 64, elen - 96, t);for (int i = elen - 96; i--;){t[i] = t[i]^c2[i];}hm_len = mlen + 64;hm = new unsigned char[hm_len + 1];memset(hm, 0,hm_len + 1);BN_bn2bin(rKx, hm);memcpy(&hm[32], t, mlen);BN_bn2bin(rKy, &hm[32 + mlen]);//校验hash值hash(hm, hm_len, u, "sha256");for (int i = 0; i < 32;i++){if (u[i] != pe[elen - 32 + i]){EC_POINT_free(rG);EC_POINT_free(rK);delete[] t;delete[] c2;delete[] hm;t = NULL;c2 = NULL;hm = NULL;return -3;}   }memcpy(pd, t, mlen);EC_POINT_free(rG);EC_POINT_free(rK);delete[] t;delete[] c2;delete[] hm;t = NULL;c2 = NULL;hm = NULL;return 0;

以上就是加解密的过程,完整代码我会上传到github上面.

转载于:https://www.cnblogs.com/cnblogs-wangzhipeng/p/9933694.html

国密算法--Openssl 实现国密算法(加密和解密)相关推荐

  1. 【数据结构与算法】之深入解析“TinyURL加密与解密”的求解思路与算法示例

    一.题目要求 TinyURL 是一种 URL 简化服务,比如:当你输入一个 URL https://leetcode.com/problems/design-tinyurl 时,它将返回一个简化的UR ...

  2. 用Tar和OpenSSL给文件和目录加密及解密秘籍

    导读 当你有重要的敏感数据的时候,给你的文件和目录额外加一层保护是至关重要的,特别是当你需要通过网络与他人传输数据的时候.由于这个原因,我在寻找一个可疑在 Linux 上加密及解密文件和目录的实用程序 ...

  3. C#,河豚算法(Blowfish Algorithm)的加密、解密源代码

    Bruce Schneier 河豚算法(Blowfish Algorithm)是1993年11月由Bruce Schneier设计的一个完全开源的算法. Blowfish算法是一个分组长度为64位.密 ...

  4. 使用openssl进行AES 128 CTR 加密、解密

    参考文章 https://blog.csdn.net/yasi_xi/article/details/13997337 对称加密如非对称加密 AES128-CTR方式,属于对称加密的一种. 这里有一篇 ...

  5. 游戏封包的加密与解密算法的破解

    游戏封包的加密与解密算法的破解 破解封包的加密与解密算法是制作外挂的第一步,是外挂制作中最具技术含量的步骤,同样也是一个十分令人头痛的环节.如果加密与解密算法被成功地破解,那么外挂制作也就完成了一半. ...

  6. (三)--Openssl 实现国密算法(加密和解密)

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

  7. 基于openssl和国密算法生成CA、服务器和客户端证书

    参考链接 国密自签名证书生成_三雷科技的博客-CSDN博客_国密证书生成 openssl采用sm2进行自签名的方法_dong_beijing的博客-CSDN博客_openssl sm 前提说明 Ope ...

  8. 利用OpenSSL,用国密SM4算法来给文件加密、解密

    用OpenSSL产生一个随机填充的文件 a.txt ,然后计算这个文件的SHA256摘要.等一下用OpenSSL加密产生 b.txt 再对 b.txt 解密产生c.txt .计算 c.txt 的SHA ...

  9. 国密SM9算法C++实现之一:算法简介

    SM9算法C++实现系列目录: 基于JPBC的SM9算法的java实现与测试 国密SM9算法C++实现之0:源码下载地址 国密SM9算法C++实现之一:算法简介 国密SM9算法C++实现之二:测试工具 ...

最新文章

  1. Swift Code Snippet
  2. DOM渲染的详细过程 1
  3. 开源播放器 ijkplayer (一) :使用Ijkplayer播放直播视频
  4. 计算机组成原理(哈工大刘宏伟)
  5. 新兴机器学习算法:在线学习
  6. ps海报合成教程_如何利用PS制作海报?详细教程来了!
  7. 科学计算机器科学计算机,科学计算器多功能版
  8. JVM原理及调优--网页链接收藏
  9. hdu 1005(规律)
  10. a59s刷机包卡刷 oppo_OPPOA59S刷机包_线刷包_救砖包_官方ROM包_固件包下载- 线刷宝ROM中心...
  11. 集成学习—多算法融合
  12. SQL调优和性能监控利器SQL Monitor
  13. MySQL知识点总结(二)---查询操作
  14. 百度地图 地图级别 是什么意思
  15. CSS3 低多边形(Low Poly)设计及开发实例 - 简单的字母
  16. Born近似和Rytov近似
  17. 解决nginx报错: [warn] conflicting server name “localhost“ on 0.0.0.0:80, ignored
  18. java 案例:二月天;求月一共有多少天
  19. arduino利用电位器仿真编码器控制舵机转动
  20. 佛山天然文化石,莱福石材,佛山青石板

热门文章

  1. 抖音矩阵系统,短视频矩阵系统,抖音SEO系统源码。
  2. 教资教招笔记整理(二)
  3. Web大学生网页作业成品 bootstrap响应式网站开发 基于HTML+CSS+JS+Bootstrap制作火锅美食网站(4页)
  4. dig是什么意思 java_dig的意思是挖掘,dig deep是什么意思呢?
  5. swing中通过.class文件(把.java都删除)打包成jar文件,使用皮肤包遇到的问题。
  6. 吉首大学第八届“新星杯”大学生程序设计大赛 K: WaWa的难题(找规律)
  7. uniapp实现多级菜单选择u-select
  8. 递推 SDUT 鬼吹灯之龙岭迷窟
  9. linux每个磁盘大小,linux磁盘占用跟每个文件夹大小总和不符
  10. DTCC呼吁银行和监管机构帮助解决区块链安全问题