密码学 s-des
- 格式:wps
- 大小:113.72 KB
- 文档页数:6
(4). 设计一个类似于S-DES 分组长度是12bits 的分组加密算法。
对算法作差分和线性密码分析。
思路分析:
○
1随机产生12bit 明文和14bit 密钥。
○2按下图变换。
加密过程
上图中,IP 表示初始置换,SW 表示高低位交换,F 表示加密函数,<<1表示循环左移1位,<<2表示循环左移2位,IP -1表示IP 的逆矩阵,输入12bit 明文,14bit 密钥,通过代换和置换输出12bit 密文。
下图为F 函数,两个S 盒分别输入6位输出3位,组合成6位,再与L 异或得到密文的高6位,再与12位输入的低六位组合,生成密文。
12bit 明文 14bit 密钥
12bit 密文
密钥置换 14位到12为变换
F
SW F IP -1
IP <<2
<<2
<<1
<<1
14位到12为变换
k1 7
7 7 7 7
7
12
12
F 函数
定义的S1盒如下: 定义的S2盒如下: 0
1
2 3 4 5 6 7 0 5 2 4 1 0 3 6 7 1 0 3 6 5 7 2 1 4 2 7 6 5 3 2 0 4 1 3 4 1 7 2 3 0 5 6 4 1 5 2 4 0 7 6 3 5 2 6 3 5 4 7 0 1 6 3 5 7 4 2 1 6 0 7 6
3
7
4
2
5
1
0 1 2 3 4 5 6 7 0 0 4 6 7 3 2 1 5 1 3 6 4 2 1 0 5 7 2
2
4
1
6
5
7
3
3 7 3 2
4 6 1 0
5 4 1 7 5 3 2 4 0
6 5 6 5
7 4 2 3 1 0 6 5 2 4 7 6 3 0 1 7 4
2
7
1
5
6
3
6 6 6
6
3
3
6
6 6
12
k
6位置换 6位到12位扩展
S0
S1 L R L R 12位输入 12位输出
程序代码如下:
clc;
clear all;
fprintf('产生随机明文:\n');
plaintext=round(rand(1,12)) %随机产生12位明文
key=round(rand(1,14)); %随机产生14位密钥
A1=[0 0 0 0 0 0 0 0 0 1 0 0; %定义明文置换矩阵
0 0 0 1 0 0 0 0 0 0 0 0 ;
0 0 0 0 0 0 1 0 0 0 0 0 ;
1 0 0 0 0 0 0 0 0 0 0 0;
0 0 1 0 0 0 0 0 0 0 0 0;
0 1 0 0 0 0 0 0 0 0 0 0;
0 0 0 0 1 0 0 0 0 0 0 0;
0 0 0 0 0 0 0 1 0 0 0 0;
0 0 0 0 0 1 0 0 0 0 0 0;
0 0 0 0 0 0 0 0 0 0 1 0;
0 0 0 0 0 0 0 0 1 0 0 0;
0 0 0 0 0 0 0 0 0 0 0 1;];
A2=[0 0 0 0 0 0 0 0 0 1 0 0 0 0; %定义密钥置换矩阵
0 0 0 0 0 1 0 0 0 0 0 0 0 0 ;
0 0 0 0 0 0 1 0 0 0 0 0 0 0 ;
1 0 0 0 0 0 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 0 0 0 0 0 0 1 0;
0 1 0 0 0 0 0 0 0 0 0 0 0 0;
0 0 0 0 1 0 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 0 1 0 0 0 0 0 0;
0 0 0 0 0 0 0 0 0 0 0 0 0 1;
0 0 0 0 0 0 0 0 0 0 0 1 0 0;
0 0 0 0 0 0 0 0 0 0 1 0 0 0;
0 0 0 0 0 0 0 0 1 0 0 0 0 0;
0 0 1 0 0 0 0 0 0 0 0 0 0 0;
0 0 0 1 0 0 0 0 0 0 0 0 0 0;];
A3=[0 0 0 0 0 1 0 0 0 0 0 0 ; %实现14位转12的变换
0 0 0 0 0 0 0 0 0 0 1 0 ;
1 0 0 0 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 0 1 0 0 0 0;
0 1 0 0 0 0 0 0 0 0 0 0 ;
0 0 0 0 0 0 0 0 1 0 0 0 ;
0 0 0 1 0 0 0 0 0 0 0 0;
0 0 0 0 0 1 0 0 0 0 0 0;
0 0 1 0 0 0 0 0 0 0 0 0 ;
0 0 0 0 0 0 0 0 0 0 0 0 ;
0 0 0 0 1 0 0 0 0 0 0 0;
0 0 0 0 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 0 0 0 1 0 0;
0 0 0 0 0 0 0 0 0 0 0 1;] ;
B1=plaintext*A1; %对明文进行初始置换
B2=key*A2; %对密钥进行初始置换
B2L=B2(1:7); %取B2的高7位
B2R=B2(8:14); %取B2的低7位
B3L=circshift(B2L',-1); %B2高7位循环左移一位B3R=circshift(B2R',-1); %B2高7位循环左移一位B3=[B3L;B3R];
k1=B3'*A3; %得到子密钥k1
B4L=circshift(B3L,-2); %B3高7位循环左移两位B4R=circshift(B3R,-2); %B3高7位循环左移两位B4=[B4L;B4R];
k2=B4'*A3; %得到子密钥k2
P=fun(B1,k1); %用函数第一次加密
Q1=P(1:6);
Q2=P(7:12);
Q=[Q2,Q1]; %实现高低位交换
R=fun(Q,k2); %使用函数第二次加密fprintf('产生密文:\n');
ciphertext=R*inv(A1) %%%%%%%%%%%%%%%%%%%%%%%%%%%%% 解密算法
Arr1=ciphertext*A1; %对密文置换
Arr2=fun(Arr1,k2); %使用k2第一轮解密
Arr3=[Arr2(7:12),Arr2(1:6)]; %Arr2高低位交换
Arr4=fun(Arr3,k1); %使用k1第二轮解密fprintf('解密出明文:\n');
output=Arr4*inv(A1) %解密明文
函数文件:
function B=fun(X,k)
S0=[5 2 4 1 6 3 0 7; %定义S0盒
0 3 6 5 7 2 1 4;
7 6 5 3 2 0 4 1;
4 1 7 2 3 0
5 6;
1 5
2 4 0 7 6 3;
2 6
3 5
4 7 0 1;
3 5 7
4 2 1 6 0;
6 3
7 4 2 5 0 1;];
S1=[0 4 6 7 3 2 1 5; %定义S1盒
3 6
4 2 1 0
5 7;
2 4 1 6 5 7 0 3;
7 3 2 4 6 1 0 5 ;
1 7 5 3
2 4 0 6;
6 5
7 4 2 3 1 0;
5 2 4 7
6 3 0 1;
4 2 7 0 1
5
6 3;];
A=[0 0 1 0 0 0 0 0 0 0 0 1; %6位到12位的扩展变换矩阵 0 0 0 1 0 0 0 1 0 0 0 0;
0 0 0 0 1 0 0 0 1 0 0 0;
0 0 0 0 0 0 1 0 0 1 0 0;
0 1 0 0 0 0 0 0 0 0 1 0;
1 0 0 0 0 1 0 0 0 0 0 0;] ;
F=[0 0 0 0 1 0; %6位置换矩阵
0 1 0 0 0 0;
1 0 0 0 0 0;
0 0 0 1 0 0;
0 0 0 0 0 1;
0 0 1 0 0 0;];
Xl=X(1:6); %取X得高6位
Xr=X(7:12); %取X的低6位
Y=Xr*A; %对Xr进行6到12位变换记为Y
C=mod(Y+k,2); %对Y和密钥异或
Cl=C(1:6); %取C的高6位
Cr=C(7:12); %取C的低6位
i=4*Cl(1)+2*Cl(3)+Cl(5)+1; %对S0盒操作的下标
j=4*Cl(2)+2*Cl(4)+Cl(6)+1;
D0=S0(i,j);
E(1)=fix(D0/4); %将D0转换成2进制后最高位的值E(2)=fix((D0-E(1)*4)/2); %将D0转换成2进制后次高位的值E(3)=mod(D0,2); %将D0转换成2进制后最低位的值s=4*Cr(1)+2*Cr(3)+Cr(5)+1; %对S1盒操作的下标
t=4*Cr(2)+2*Cr(4)+Cr(6)+1;
D1=S1(s,t);
E(4)=fix(D1/4); %将D1转换成2进制后最高位的值E(5)=fix((D1-E(4)*4)/2); %将D1转换成2进制后次高位的值E(6)=mod(D1,2); %将D1转换成2进制后最低位的值G=E*F; %对E置换后的矩阵
H=mod(G+Xl,2); %将G和Xl异或
B=[H,Xr];
执行结果:。