📄 sdes--en--de.cpp
字号:
#include<iostream.h>
int p10[10]={3,5,2,7,4,10,1,9,8,6};
int p8[8]={6,3,7,4,8,5,10,9};
int ep[8]={4,1,2,3,2,3,4,1};
int p4[4]={2,4,3,1};
int s0[4][4]={{1,0,3,2},{3,2,1,0},{0,2,1,3},{3,1,3,2}};
int s1[4][4]={{0,1,2,3},{2,0,1,3},{3,0,1,0},{2,1,0,3}};
int ip[8]={2,6,3,1,4,8,5,7};
int ip1[8]={4,1,3,5,7,2,8,6};
void sdes_en(int & pt,int key);
void sdes_de(int & pt,int key);
void bit_print(int a,int b);
void fk(int &P,int ki);
void P10(int &key); // p10,p8,ip等置换运算
void P8(int key,int & ki);
void P4(int & p);
void IP(int &pt,int ip[]);
void getkey(int key,int & k1,int & k2);
void LS_1(int & k);
void epfunction(int ep[],int & t); // E/P 扩展/置换
void sw(int & pt);
void main()
{
int i=0,pt=0,key=0,c=0;
char PT[8],KEY[10];
cout<<"\n输入 8 位明文:";
for(i=0;i<8;i++)
cin>>PT[i];
cout<<"\n输入10 位密钥:";
for(i=0;i<10;i++)
cin>>KEY[i];
for(i=0;i<8;i++) //转换为二进制
pt=pt*2+(PT[i]-'0');
for(i=0;i<10;i++) //转换为二进制
key=key*2+(KEY[i]-'0');
sdes_en(pt,key);
cout<<"\n输出 8 位密文:";
bit_print(pt,8);
sdes_de(pt,key);
cout<<"\n输出 8 位明文:";
bit_print(pt,8);
cout<<endl;
}
void sdes_en(int & pt,int key)
{
int k1=0,k2=0;
getkey(key,k1,k2);
IP(pt,ip); // 初始置换 IP
fk(pt,k1); // 复杂函数
sw(pt); // SW
fk(pt,k2); // 复杂函数
IP(pt,ip1); // IP 逆
}
void sdes_de(int & ct,int key)
{
int k1=0,k2=0;
getkey(key,k1,k2);
IP(ct,ip); // 初始置换 IP
fk(ct,k2); // 复杂函数
sw(ct); // SW
fk(ct,k1); // 复杂函数
IP(ct,ip1); // IP 逆
}
void getkey(int key,int & k1,int & k2)
{
P10(key); // P10 置换
LS_1(key); // 前 后 5 位分别循环左移一位
P8(key,k1); // P8 置换,得到 k1
LS_1(key); // 前 后 5 位分别循环左移两位
LS_1(key);
P8(key,k2); // P8 置换,得到 k2
}
void fk(int &pt,int ki)
{
int i=0,j=0,p=0,k=0,bit=0,t1=0,t2=0,temp=0;
t1=pt & 0x00F0; // 取明文的高 4 位
t2=pt & 0x000F; // 取明文的低 4 位
temp=t2; // 记住明文低 4 位
epfunction(ep,t2); // E/P 运算
// 与密钥 KI 进行异或运算
t2=t2 ^ ki;
// 取 t2 前 4位(矩阵的第一行)
i=t2 & 0xF0; // 0011110000 = 0x00F0
i=i >> 4;
j=i;
bit=i >> 2 & 0x0010; // 取第 1 位
i=i & 0x01; // 取第 4 位
i=i | bit;
i=i & 0x03; // 决定 S0 的行数 0000000011 = 0x03
j=j >> 1;
j=j & 0x03; // 决定 S0 的列数
p=s0[i][j];
p=p << 2;
// 取 t2 后 4 位
i=t2 & 0x0F; // 0000001111 = 0x0F
j=i;
bit=i >> 2 & 0x0010; // 取第 1 位
i=i & 0x01; // 取第 4 位
i=i | bit;
i=i & 0x03; // 决定 S1 的行数 0000000011 = 0x03
j=j >> 1;
j=j & 0x03; // 决定 S1 的列数
p=p | s1[i][j];
P4(p); // P4 置换
t2=p << 4;
t1=t1 ^ t2;
t2=temp;
pt=t1 | t2;
}
void LS_1(int & key)
{
int bit,t1,t2;
// 前 5 位循环左移一位
t1=key & 0x03E0; // 1111100000 = 0X03E0
bit=t1 & 0x0200; // 1000000000 = 0x0200
bit=bit >> 4;
t1=t1 << 1;
t1=t1 | bit;
t1=t1 & 0x03E0; // 1111100000 = 0X03E0
// 后 5位循环左移一位
t2=key & 0x001F; // 0000011111 = 0X001F
bit=t2 & 0x0010; // 0000010000 = 0x0010
bit=bit >> 4;
t2=t2 << 1;
t2=t2 | bit;
t2=t2 & 0x001F; // 0000011111 = 0X001F
key=t1 | t2; // 循环移位后的 key
}
void P10(int &key) // p10置换运算
{
int i=0,bit,k=0;
for(i=0;i<10;i++){
bit=key >> (10-p10[i]) & 0x01; //将想要得到的位的值先右移到末位
bit=bit << (9-i); //设置第i位的值
k=k | bit;
}
key=k;
}
void P8(int key,int &ki) // p8置换运算
{
int i=0,bit,k=0;
for(i=0;i<8;i++){
bit=key >> (10-p8[i]) & 0x01; //将想要得到的位的值先右移到末位
bit=bit << (7-i); //设置第i位的值
k=k | bit;
}
ki=k; // 获得子密钥
}
void P4(int & p)
{
int i=0,bit=0,k=0;
for(i=0;i<4;i++){
bit= p >> (4-p4[i]) & 0x01;
bit=bit << (3-i);
k=k | bit;
}
p=k;
}
void IP(int &pt,int ip[]) // ip , ip逆 置换运算 ( 取决于矩阵 ip[] )
{
int i=0,bit,k=0;
pt=pt & 0x0FF; // 初始化pt,取其后八位 0011111111 = 0x0FF
for(i=0;i<8;i++){
bit= pt >> (8-ip[i]) & 0x01;
bit=bit << (7-i);
k=k | bit;
}
pt=k;
}
void epfunction(int ep[],int & t) // E/P 扩展/置换
{
int i=0,k=0,bit;
for(i=0;i<4;i++){ // 高 4 位
bit= t >> (4-ep[i]) & 0x01;
bit=bit << (7-i);
k=k | bit;
}
for(i=0;i<4;i++){ // 低 4 位
bit= t >> (4-ep[i+4]) & 0x01;
bit=bit << (3-i);
k=k | bit;
}
t=k;
}
void sw(int & pt) // SW
{
int t1,t2;
t1=pt & 0x00F0; // t1 为高 4 位
t2=pt & 0x000F; // t2 为低 4 位
t1=t1 >> 4;
t2=t2 << 4;
pt=t1 | t2;
}
void bit_print(int a,int b)
{
int i;
int mask = 1 << (b-1);
for(i=0;i<b;i++){
cout<<(((a & mask)==0) ? '0':'1');
a = a << 1;
}
cout<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -