算法过程

更多的原理介绍参考:SM4原理介绍

代码实现

S盒实现

#include <stdio.h>
/*
SM4-S盒实现:
由三个复合函数组成,S(x)=L(I(L(x))),其中L(x)是仿射变换,而I(x)是逆变换
*/
int sbox[256]; // S盒 //仿射变换实现
int change(int x)
{
int A1 = 0xA7;
int flag;
int result = 0;
int tem;
int flage2;
for (int i = 0; i < 8; i++)
{
flag = (A1 & 0x80) >> 7;
tem = x & A1;
flage2 = 0;
for (int j = 0; j < 8; j++)
{
flage2 ^= (tem & 1);
tem >>= 1;
}
result = result | (flage2 << i);
A1 = (A1 << 1) | flag;
}
result ^= 0xd3;
return result;
} //模2 多项式乘法
int multiplication(int a, int b)
{
int tem = 0;
int i = 0;
while (b)
{
if (b & 1)
{
tem ^= a << i;
}
i++;
b >>= 1;
}
return tem;
} //模2 多项式除法
int length(int x)
{
int i = 0;
int comp = 1;
while (1)
{
if (comp >= x)
{
return i;
}
comp = (comp << 1) + 1;
i++;
}
}
void division(int a, int b, int* round, int* left)
{
*round = 0;
*left = 0;
int distence;
while (1)
{
distence = length(a) - length(b);
if (distence >= 0 && a)
{
a = a ^ (b << distence);
*round = (*round) | (1 << distence);
}
else {
*left = a;
break;
}
}
} //模2 多项式求逆(扩展欧几里得算法)
int inverse(int a, int b)
{
int x2 = 1;
int x1 = 0;
int y2 = 0;
int y1 = 1;
int temX1, temY1;
int q, r, x, y;
int i;
while (b)
{
division(a, b, &q, &r);
y = y2 ^ multiplication(q, y1); a = b;
b = r;
y2 = y1;
y1 = y;
}
return y2;
} void genXbox()
{
printf("-------------------------------------------------------------SM4-Sbox生成---------------------------------------------------------\n");
for (int i = 0; i <= 0xf; i++)
{
printf("\t%x", i);
}
printf("\n");
for (int i = 0; i <= 0xf; i++)
{
printf("%x", i);
for (int j = 0; j <= 0xf; j++)
{
printf("\t%x", change(inverse(0x1f5, change((i << 4) | j))));
}
printf("\n");
}
printf("----------------------------------------------------------------------------------------------------------------------------------\n");
system("pause"); } int main()
{
genXbox();
return 0;
}

以上是S盒实现,详细代码见github

后续可实现:txt文本加密、Doc文件加密、图片加密、PDF文本加密

参考

1、国标—SM4

2、密码学-基础理论与应用(李子臣著)

3、商用密码检测中心-源码下载

