SM4代码实现
算法过程
更多的原理介绍参考: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代码实现的更多相关文章
- 代码and截图
1.babassl ZUC算法代码: #include <stdio.h> #include <string.h> #include <openssl/crypto.h& ...
- sm4算法(附源码、测试代码)
from:http://blog.csdn.net/mao0514/article/details/52930944 SM4是我们自己国家的一个分组密码算法,是国家密码管理局于2012年发布的.网址戳 ...
- sm4加密 解密(oc)
前几天项目用到sm4加密解密,加密为十六进制字符串,再将十六进制字符串解密.网上百度了下,sm4是密钥长度和加密明文加密密文都为16个字节十六进制数据,网上的sm4 c语言算法很容易搜到,笔者刚开始没 ...
- SM4密码算法(附源码)
SM4是我们自己国家的一个分组密码算法,是国家密码管理局于2012年发布的.网址戳→_→:http://www.cnnic.NET.cn/jscx/mixbz/sm4/ 具体的密码标准和算法官方有非常 ...
- SM4加密算法实现Java和C#相互加密解密
SM4加密算法实现Java和C#相互加密解密 近期由于项目需要使用SM4对数据进行加密,然后传给Java后台,Java后台使用的也是SM4的加密算法但是就是解密不正确,经过一步步调试发现Java中好多 ...
- 关于国密算法 SM1,SM2,SM3,SM4 的笔记
国密即国家密码局认定的国产密码算法.主要有SM1,SM2,SM3,SM4.密钥长度和分组长度均为128位. SM1 为对称加密.其加密强度与AES相当.该算法不公开,调用该算法时,需要通过加密芯片的接 ...
- 基于crypto++国产加密软件SM4的实现,顺带加了ase,base64
唔,美国压制得越狠,各种替代产品就越能活. 本文分享SM4的一种快速实现与集成方式. SM4(原名SMS4)是中华人民共和国政府采用的一种分组密码标准,由国家密码管理局于201 ...
- sm1、sm2、sm3、sm4简单介绍
转自:https://blog.csdn.net/andylau00j/article/details/54427395 国密即国家密码局认定的国产密码算法.主要有SM1,SM2,SM3,SM4.密钥 ...
- 一文带你学会国产加密算法SM4的java实现方案
前言 今天给大家带来一个国产SM4加密解密算法的java后端解决方案,代码完整,可以直接使用,希望给大家带来帮助,尤其是做政府系统的开发人员,可以直接应用到项目中进行加密解密. 画重点!是SM4哦,不 ...
- 一文带你学会国产加密算法SM4的vue实现方案
前言 上篇文章我们介绍了国产SM4加密算法的后端java实现方案.没有看过的小伙伴可以看一下这篇文章. https://www.cnblogs.com/jichi/p/12907453.html 本篇 ...
随机推荐
- Django框架表单基础
本节主要介绍一下Django框架表单(Form)的基础知识.Django框架提供了一系列的工具和库来帮助设计人员构建表单,通过表单来接收网站用户的输入,然后处理以及响应这些用户的输入. 6.1.1 H ...
- Nuxt.js 应用中的 vite:serverCreated 事件钩子
title: Nuxt.js 应用中的 vite:serverCreated 事件钩子 date: 2024/11/18 updated: 2024/11/18 author: cmdragon ex ...
- Windows系统下PhpStorm+Xdebug安装与调试
环境说明: 系统:Windows10 PhpStorm:2019.3.2 PHP版本:7.3.21 Xdebug版本 :2.7.2 一.Xdebug介绍 官网地址:https://xdebug.org ...
- nginx相关服务实践
1. 实现客户端IP地址获取接口 普通版本 Nginx 的配置文件中提供了一个变量 $remote_addr 用来获取用户访问本实例时的 IP 地址,我们只要将这个变量的值返回给用户就行了(没错,就是 ...
- a标签与Blob下载文件的区别和获取文件下载进度
文件下载的几种方式. 大家都做过文件下载,无非就是通过a标签给定一个href. 用户点击下载按钮. 或者使用Blob的方式进行下载. 这两种是很常见的,也是我们平时做使用最多的方式. 那么我们知道这2 ...
- 调用import71
在调用import71,将E00转换成coverage的时候,需要注意两点: 1.e00文件路径,需要包含.e00后缀: 2.输入路径的文件夹必须不存在,在转换的时候,工具会进行新建. 参考 http ...
- Ant Design Pro项目ProTable怎么实现单元格合并效果
前情 公司有经常需要做一些后台管理页面,我们选择了Ant Design Pro,它是基于 Ant Design 和 umi 的封装的一整套企业级中后台前端/设计解决方案. 产品效果图 最新接到的一个后 ...
- Consul 学习总结
什么是Consul? Consul是一种服务网络解决方案,使团队能够管理服务之间以及跨本地和多云环境和运行时的安全网络连接.Consul提供服务发现.服务网格(service mesh).流量管理和网 ...
- aws命令行cli创建VPC网络、公有子网、私有子网、nat网关+EIP
在AWS部署海外节点, 图简单使用web控制台创建VPC和k8s集群出错(k8s), 使用cli命令行工具创建成功 本实例为复盘, 记录aws命令行工具cli创建VPC网络, a区和b区分别创建公有子 ...
- Idea如何关闭单词拼写检查
打开Intellij Idea,在代码中输入lisi或zhangsan单词,可见这两个单词下面出现了绿色波浪线,表明词库中找不到这两个单词 2 鼠标移到波浪线上,可以看到如下提示信息,点击[more] ...