SM2算法中的KDF与SM3哈希流程

需积分: 0 1 下载量 151 浏览量 更新于2024-08-05 收藏 83KB PDF 举报
"该资源主要涉及的是SM2算法中的密钥派生函数KDF1,以及与之相关的SM3哈希算法的实现细节。" 在密码学中,SM2是一种基于椭圆曲线密码学(ECC)的公钥加密算法,广泛应用于中国的密码标准体系中。SM3是一个密码哈希函数,类似于SHA-256,用于生成消息的固定长度摘要,以确保数据的完整性和不可篡改性。在这个文件中,我们关注的是SM3哈希算法的实现和KDF1密钥派生函数。 1. **SM3_256**: 这是SM3哈希算法的核心函数,它调用了SM3初始化、处理和完成这三个步骤来计算消息的哈希值。这个过程包括将输入的消息分块,并对每个块进行处理,最后得出一个固定长度的哈希结果。 2. **SM3_init**: 这个函数初始化SM3的内部状态,准备开始处理消息。在开始计算哈希之前,必须先调用此函数设置必要的内部变量。 3. **SM3_process**: 这一步是处理消息的主体部分,它压缩消息的第一个`len/64`个块。这是因为SM3算法将输入的消息分为多个64字节的块进行处理。如果消息长度不是64字节的倍数,最后一块可能会小于64字节,这部分将在SM3_done中处理。 4. **SM3_done**: 完成哈希计算,处理剩余的消息块(如果有的话),并输出最终的哈希值。它还会调用BigEndian函数,确保输出的哈希值符合GM/T0004-2012标准要求的大端字节序。 5. **SM3_compress**: 作为SM3_process和SM3_done的辅助函数,用于压缩单个消息块。这是SM3算法中内部的压缩函数,执行特定的哈希操作。 6. **BiToW**和**WToW1**: 这两个函数在SM3_compress内被调用,用于在计算过程中进行数据转换。BiToW将大整数转换为字节序列,而WToW1则可能用于某种变形或预处理。 7. **CF**: 该函数负责计算SM3算法中的CF(Compress Function)部分,这是哈希计算的关键步骤,通过一系列运算更新内部状态。 8. **BigEndian**: 如果CPU使用小端字节序,这个函数用于将输入的数据从小端转换为大端,以满足标准的要求。因为网络传输和某些存储通常使用大端字节序。 9. **SM3_KDF**: 这是一个密钥派生函数,基于SM3哈希算法,用于从一个主密钥中生成所需长度的子密钥流。在SM2算法中,KDF1通常用于生成密钥对或者签名验证所需的子密钥。 历史记录显示,这个头文件是在2016年9月24日创建的,包含了对所有函数的注释,由Mao Yinying和Huo Lili添加。 总结来说,这个文件提供了SM2算法中使用的KDF1密钥派生函数和SM3哈希算法的详细实现,对于理解SM2算法及其在安全通信中的应用至关重要。这些函数和过程确保了数据的安全性和算法的正确性。

int main(int argc, char *argv[]) { ec_param *ecp; sm2_ec_key *key_B; message_st message_data; int type = TYPE_GFp; int point_bit_length = 256; char **sm2_param = sm2_param_recommand; ecp = ec_param_new(); ec_param_init(ecp, sm2_param, type, point_bit_length); key_B = sm2_ec_key_new(ecp); sm2_ec_key_init(key_B, sm2_param_d_B[ecp->type], ecp); memset(&message_data, 0, sizeof(message_data)); sm2_hex2bin((BYTE *)sm2_param_k[ecp->type], message_data.k, ecp->point_byte_length); sm2_bn2bin(key_B->d, message_data.private_key, ecp->point_byte_length); sm2_bn2bin(key_B->P->x, message_data.public_key.x, ecp->point_byte_length); sm2_bn2bin(key_B->P->y, message_data.public_key.y, ecp->point_byte_length); message_data.decrypt = (BYTE *)OPENSSL_malloc(message_data.message_byte_length + 1); memset(message_data.decrypt, 0, message_data.message_byte_length + 1); BIGNUM *P_x; BIGNUM *P_y; //BIGNUM *d; BIGNUM *k; xy_ecpoint *P; xy_ecpoint *xy1; xy_ecpoint *xy2; int pos1; BYTE t; int i; sm2_hash local_C_3; P_x = BN_new(); P_y = BN_new(); k = BN_new(); P = xy_ecpoint_new(ecp); xy1 = xy_ecpoint_new(ecp); xy2 = xy_ecpoint_new(ecp); BN_bin2bn(message_data.public_key.x, ecp->point_byte_length, P_x); BN_bin2bn(message_data.public_key.y, ecp->point_byte_length, P_y); BN_bin2bn(message_data.k, ecp->point_byte_length, k); xy_ecpoint_init_xy(P, P_x, P_y, ecp); xy_ecpoint_mul_bignum(xy1, ecp->G, k, ecp); xy_ecpoint_mul_bignum(xy2, P, k, ecp); char cryptstring[1024]; scanf("%s", cryptstring); / 利用函数sm2_hex2bin将16进制字符串cryptstring转换成二进制流填充到message_data.C里 / / 计算明文长度 message_data.message_byte_length */ message_data.klen_bit = message_data.message_byte_length * 8;(请根据注释补充)

2023-05-26 上传