⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdes--en--de.cpp

📁 RSA,S-DES加密算法,实现了加解密
💻 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 + -