【原创】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算法源代码接口具体解释的更多相关文章
- quake3中求1/sqrt(x)的算法源代码
quake3中求1/sqrt(x)的算法源代码如下(未作任何修改): float Q_rsqrt( float number ) { long i; float x2, y; const float ...
- 变动性算法源代码分析与使用示例(copy_backward、 transform、 replace_copy_if 等)
首先回顾前面的文章,我们把for_each 归类为非变动性算法,实际上它也可以算是变动性算法,取决于传入的第三个参数,即函数 指针.如果在函数内对容器元素做了修改,那么就属于变动性算法. 变动性算法源 ...
- python平台下实现xgboost算法及输出的解释
python平台下实现xgboost算法及输出的解释 1. 问题描述 近来, 在python环境下使用xgboost算法作若干的机器学习任务, 在这个过程中也使用了其内置的函数来可视化树的结果, ...
- Linux GCC下strstr的实现以及一个简单的Kmp算法的接口
今天做了一道题,要用判断一个字符串是否是另一个字符串的子串,于是查了一下strstr的实现. 代码如下: char *strstr(const char*s1,const char*s2) { con ...
- SURF算法源代码OPENSURF分析
SURF算法源代码分析 平台:win x64 + VS2015专业版 +opencv2.4.11 配置类似参考OPENSIFT,参考我的另一篇博客:https://www.cnblogs.com/Al ...
- 【原创】k8s源代码分析-----kubelet(1)主要流程
本人空间链接http://user.qzone.qq.com/29185807/blog/1460015727 源代码为k8s v1.1.1稳定版本号 kubelet代码比較复杂.主要是由于其担负的任 ...
- OpenStack_Swift源代码分析——Ring的rebalance算法源代码具体分析
1 Command类中的rebalnace方法 在上篇文章中解说了,创建Ring已经为Ring加入设备.在加入设备后须要对Ring进行平衡,平衡 swift-ring-builder object.b ...
- 【原创】k8s源代码分析-----kubelet(8)pod管理
本文QQ空间链接:http://user.qzone.qq.com/29185807/blog/1460540474 本文csdn博客链接:http://blog.csdn.net/screscent ...
- mahout协同过滤算法各接口
Mahout协同过滤算法 Mahout使用了Taste来提高协同过滤算法的实现,它是一个基于Java实现的可扩展的,高效的推荐引擎.Taste既实现了最基本的基于用户的和基于内容的推荐算法,同时也提供 ...
随机推荐
- docker常用命令整理
Docker常见用法整理 Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器. Docker 容器通过 Docker 镜像来创建.容器与镜像的关系类似于 ...
- drools6
<dependency> <groupId>org.drools</groupId> <artifactId>drools-core</artif ...
- js setInterval 启用&停止
以下面例子为说明: <title></title> <script src="Scripts/jquery-1.4.1-vsdoc.js" type= ...
- ClassLoader 提供了两个方法用于从装载的类路径中取得资源:
转:http://cheneyph.iteye.com/blog/831721 ClassLoader 提供了两个方法用于从装载的类路径中取得资源: public URL getResource ( ...
- 1180: [CROATIAN2009]OTOCI
1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 1032 Solved: 638[Submit][ ...
- VIjosP1046观光旅游
背景 湖南师大附中成为百年名校之后,每年要接待大批的游客前来参观.学校认为大力发展旅游业,可以带来一笔可观的收入. 描述 学校里面有N个景点.两个景点之间可能直接有道路相连,用Dist[I,J]表示它 ...
- git ssh 生成步骤
Git是分布式的代码管理工具,远程的代码管理是基于SSH的,所以要使用远程的Git则需要SSH的配置. github的SSH配置如下: 一 . 设置Git的user name和email: $ git ...
- mdf 与 mdb的对比
下面的内容从网上搜索而来,未经过本人严格验证,仅供参考. 1.问:mdb数据库能否脱离Access运行?即,没有安装Access,可以打开mdb吗? 答:可以,脱离Access运行,可以到微软的同类产 ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---11
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:
- 【剑指offer】数组中重复的数字
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...