SM4密码算法matlab实现
%function C=SM4(X,K,M)
%M为1时进行加密,M为0时进行解密操作,X为明文/密文输入,K为密钥输入
X='0123456789abcdeffedcba9876543210';
%X='681edf34d206965e86b3e94f536e4246';
K='0123456789abcdeffedcba9876543210';
M=1;
%****************X输入明文*************
XB=[];
A=zeros(36,32);
for i=1:32
Xi=X(i);
XBi=['0000',dec2bin(hex2dec(Xi))];
XBi=XBi(end-3:end);
XBi=[str2num(XBi(1)),str2num(XBi(2)),str2num(XBi(3)),str2num(XBi(4))];
XB=[XB,XBi];
if rem(i,8)==0
A(ceil(i/8),:)=XB;
XB=[];
end
end
%****************K输入密钥***********
KB=[];
MK=zeros(4,32);
for i=1:32
Ki=K(i);
KBi=['0000',dec2bin(hex2dec(Ki))];
KBi=KBi(end-3:end);
KBi=[str2num(KBi(1)),str2num(KBi(2)),str2num(KBi(3)),str2num(KBi(4))];
KB=[KB,KBi];
if rem(i,8)==0
MK(ceil(i/8),:)=KB;
KB=[];
end
end
%*****************FK获得******************
F='A3B1BAC656AA3350677D9197B27022DC';
FB=[];
FK=zeros(4,32);
for i=1:32
Fi=F(i);
FBi=['0000',dec2bin(hex2dec(Fi))];
FBi=FBi(end-3:end);
FBi=[str2num(FBi(1)),str2num(FBi(2)),str2num(FBi(3)),str2num(FBi(4))];
FB=[FB,FBi];
if rem(i,8)==0
FK(ceil(i/8),:)=FB;
FB=[];
end
end
%**************K初始化***********
K=zeros(36,32);
for i=1:4
K(i,:)=mod(MK(i,:)+FK(i,:),2);
end
%***************CK获得**********
C=zeros(32,4);
CK=zeros(32,32);
for i=0:31
for j=0:3
C(i+1,j+1)=mod((4*i+j)*7,256);
end
end
c=[];
for i=1:32
for j=1:4
ci=['00000000',dec2bin(C(i,j))];
ci=ci(end-7:end);
ci=[str2num(ci(1)),str2num(ci(2)),str2num(ci(3)),str2num(ci(4)),str2num(ci(5)),str2num(ci(6)),str2num(ci(7)),str2num(ci(8))];
c=[c,ci];
end
CK(i,:)=c;
c=[];
end
%**********************S盒****************************
S={'d6','90','e9','fe','cc','e1','3d','b7','16','b6','14','c2','28','fb','2c','05';
'2b','67','9a','76','2a','be','04','c3','aa','44','13','26','49','86','06','99';
'9c','42','50','f4','91','ef','98','7a','33','54','0b','43','ed','cf','ac','62';
'e4','b3','1c','a9','c9','08','e8','95','80','df','94','fa','75','8f','3f','a6';
'47','07','a7','fc','f3','73','17','ba','83','59','3c','19','e6','85','4f','a8';
'68','6b','81','b2','71','64','da','8b','f8','eb','0f','4b','70','56','9d','35';
'1e','24','0e','5e','63','58','d1','a2','25','22','7c','3b','01','21','78','87';
'd4','00','46','57','9f','d3','27','52','4c','36','02','e7','a0','c4','c8','9e';
'ea','bf','8a','d2','40','c7','38','b5','a3','f7','f2','ce','f9','61','15','a1';
'e0','ae','5d','a4','9b','34','1a','55','ad','93','32','30','f5','8c','b1','e3';
'1d','f6','e2','2e','82','66','ca','60','c0','29','23','ab','0d','53','4e','6f';
'd5','db','37','45','de','fd','8e','2f','03','ff','6a','72','6d','6c','5b','51';
'8d','1b','af','92','bb','dd','bc','7f','11','d9','5c','41','1f','10','5a','d8';
'0a','c1','31','88','a5','cd','7b','bd','2d','74','d0','12','b8','e5','b4','b0';
'89','69','97','4a','0c','96','77','7e','65','b9','f1','09','c5','6e','c6','84';
'18','f0','7d','ec','3a','dc','4d','20','79','ee','5f','3e','d7','cb','39','48'};
% T=[1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0];
%************************rk轮密钥生成************************
rk=zeros(32,32);
SB=[];
for j=1:32
T=mod(K(j+1,:)+K(j+2,:)+K(j+3,:)+CK(j,:),2);
for i=1:8:25
b1=T(i)*8+T(i+1)*4+T(i+2)*2+T(i+3)+1;
b2=T(i+4)*8+T(i+5)*4+T(i+6)*2+T(i+7)+1;
s=S(b1,b2);
si=['00000000',dec2bin(hex2dec(s))];
si=si(end-7:end);
si=[str2num(si(1)),str2num(si(2)),str2num(si(3)),str2num(si(4)),str2num(si(5)),str2num(si(6)),str2num(si(7)),str2num(si(8))];
SB=[SB,si];
end
B1=SB;
B2=[SB(14:end),SB(1:13)];
B3=[SB(24:end),SB(1:23)];
B=mod(B1+B2+B3,2);
SB=[];
K(j+4,:)=mod(K(j,:)+B(1,:),2);
rk(j,:)=K(j+4,:);
end
%******************加解密操作**********************************
if M==1
for j=1:32
T=mod(A(j+1,:)+A(j+2,:)+A(j+3,:)+rk(j,:),2);
for i=1:8:25
b1=T(i)*8+T(i+1)*4+T(i+2)*2+T(i+3)+1;
b2=T(i+4)*8+T(i+5)*4+T(i+6)*2+T(i+7)+1;
s=S(b1,b2);
si=['00000000',dec2bin(hex2dec(s))];
si=si(end-7:end);
si=[str2num(si(1)),str2num(si(2)),str2num(si(3)),str2num(si(4)),str2num(si(5)),str2num(si(6)),str2num(si(7)),str2num(si(8))];
SB=[SB,si];
end
B1=SB;
B2=[SB(3:end),SB(1:2)];
B3=[SB(11:end),SB(1:10)];
B4=[SB(19:end),SB(1:18)];
B5=[SB(25:end),SB(1:24)];
B=mod(B1+B2+B3+B4+B5,2);
SB=[];
A(j+4,:)=mod(A(j,:)+B(1,:),2);
end
else
if M==0
for j=1:32
T=mod(A(j+1,:)+A(j+2,:)+A(j+3,:)+rk(33-j,:),2);
for i=1:8:25
b1=T(i)*8+T(i+1)*4+T(i+2)*2+T(i+3)+1;
b2=T(i+4)*8+T(i+5)*4+T(i+6)*2+T(i+7)+1;
s=S(b1,b2);
si=['00000000',dec2bin(hex2dec(s))];
si=si(end-7:end);
si=[str2num(si(1)),str2num(si(2)),str2num(si(3)),str2num(si(4)),str2num(si(5)),str2num(si(6)),str2num(si(7)),str2num(si(8))];
SB=[SB,si];
end
B1=SB;
B2=[SB(3:end),SB(1:2)];
B3=[SB(11:end),SB(1:10)];
B4=[SB(19:end),SB(1:18)];
B5=[SB(25:end),SB(1:24)];
B=mod(B1+B2+B3+B4+B5,2);
SB=[];
A(j+4,:)=mod(A(j,:)+B(1,:),2);
end
end
end
%**************反序变换*******************
Y=[];
for i=1:4
for j=1:8:25
l=[num2str(A(37-i,j)),num2str(A(37-i,j+1)),num2str(A(37-i,j+2)),num2str(A(37-i,j+3)),num2str(A(37-i,j+4)),num2str(A(37-i,j+5)),num2str(A(37-i,j+6)),num2str(A(37-i,j+7))];
Y=[Y,dec2hex(bin2dec(l))];
end
end
Y
v
SM4密码算法matlab实现的更多相关文章
- SM4密码算法(附源码)
SM4是我们自己国家的一个分组密码算法,是国家密码管理局于2012年发布的.网址戳→_→:http://www.cnnic.NET.cn/jscx/mixbz/sm4/ 具体的密码标准和算法官方有非常 ...
- 最强加密算法?AES加解密算法Matlab和Verilog实现
目录 背景 AES加密的几种模式 基本运算 AES加密原理 Matlab实现 Verilog实现 Testbench 此本文首发于公众号[两猿社],重点讲述了AES加密算法的加密模式和原理,用MATL ...
- 信息安全-2:python之hill密码算法[原创]
转发注明出处:http://www.cnblogs.com/0zcl/p/6106513.html 前言: hill密码算法我打算简要介绍就好,加密矩阵我用教材上的3*3矩阵,只做了加密,解密没有做, ...
- OpenSSL密码算法库: MD5示例小程序
OpenSSL http://www.openssl.org/ OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库.SSL协议库以及应用程序.OpenSSL 的密码算法库包含多种加密算 ...
- 国密SM4对称算法实现说明(原SMS4无线局域网算法标准)
国密SM4对称算法实现说明(原SMS4无线局域网算法标准) SM4分组密码算法,原名SMS4,国家密码管理局于2012年3月21日发布:http://www.oscca.gov.cn/News/201 ...
- 使用CPA4破解经典密码算法
下面是一段经过经典密码算法加密的密文(加密算法未知): yvvnerujjvnywhbdvkpchfgvjtzwqsuporqfzpoekkjgziicdwwkeejdsruef whwseyej ...
- 密码算法详解——AES
0 AES简介 1997年1月2号,美国国家标准技术研究所宣布希望征集一个安全性能更高的加密算法(AES)[3],用以取代DES.我们知道DES的密钥长度是64 bits,但实际加解密中使用的有效长度 ...
- 密码算法详解——DES
0 DES简介 在20世纪60年代后期,IBM公司成立了一个由Horst Feistel负责的计算机密码学研究项目.1971年设计出密码算法LUCIFER后,该项目宣告结束.LUCIFER被卖给了伦敦 ...
- [区块链] 密码学——椭圆曲线密码算法(ECC)
今天在学椭圆曲线密码(Elliptic Curve Cryptography,ECC)算法,自己手里缺少介绍该算法的专业书籍,故在网上查了很多博文与书籍,但是大多数博客写的真的是...你懂的...真不 ...
随机推荐
- yb课堂之压力测试工具Jmeter5.X 实战《二十二》
目前常用的测试工具对比 LoadRunner 性能稳定,压测结果及细粒度大,可以自定义脚本进行压力,但是太过于重大,功能比较繁多 Apache AB(单接口压测最方便) 模拟多线程并发请求,ab命令对 ...
- unity探索者之支付宝支付,非第三方插件
版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/8405044.html 支付宝的sdk接入方式和微信支付比较类似,大部分的工作也基本 ...
- CentOS7 安装图形化桌面
1.装好CentOS7后,我们一开始是上不了网的 (ping 百度报错:Name or service not know) 2.输入dhclient,可以自动获取一个IP地址,再用命令ip addr查 ...
- github Repository not found 解决办法
git pull的时候遇到下面的报错. remote: Repository not found fatal: repository 'https://github.com/MyRepo/projec ...
- 微服务项目整合Ocelot+IdentityServer4
项目搭建肯定少不了认证和授权,传统的单体应用基于cookie和session来完成的. 因为http请求是无状态的,每个请求都是完全独立的,服务端无法确认当前请求之前是否登陆过.所以第一次请求(登录) ...
- Understanding dopamine and reinforcement learning: The dopamine reward prediction error hypothesis
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! Abstract 在中脑多巴胺能神经元的研究中取得了许多最新进展.要了解这些进步以及它们之间的相互关系,需要对作为解释框架并指导正在进行的 ...
- Appium学习笔记
1.创建Maven项目 2.POM文件添加java-client依赖坐标 3.修改脚本,执行脚本 UIAutomator2(自动装置引擎) 4723:Appium服务器端口,用来监听脚本发送过来的指令 ...
- SpringMVC中前端Form表单提交后跳转不过去的问题
今天晚上打算谢谢Spring整合这个内容,写的差不多之后运行 出现了各种问题 逐一排查 首先有一个(MyEclipse10) 一: class path resource [spring-mvc.xm ...
- Qt 绘图(QBitmap,QPixmap,QImage,QPicture)
QPainter绘图绘图设备(QPixmap,QImage,QBitmap,QPicture) 重写绘图事件,虚函数 如果窗口绘图,必须放在绘图事件里实现 绘图事件内部自动调用,窗口需要重绘的时候,状 ...
- C++标准模板库(STL)常用介绍
1. 输入输出 C++既可以用C的scanf和printf,也可以用新增的的cin与cout,后者速度慢 1.1 C程序中输入输出 int a; scanf("%d",&a ...