【原创】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" >

在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

时间: 2024-10-27 06:57:24

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

Java语言中反射动态代理接口的解释与演示

Java语言中反射动态代理接口的解释与演示 Java在JDK1.3的时候引入了动态代理机制.可以运用在框架编程与平台编程时候捕获事件.审核数据.日志等功能实现,首先看一下设计模式的UML图解: 当你调用一个接口API时候,实际实现类继承该接口,调用时候经过proxy实现. 在Java中动态代理实现的两个关键接口类与class类分别如下: java.lang.reflect.Proxy java.lang.reflect.InvocationHandler 我们下面就通过InvocationHan

OpenStack_Swift源码分析——Ring的rebalance算法源代码详细分析

今天有同学去百度,带回一道面试题,和大家分享一下: 打印: n=1 1 n=2 3 3 2 4 1 1 4 5 5 n=3 7 7 7 7 6 8 3 3 2 6 8 4 1 1 6 8 4 5 5 5 8 9 9 9 9 提供一段参考程序: <pre name="code" class="cpp">// ConsoleApplication1.cpp: 主项目文件. #include "stdafx.h" #include &quo

接口的解释

网上看到的接口的解释,有意思: 这是一个规范和思维习惯问题.接口是程序对功能不同,但使用方法相同的类的概括和定义,如果你的很多类要继承同一个接口,但又经常都不需要实现所有这个接口的所有方法或者属性,那就是你的接口设计的有问题.举个例子:比如, "手动档轿车" 这个接口,它需要有以下几个方法就能开走:方向盘.油门.刹车.排档.离合器 . 奔驰,宝马,兰博基尼,法拉利,奥迪,悍马 这几个具体的车型相当于"类",它们都继承"手动档轿车",我会开手动档轿

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

今天做了一道题,要用判断一个字符串是否是另一个字符串的子串,于是查了一下strstr的实现. 代码如下: 1 char *strstr(const char*s1,const char*s2) 2 { 3 const char*p=s1; 4 const size_t len=strlen(s2); 5 for(;(p=strchr(p,*s2))!=0;p++) 6 { 7 if(strncmp(p,s2,len)==0) 8 return (char*)p; 9 } 10 return(0)

Matlab实现二值图像的腐蚀算法源代码

1.二值图像的腐蚀原理:我们知道,二值图像就是0和1组成的矩阵,0为黑1为白,腐蚀作用在1上面也就是图像高光白色部分,然后白色部分往外收缩.腐蚀就是类似于黑色军队反攻白色军队,最终把自己的黑色领土扩张,黑色字体变粗. 2.Matlab腐蚀算法源代码  q_erode.m %erode 腐蚀 F=[0 1 0 1 0 0; 0 1 1 0 1 0; 0 0 1 0 0 0; 0 0 1 1 0 0; 0 0 0 0 0 0]; S1=[1,0;1,1]; %腐蚀的核 IMG=rgb2gray(im

原创mysql内核源代码深度解析 缓冲池 buffer pool 整体概述

本人原创文章,转载请注明出处. mysql的内存管理庞大而先进,这在mem0pool.c文件的开头注释中都有说明,粗略的可以分成四部分,包含9大块: buffer pool, parsed andoptimized SQL statements, data dictionarycache, log buffer, locks for eachtransaction, hash table forthe adaptive index, state andbuffers for each SQL q

mhout协同过滤算法各接口

Mahout协同过滤算法 Mahout使用了Taste来提高协同过滤算法的实现,它是一个基于Java实现的可扩展的,高效的推荐引擎.Taste既实现了最基本的基于用户的和基于内容的推荐算法,同时也提供了扩展接口,使用户可以方便的定义和实现自己的推荐算法.同时,Taste不仅仅只适用于Java应用程序,它可以作为内部服务器的一个组件以HTTP和Web Service的形式向外界提供推荐的逻辑.Taste的设计使它能满足企业对推荐引擎在性能.灵活性和可扩展性等方面的要求. Taste主要包括以下几个

原创数据结构算法Flash动画演示课件-Action Script(AS)脚本实现

2001年,和大学同学一起完成的毕业设计作品.cooling&bobo. 学习数据结构与算法,请访问:数据结构学习网站 http://xu-laoshi.cn/shujujiegou/ ."数据结构与算法"QQ群:30308606.一起探讨数据结构和算法,并可下载本套课件. 当年Flash动画还是新鲜事物,网上可以参考的资料也很少,一步步摸索制作.总的花了一个多月时间才完成.这个项目同时也是当年浙江省自学考试办公室官方网站的教学课件.总体来说是一套在互联网上比较经典的数据结构教

ActionScript 3.0 实现的A*寻路算法源代码

首先是文档类Index.as: package code{ import flash.display.Sprite; import flash.text.TextField; import flash.text.TextFormat; public class Index extends Sprite{ private var road:Road; public function Index(){ stage.align = "TL"; stage.scaleMode = "