SM4代码实现的更多相关文章

  1. 代码and截图

    1.babassl ZUC算法代码: #include <stdio.h> #include <string.h> #include <openssl/crypto.h& ...

  2. sm4算法(附源码、测试代码)

    from:http://blog.csdn.net/mao0514/article/details/52930944 SM4是我们自己国家的一个分组密码算法,是国家密码管理局于2012年发布的.网址戳 ...

  3. sm4加密 解密(oc)

    前几天项目用到sm4加密解密,加密为十六进制字符串,再将十六进制字符串解密.网上百度了下,sm4是密钥长度和加密明文加密密文都为16个字节十六进制数据,网上的sm4 c语言算法很容易搜到,笔者刚开始没 ...

  4. SM4密码算法(附源码)

    SM4是我们自己国家的一个分组密码算法,是国家密码管理局于2012年发布的.网址戳→_→:http://www.cnnic.NET.cn/jscx/mixbz/sm4/ 具体的密码标准和算法官方有非常 ...

  5. SM4加密算法实现Java和C#相互加密解密

    SM4加密算法实现Java和C#相互加密解密 近期由于项目需要使用SM4对数据进行加密,然后传给Java后台,Java后台使用的也是SM4的加密算法但是就是解密不正确,经过一步步调试发现Java中好多 ...

  6. 关于国密算法 SM1,SM2,SM3,SM4 的笔记

    国密即国家密码局认定的国产密码算法.主要有SM1,SM2,SM3,SM4.密钥长度和分组长度均为128位. SM1 为对称加密.其加密强度与AES相当.该算法不公开,调用该算法时,需要通过加密芯片的接 ...

  7. 基于crypto++国产加密软件SM4的实现,顺带加了ase,base64

    唔,美国压制得越狠,各种替代产品就越能活. 本文分享SM4的一种快速实现与集成方式.             SM4(原名SMS4)是中华人民共和国政府采用的一种分组密码标准,由国家密码管理局于201 ...

  8. sm1、sm2、sm3、sm4简单介绍

    转自:https://blog.csdn.net/andylau00j/article/details/54427395 国密即国家密码局认定的国产密码算法.主要有SM1,SM2,SM3,SM4.密钥 ...

  9. 一文带你学会国产加密算法SM4的java实现方案

    前言 今天给大家带来一个国产SM4加密解密算法的java后端解决方案,代码完整,可以直接使用,希望给大家带来帮助,尤其是做政府系统的开发人员,可以直接应用到项目中进行加密解密. 画重点!是SM4哦,不 ...

  10. 一文带你学会国产加密算法SM4的vue实现方案

    前言 上篇文章我们介绍了国产SM4加密算法的后端java实现方案.没有看过的小伙伴可以看一下这篇文章. https://www.cnblogs.com/jichi/p/12907453.html 本篇 ...

随机推荐

  1. youtube视频下载,youtube-dl

    []为选填,用的时候去掉[] 用pip装youtube-dl pip install -U youtube-dl [--proxy=127.0.0.1:7890] youtube-dl下载youtub ...

  2. Python 潮流周刊#77:Python 依赖管理就像垃圾场火灾?(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  3. 【昌哥IT课堂】MySQL8.0新特性之特权连接

    概述: ERROR 1040 (HY000): Too many connections 上面这个报错,开发或DBA一般都遇见过.那么碰到这个问题,我们应该怎么办呢? 在MySQL 5.7及之前版本, ...

  4. 解析Mina代码三部曲

    首先,Mina是什么?能帮我们做什么?我研究一个新技术的时候,首先问的就是这样的问题.我个人的理解就是Mina是一个关注于通讯层的框架,任何需要底层通讯的应用,都可以使用它. AD:2013大数据全球 ...

  5. MySQL之配置my.cnf

    1)可以实现直接使用mysql登录MySQL,需要添加配置文件, 进行客户端配置即可 ~/.my.cnf [client] port = 3306 socket = /var/lib/mysql/my ...

  6. php调试工具之firePHP

    让PHP可以像js一样利用浏览器的控制台调试代码  ------- FirePHP(http://www.firephp.org/) 1. 安装FirePHP插件 在Chrome浏览器的应用商店中,搜 ...

  7. 理解Flink之一编译Flink-1.11.1

    下载源码 git clone -b release-1.11.1 https://github.com/apache/flink.git --depth=1 flink-1.11.1 编译 mvn c ...

  8. (系列十三)Vue3+Echarts搭建超好看的系统面板

    说明 该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发). 该系统文章,我会尽量说的非常详细,做到不管新手.老手都能看懂. 说明:OverallAuth2 ...

  9. 使用Tesseract进行图片文字识别

    Tesseract介绍 Tesseract 是一个开源的光学字符识别(OCR)引擎,最初由 HP 在 1985 年至 1995 年间开发,后来被 Google 收购并开源.Tesseract 支持多种 ...

  10. #oscp#渗透测试 kioptix level 3靶机getshell及提权教程

    声明! 文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!! 一.靶机搭建 点击扫描虚拟机 选择靶机使在文件夹即可 二.信息收集 前言 信 ...