【原创】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算法的总体结构图例如以下:

appid=100520031&w=710&url=http://mmbiz.qpic.cn/mmbiz/Fn09DwYmtaVIwTFicJsBLxMhkOUd5qT0dB6xsTcicG6TLuHDUEvc5IYC6uUwTNMmnppGbZetk6cmkS8BzZCtw2kg/0" alt="">

在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,电码本)模式是分组password的一种最主要的工作模式。

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

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

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

【原创】SM4password算法源代码接口具体解释的更多相关文章

  1. quake3中求1/sqrt(x)的算法源代码

    quake3中求1/sqrt(x)的算法源代码如下(未作任何修改): float Q_rsqrt( float number ) { long i; float x2, y; const float ...

  2. 变动性算法源代码分析与使用示例(copy_backward、 transform、 replace_copy_if 等)

    首先回顾前面的文章,我们把for_each 归类为非变动性算法,实际上它也可以算是变动性算法,取决于传入的第三个参数,即函数 指针.如果在函数内对容器元素做了修改,那么就属于变动性算法. 变动性算法源 ...

  3. python平台下实现xgboost算法及输出的解释

    python平台下实现xgboost算法及输出的解释 1. 问题描述 ​ 近来, 在python环境下使用xgboost算法作若干的机器学习任务, 在这个过程中也使用了其内置的函数来可视化树的结果, ...

  4. Linux GCC下strstr的实现以及一个简单的Kmp算法的接口

    今天做了一道题,要用判断一个字符串是否是另一个字符串的子串,于是查了一下strstr的实现. 代码如下: char *strstr(const char*s1,const char*s2) { con ...

  5. SURF算法源代码OPENSURF分析

    SURF算法源代码分析 平台:win x64 + VS2015专业版 +opencv2.4.11 配置类似参考OPENSIFT,参考我的另一篇博客:https://www.cnblogs.com/Al ...

  6. 【原创】k8s源代码分析-----kubelet(1)主要流程

    本人空间链接http://user.qzone.qq.com/29185807/blog/1460015727 源代码为k8s v1.1.1稳定版本号 kubelet代码比較复杂.主要是由于其担负的任 ...

  7. OpenStack_Swift源代码分析——Ring的rebalance算法源代码具体分析

    1 Command类中的rebalnace方法 在上篇文章中解说了,创建Ring已经为Ring加入设备.在加入设备后须要对Ring进行平衡,平衡 swift-ring-builder object.b ...

  8. 【原创】k8s源代码分析-----kubelet(8)pod管理

    本文QQ空间链接:http://user.qzone.qq.com/29185807/blog/1460540474 本文csdn博客链接:http://blog.csdn.net/screscent ...

  9. mahout协同过滤算法各接口

    Mahout协同过滤算法 Mahout使用了Taste来提高协同过滤算法的实现,它是一个基于Java实现的可扩展的,高效的推荐引擎.Taste既实现了最基本的基于用户的和基于内容的推荐算法,同时也提供 ...

随机推荐

  1. js跨域post请求

    function funPostBack(srvMethod){ /* var contentNR=$(document.getElementById("reportFrame") ...

  2. [python][django学习篇[13]增加markdown_1

    1 进入虚拟环境,安装markdwon  python install markdown 2 修改视图函数detail def detail(request, pk): # get_object_or ...

  3. Hibernate命名策略及配置

    hibernate 表 命名策略         分类:            hibernate2013-02-27 18:46464人阅读评论(0)收藏举报 Hibernate注释下的自定义架构实 ...

  4. MySql数据库 - 1.安装

    下载: 官网:www.mysql.com 打开官网之后依次点击:DOWNLOADS - Windows - MySql Installer MySql Installer 包含的功能,使用C#连接数据 ...

  5. BZOJ1491 [NOI2007]社交网络 【floyd】

    题目 在社交网络(socialnetwork)的研究中,我们常常使用图论概念去解释一些社会现象.不妨看这样的一个问题. 在一个社交圈子里有n个人,人与人之间有不同程度的关系.我们将这个关系网络对应到一 ...

  6. 企鹅的游戏(penguin)

    企鹅的游戏(penguin) 题目描述 Shiva养了一只小企鹅.小企鹅很聪明,她总是帮Shiva和他的好朋友想出很多很好玩的游 戏.其中有一个游戏特别经典,Shiva和他的小伙伴们百玩不厌. 游戏规 ...

  7. Java.io.File中的delete()方法和deleteOnExit()方法的区别

    1.delete()方法:             当调用delete()方法时,直接删除文件,不管该文件是否存在,一经调用立即执行: 2.deleteOnExit()方法:            当 ...

  8. A way to CQRS and DDD

    Recently, I'm trying to make a approach to DDD with CQRS, Event Sourcing, Domain Isolation, Domain R ...

  9. 本机开发Native Development:Invalid path for NDK (转)

    打开window菜单下的preference选项.选择Android,Native Development(本地开发) 选择你的NDK安装目录.但是,这个插件目前仅支持ndk的r4和r5版本,更高版本 ...

  10. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---53

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: