%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实现的更多相关文章

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

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

  2. 最强加密算法?AES加解密算法Matlab和Verilog实现

    目录 背景 AES加密的几种模式 基本运算 AES加密原理 Matlab实现 Verilog实现 Testbench 此本文首发于公众号[两猿社],重点讲述了AES加密算法的加密模式和原理,用MATL ...

  3. 信息安全-2:python之hill密码算法[原创]

    转发注明出处:http://www.cnblogs.com/0zcl/p/6106513.html 前言: hill密码算法我打算简要介绍就好,加密矩阵我用教材上的3*3矩阵,只做了加密,解密没有做, ...

  4. OpenSSL密码算法库: MD5示例小程序

    OpenSSL http://www.openssl.org/ OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库.SSL协议库以及应用程序.OpenSSL 的密码算法库包含多种加密算 ...

  5. 国密SM4对称算法实现说明(原SMS4无线局域网算法标准)

    国密SM4对称算法实现说明(原SMS4无线局域网算法标准) SM4分组密码算法,原名SMS4,国家密码管理局于2012年3月21日发布:http://www.oscca.gov.cn/News/201 ...

  6. 使用CPA4破解经典密码算法

    下面是一段经过经典密码算法加密的密文(加密算法未知): yvvnerujjvnywhbdvkpchfgvjtzwqsuporqfzpoekkjgziicdwwkeejdsruef   whwseyej ...

  7. 密码算法详解——AES

    0 AES简介 1997年1月2号,美国国家标准技术研究所宣布希望征集一个安全性能更高的加密算法(AES)[3],用以取代DES.我们知道DES的密钥长度是64 bits,但实际加解密中使用的有效长度 ...

  8. 密码算法详解——DES

    0 DES简介 在20世纪60年代后期,IBM公司成立了一个由Horst Feistel负责的计算机密码学研究项目.1971年设计出密码算法LUCIFER后,该项目宣告结束.LUCIFER被卖给了伦敦 ...

  9. [区块链] 密码学——椭圆曲线密码算法(ECC)

    今天在学椭圆曲线密码(Elliptic Curve Cryptography,ECC)算法,自己手里缺少介绍该算法的专业书籍,故在网上查了很多博文与书籍,但是大多数博客写的真的是...你懂的...真不 ...

随机推荐

  1. Python 用DataFrame读 存 excel

    读 代码: import pandas as pd e = r'D:\pywork\12\excel信息表.xlsx' df = pd.DataFrame(pd.read_excel(e)) 存 D. ...

  2. 为什么LinkedList不建议使用for循环遍历,而使用iterator方式进行遍历,但ArrayList建议使用for循环进行遍历呢?

    如果使用for循环方式遍历链表,由于链表中元素是通过指针连接彼此的,不存在索引的概念,如果使用for循环方式遍历LinkedList,依次传入索引值,则就相当于每次都要将链表撸一遍. 如:在下面的这个 ...

  3. SpringBoot集成Junit

    1.在pom.xml下添加Junit依赖: <!--添加junit环境的jar包--> <dependency> <groupId>org.springframew ...

  4. Java反射概念与基础

    反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...

  5. java反序列化——XMLDecoder反序列化漏洞

    本文首发于“合天智汇”公众号 作者:Fortheone 前言 最近学习java反序列化学到了weblogic部分,weblogic之前的两个反序列化漏洞不涉及T3协议之类的,只是涉及到了XMLDeco ...

  6. python爬虫以及后端开发--实用加密模板整理

    都是作者累积的,且看其珍惜,大家可以尽量可以保存一下,如果转载请写好出处https://www.cnblogs.com/pythonywy 一.md5加密 1.简介 这是一种使用非常广泛的加密方式,不 ...

  7. windows下cmd命令行计算文件hash值

    命令:certutil -hashfile certutil -hashfile D:\.exe MD5 certutil -hashfile D:\.exe SHA1 certutil -hashf ...

  8. CentOS 7环境下大量创建账号的方法

    1 一些账号相关的检查工具 1.1 pwck命令 pwck 这个指令在检查 /etc/passwd 这个账号配置文件内的信息,与实际的家目录是否存在等信息,还可以比对 /etc/passwd /etc ...

  9. docker部署数据库

    搜索数据库镜像images docker search mysql 搜索结果如下图所示: 选择合适自己的mysql版本 因为mysql新版本出来了,很多特性没有学习,所以笔者安装了mysql:5.6 ...

  10. Htmlcss学习笔记1——html基础

    Hyper text markup language 超文本标签语言.不是一种编程语言,而是一种标记语言标记语言是一套标记标签 开发工具 chrome subline vscode photoshop ...