【原创】SM4password算法源代码接口具体解释

【原创】SM4password算法源代码接口具体解释
近期几天想把cryptdb的加密算法换成国产的sm4加密算法。所以花了时间研究了一下sm4的源代码和基本原理,避免忘记,写下这篇博客以作记录。

先介绍一下SM4算法,SM4是我们自己国家的一个分组password算法。是国家password管理局于2012年公布的。

网址戳→_→:http://www.cnnic.net.cn/jscx/mixbz/sm4/

详细的password标准和算法官方有很详尽的PDF文档以供查阅,戳→_→:http://218.241.108.63/wiki/images/2/22/SM4%E5%88%86%E7%BB%84%E5%AF%86%E7%A0%81%E7%AE%97%E6%B3%95.pdf

算法的源代码实现官方也有对应的演示样例源代码,戳→_→:

http://218.241.108.63/wiki/index.php/File:Sm2_sm3_sm4_c%E8%AF%AD%E8%A8%80%E5%AE%9E%E7%8E%B0.zip

先说说啥是分组password算法:

分组password算法——国际DES、国产SM4

分组password就是将明文数据按固定长度进行分组,然后在同一密钥控制下逐组进行加密,从而将各个明文分组变换成一个等长的密文分组的password。当中二进制明文分组的长度称为该分组password的分组规模。

SM4password算法的总体结构图例如以下:


SM4的源码中存在例如以下几个函数:

void sm4_setkey_enc(sm4_context *ctxunsigned char key[16])

void sm4_setkey_dec(sm4_context *ctxunsigned 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 *ctxunsigned 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 *ctxunsigned char key[16])函数就是解密函数,过程为上述过程的逆序过程。

第二个函数:void sm4_crypt_ecb( sm4_context *ctx,int mode,int length, unsigned char 

这个函数的作用是使用ecb模式(ECB(Electronic Codebook,电码本)模式是分组password的一种最主要的工作模式。

相同。sm4_crypt_cbc函数则是使用的CBC模式,也就是分组链接模式)来对内容进行加密,内部也是一个循环,依据length的长度来进行循环,每次循环都调用sm4_one_round进行加密或者解密,究竟是加密还是解密,主要是依据第二个參数Mode来进行决定。

以上就是整个SM4算法的函数简单介绍,运用这些函数接口,我们不须要知道内部的详细实现,就能够使用sm4加密算法来对我们的数据进行加解密,十分的方便。

请尊重原作者,原文链接→_→:http://blog.csdn.net/sandaojushi/article/details/46925541

原文地址:https://www.cnblogs.com/gccbuaa/p/7246901.html