敬请关注博客,后期不断更新优质博文,谢谢
【转发】SM4密码算法源码接口详解
最近几天想把cryptdb的加密算法换成国产的sm4加密算法,所以花了时间研究了一下sm4的源码和基本原理,避免忘记,写下这篇博客以作记录。
先介绍一下SM4算法,SM4是我们自己国家的一个分组密码算法,是国家密码管理局于2012年发布的。网址戳→_→:http://www.cnnic.net.cn/jscx/mixbz/sm4/
具体的密码标准和算法官方有非常详尽的PDF文档以供查阅,戳→_→:http://218.241.108.63/wiki/images/2/22/SM4分组密码算法.pdf
算法的源码实现官方也有相应的示例源码,戳→_→:
http://218.241.108.63/wiki/index.php/File:Sm2_sm3_sm4_c语言实现.zip
先说说啥是分组密码算法:
分组密码算法——国际DES、国产SM4
分组密码就是将明文数据按固定长度进行分组,然后在同一密钥控制下逐组进行加密,从而将各个明文分组变换成一个等长的密文分组的密码。其中二进制明文分组的长度称为该分组密码的分组规模。
SM4密码算法的整体结构图如下:
在SM4的源代码中存在如下几个函数:
void sm4_setkey_enc(sm4_context *ctx,unsigned char key[16])
void sm4_setkey_dec(sm4_context *ctx,unsigned char key[16])
void sm4_crypt_ecb( sm4_context *ctx,int mode,int length, unsigned char *input,unsigned char *output)
void sm4_crypt_cbc( sm4_context *ctx,int mode,int length,unsigned char iv[16],unsigned char *input,unsigned char output )
static void sm4_setkey( unsigned long SK[32], unsigned char key[16] )
还有一个非常重要的结构体:sm4_context
typedef struct
{
int mode; /!< encrypt/decrypt /
unsigned long sk[32]; /!< SM4 subkeys */
}
sm4_context;
先说结构体:
sm4_context结构体中的Mode控制是加密还是解密,sk则表示子密钥,也称作轮密钥。
第一个函数: void sm4_setkey_enc(sm4_context *ctx,unsigned char key[16])
这个函数是用来设置加密密钥的,一个参数分别为sm4_context *ctx和一个key。
其内部会调用static void sm4_setkey( unsigned long SK[32], unsigned char key[16] )函数
这个函数是用来设置密钥的,这个函数内部会对当前传入的主密钥进行32轮的迭代,每次迭代的轮密钥都被存放到ctx结构中的sk数组中。
void sm4_setkey_dec(sm4_context *ctx,unsigned char key[16])函数就是解密函数,过程为上述过程的逆序过程。
第二个函数:void sm4_crypt_ecb( sm4_context *ctx,int mode,int length, unsigned char
这个函数的作用是使用ecb模式(ECB(Electronic Codebook,电码本)模式是分组密码的一种最基本的工作模式。同样,sm4_crypt_cbc函数则是使用的CBC模式,也就是分组链接模式)来对内容进行加密,内部也是一个循环,根据length的长度来进行循环,每次循环都调用sm4_one_round进行加密或者解密,到底是加密还是解密,主要是根据第二个参数Mode来进行决定。
以上就是整个SM4算法的函数简介,运用这些函数接口,我们不需要知道内部的具体实现,就可以使用sm4加密算法来对我们的数据进行加解密,十分的方便。