算法过程

更多的原理介绍参考: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. ABP —— 权限管理

    ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 完成了简单的增删改查和分页功能,是不是觉得少了点什么?是的,少了权限管理.既然涉及到了权限,那我们 ...

  2. ARC151D Binary Representations and Queries

    ARC151D Binary Representations and Queries 题目链接:ARC151D Binary Representations and Queries 非常好思维题. 思 ...

  3. MySQL8.0新特性之增强版逻辑备份恢复

    前言关于MySQL库表逻辑备份恢复,我们主要有以下几种常用的工具: 1.mysqldump:MySQL原生自带的逻辑备份恢复工具,支持整个实例.单个数据库.单张表等的备份与恢复,对于1-10个G的数据 ...

  4. apisix lua插件开发

    1. 怎么定义ngx自定义变量 ngx.var.custom_var nginx_config: # config for render the template to generate nginx. ...

  5. Golang verifying module: xxx: initializing sumdb.Client: reading tree note: malformed note

    问题描述 在使用 go mod 拉取github上的一些包时碰到了一个非常令人头疼的问题,想使用一个包却拉不下来报了以下错误: go: finding module for package githu ...

  6. vue3-组件通信

    Vue3组件通信和Vue2`的区别: 移出事件总线,使用mitt代替 vuex换成了pinia 把.sync优化到了v-model里面 把$listeners所有的东西,合并到$attrs $chil ...

  7. bat隐藏窗口运行

    在bat脚本开头添加: if "%1" == "h" goto begin mshta vbscript:createobject("wscript. ...

  8. Reverse花指令及反混淆

    花指令及反混淆 1.花指令   花指令是反调试的一种基本的方法.其存在是干扰选手静态分析,但不会影响程序的运行.实质就是一串垃圾指令,它与程序本身的功能无关,并不影响程序本身的逻辑.在软件保护中,花指 ...

  9. Gitee三方登录_Python (超详细)

    第三方登录是一种常见的身份验证机制,允许用户使用他们在其他平台(如社交媒体.电子邮件服务或开发平台)的账号来登录你的应用或网站,而不需要创建新的用户名和密码.这种方式不仅简化了用户的登录过程,还提高了 ...

  10. 详解AQS二:ReentrantLock公平锁原理

    ReentrantLock作为我们使用频率最高的显式锁,它是AQS的经典实现,本篇文章将以ReentrantLock公平锁为例讲解AQS的实现. 一.ReentrantLock 在之前的文章<线 ...