国密SM2算法密钥派生函数KDF的实现
前段时间需要实现国密算法SM2的签名、验签、加密、解密等功能,加解密过程使用到的密钥派生函数(KDF),从网上搜到的代码不符合《GMT 0003.4-2012 SM2椭圆曲线公钥密码算法 》的规定,不能直接使用,没法满足项目需要,后来决定自行实现,整理如下,欢迎大家讨论:
密钥派生函数算法逻辑
《GMT 0003.4-2012 SM2椭圆曲线公钥密码算法 》中 关于 密钥派生函数的规定如下:
密钥派生函数的C语言实现
代码实现:
//函数名称:my_KDF
//函数功能:实现国密SM2加解密算法中的密钥派生函数kdf
//输入参数:cdata -用于计算的数据串(二进制值)
// datalen -内容长度
// keylen -需要派生得到的长度
//输出参数:retdata -计算后返回的内容(二进制值),分配空间至少为需要keylen
//返回值:int 0表示成功,其他表示失败
int my_KDF(const char* cdata, int datalen, int keylen, char* retdata)
{int nRet = -1;unsigned char *pRet;unsigned char *pData;if(cdata==NULL || datalen<=0 || keylen<=0){goto err;}if(NULL == (pRet=(unsigned char *)malloc(keylen))){goto err;}if(NULL == (pData=(unsigned char *)malloc(datalen+4))){goto err;}memset(pRet, 0, keylen);memset(pData, 0, datalen+4);unsigned char cdgst[32]={0}; //摘要unsigned char cCnt[4] = {0}; //计数器的内存表示值int nCnt = 1; //计数器int nDgst = 32; //摘要长度int nTimes = (keylen+31)/32; //需要计算的次数int i=0;memcpy(pData, cdata, datalen);for(i=0; i<nTimes; i++){//cCnt{cCnt[0] = (nCnt>>24) & 0xFF;cCnt[1] = (nCnt>>16) & 0xFF;cCnt[2] = (nCnt>> 8) & 0xFF;cCnt[3] = (nCnt ) & 0xFF;}memcpy(pData+datalen, cCnt, 4);sm3(pData, datalen+4, cdgst);if(i == nTimes-1) //最后一次计算,根据keylen/32是否整除,截取摘要的值{if(keylen%32 != 0){nDgst = keylen%32;}}memcpy(pRet+32*i, cdgst, nDgst);i ++; //nCnt ++; //}if(retdata != NULL){memcpy(retdata, pRet, keylen);}nRet = 0;
err:if(pRet)free(pRet);if(pData)free(pData);return nRet;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
特别说明:代码中 sm3( ) 为 国密算法中的 密码杂凑算法sm3,已有前辈共享了实现代码,直接拿来使用,请自行搜索。
示例数据1:
输入数据 cdata : 00000000000000000000000000000000,
派生长度keylen:32,
返回内容retdata:2744A6D84E20D493696906799924577BEF6E900E40629D55F2D9677C825D64B2
示例数据2:
输入数据 cdata : 11223344556677881122334455667788,
派生长度keylen:32,
返回内容retdata:7EA06CE33DE666F0DDABFD22F6FA57F843059CA717F712150E2ACCC71F82317B
国密SM2算法密钥派生函数KDF的实现相关推荐
- 实现基于国密SM3的密钥派生(KDF)功能
实现基于国密SM3的密钥派生(KDF) 前言 KDF 标准 基于SM3的kdf实现 前言 密钥派生函数(KDF):密钥派生函数是指从一个共享的秘密比特串中派生密钥数据,在密钥协商过程中,密钥派生函数作 ...
- 基于国密SM3算法(openssl接口)密钥派生函数KDF的实现
前言 最近项目需要使用KDF生成秘钥,对比国密标准(GB_T 32918.4-2016)及网络资料,发现确实没有让我满意的, 自己结合标准和大佬:Heidlyn的帖子<国密SM2算法密钥派生函数 ...
- 国密SM2算法的只求理解不求甚解 (4/5)SM2算法加解密协议
国密SM2算法的只求理解不求甚解 (1/5)前置数学知识:模运算 国密SM2算法的只求理解不求甚解 (2/5)前置数学知识:平面几何 国密SM2算法的只求理解不求甚解 (3/5)SM2算法数学模型 国 ...
- 一文告诉你,国密SM2算法有多优秀
可能很多人都想不到,密码技术是与核技术.航天技术并列的国家三大安全核心技术之一,在保障信息安全,建设行业网络安全环境,增强我国行业信息系统的"安全可控"能力等方面发挥着至为关键的作 ...
- 国密SM2算法与RSA算法对比分析
SM2算法和RSA算法都是公钥密码算法,SM2算法是一种更先进安全的算法,在安全性能.速度性能等方面都优于RSA算法,在我国商用密码体系中被用来替换RSA算法.国家密码管理局于2010年12月17日发 ...
- MAC 与密钥派生函数 KDF
一.MAC 消息认证码 MAC 消息认证码,即 Message Authentication Code,是用于验证消息的一小段信息. 换句话说,能用它确认消息的真实性--消息来自指定的发件人并且没有被 ...
- 国密SM2算法(JS加密,C#、Java解密)
常见的渗透测试会将网站登录时密码使用明文传输视为风险.推荐使用国密算法或者RSA算法对密码进行加密传输. RSA加密(JS加密,C#.Java解密)请参考<RSA对称加密(JS加密,C#.Jav ...
- PBOC3.0中使用的国密SM2算法
一.知识准备 PBOC3.0规范就是<中国金融集成电路(IC)卡规范>3.0版本. SM2是国密局推出的一种他们自己说具有自主知识产权的非对称商用密码算法.本身是基于ECC椭圆曲线算法的, ...
- 谈谈PBOC3.0中使用的国密SM2算法
转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/39780825 作者:小马 一 知识准备 SM2是国密局推出的一种他们自己说具有自主 ...
最新文章
- 再话单元测试unittest
- pusher 创建新应用_使用 Laravel-echo-server 构建实时应用
- ICCV 2019 | 上海交大MVIG团队提出InstaBoost,换个dataloader函数, COCO提升3mAP
- php mysql 地理位置_MySQL版中国省市区地址地区信息数据表
- IPSec之security acl
- python计算平面的法向-利用协方差矩阵求解特征值和特征向量
- Extjs 屏蔽F5
- LINQ的数据库查询应用(zhuan)
- C语言怎么实现熊猫上香中的系统错误提示,熊猫烧香的病毒是用什么程序语言编写的 原理是什么...
- matlab对5个矩阵循环求均值,MATLAB循环求数组的平均值 每隔几个数据求一下平均值...
- Linux 计划任务crontab详解,含笔试题讲解
- 数字营销中台和全渠道的数字化精耕,快消老品牌实现数字营销焕新生
- 【原创纯手打】如何用微信小程序写留言板(附代码)
- 《C语言点滴》参考文献
- 谈KVC、KVO(重点观察者模式)机制编程
- MATLAB - Modbus TCP客户端的使用
- 基于大数据的高校英语现状分析
- java中修改xml文件内容_修改所有xml文件中的某些内容
- 【ESP32】11.雨滴探测实验(ADC)
- Spring Boot进阶(40):实现文件批量导出到zip压缩包并本地下载 | 超级详细,建议收藏