实现基于国密SM3的密钥派生(KDF)
- 前言
- KDF 标准
- 基于SM3的kdf实现
前言
密钥派生函数(KDF):密钥派生函数是指从一个共享的秘密比特串中派生密钥数据,在密钥协商过程中,密钥派生函数作用在密钥交换所获取的共享的秘密比特串上,从中产生所需的会话密钥或进一步加密所需的密钥数据。
常见的密钥派生函数包括:
- HKDF:是HMAC-based KDF的缩写,即基于HMAC的KDF。
- PBKDF2:是一个简单的从密码派生密钥的KDF,它可以抵抗字典攻击和彩虹表攻击。
- Bcrypt:是一个开始被淘汰的密码学KDF。它提供可配置的迭代次数,但使用恒定的内存,因此相对来说,比较容易被硬件加速密码破解器所破解,在抗GPU攻击和抗ASIC攻击上已经不再安全。
- Scrypt:是一个强密码学KDF,它是一种内存密集型算法,目标是抵抗GPU攻击、ASIC攻击和FPGA攻击(高效密码破解硬件)。
- Argon2也是一个强密码学KDF,抗GPU攻击、ASIC攻击和FPGA攻击,且效果比Scrypt更好。
SM3:SM3是中华人民共和国政府采用的一种密码散列函数标准,由国家密码管理局于2010年12月17日发布。相关标准为“GM/T 0004-2012 《SM3密码杂凑算法》”。
在商用密码体系中,SM3主要用于数字签名及验证、消息认证码生成及验证、随机数生成等,其算法公开。据国家密码管理局表示,其安全性及效率与SHA-256相当。
KDF 标准
参考 标准号:GB/T 32918.4-2016第五章节的密钥派生算法标准如下:
基于SM3的kdf实现
sm3的杂凑算法是使用openssl的函数,代码如下:
int32_t opensslSm3Hash(const char *msg, uint32_t msgLen, char* hashData, uint32_t hashDataLen)
{
if (msg == NULL || hashData == NULL) {
return -1;
}
const EVP_MD *opensslAlg = EVP_sm3();
ret = EVP_Digest(msg, msgLen, hashData, &hashDataLen, opensslAlg, NULL);
if (ret != 1) {
return -1;
}
return 0;
}