我编写的S-DES8位加密解密算法
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<iostream>
using namespace std;
void pp(char *num,char *x,char *y)//合并数组
{
for(int i=0;i<5;i++)
{
num[i]=x[i];
num[i+5]=y[i];
}
}
void key(char *k1,char *k2)//生成子密钥
int ss[4];
int dd[4];
int abc[4]={2,4,3,1};//P4置换码
char xx[8];char aa[4],bb[4];
for(int i=0;i<8;i++)//将整型数组转换成字符数组
{
xx[i]=x[(yy[i]-1)];
}
for(int j=0;j<8;j++)//将整型数组转换成字符数组
}
for(int sh=0;sh<4;sh++)//p4置换
{
z[sh]=data[abc[sh]-1];
}
}
void DES(char *x,char *m)//DES加密
{
int y[8]={2,6,3,1,4,8,5,7};//IP置换码
int z[8]={4,1,3,5,7,2,8,6};//IP~1置换码
{
int *y;int *z;int num[8];
y=new int[n];z=new int[n];
char temp[8];
char elem[8];
for(int i=0;i<n;i++)//将字符转换成ASCLL码,并存储在一个整型数组中
{
y[i]=x[i];
}
for(int k=0;k<n;k++)
for(int mp=0;mp<4;mp++)
/*将整型数组转换成字符数组,如果字符数组中的一个元素为
'0',则对应的整型数组中的位置元素为0,反之为1*/
{
if(csc[mp]==0)
data[mp]='0';
else if(csc[mp]==1)
data[]='1';
else
data[mp]=' ';
{
int *y;int *z;int num[8];
y=new int[n];z=new int[n];
char temp[8];
char elem[8];
for(int i=0;i<n;i++)//将字符转换成ASCLL码,并存储在一个整型数组中
{
y[i]=x[i];
}
for(int k=0;k<n;k++)
L1[k]=R0[k]='0';
else
L1[k]=R0[k]='1';
}
F(R0,k1,d);//F函数运算
for(int p=0;p<4;p++)
//异或运算,相同为0,不相同为1
{
if(R1[p]==d[p])
L0[p]='0';
else
L0[p]='1';
}
for(int q=0;q<4;q++)//合并数组
for(int j=n-1;j>=0;j--)
{
int tem=1;int sum=0;
for(int i=0;i<n-1-j;i++)//幂运算
{
tem=tem*2;
}
sum+=tem*x[j];
kp+=sum;
}
q=kp;//将ASCLL码转换成字符
cout<<q;
}
void base(char *x,int n)//S-DES加密的主程序
//加密使用的临时数组
char L0[4],R0[4],L1[4],R1[4];
char L2[4],R2[4],elem[8],num[8],c[4],d[4];
char k1[8];char k2[8];//子密钥
for(int i=0;i<8;i++)//IP置换
{
elem[i]=x[y[i]-1];
}
SDES(temp,elem);
for(int q=0;q<8;q++)//将字符数组转换成整型数组
{
if(elem[q]=='0')
num[q]=0;
else
num[q]=1;
}
jinzhi(num,8);
}
}
int main()
{
system("color 34");
cout<<"\n\t\t|************************************|"<<endl;
{
char elem[10]={'1','0','1','0','0','0','0','0','1','0'};//主密钥
char temp1[5];char temp2[5];//S1-L,S2-L
int exchange[10]={3,5,2,7,4,10,1,9,8,6};//p10置换数
int px[8]={6,3,7,4,8,5,10,9};//p8置换数
{
int c,b=y[k];
for(int j=7;j>=0;j--)
//将一个十进制数转换成一个8位的二进制数
{
c=b%2;
b=b/2;
z[j]=c;
}
for(int p=0;p<8;p++)
//将整型数组转换成字符数组
{
if(z[p]==0)
temp[p]='0';
else
temp[p]='1';
cout<<"\t\t|***********左自强*****************|"<<endl;
cout<<"\t\t|********** 09033335 ****************|"<<endl;
cout<<"\t\t|************************************|"<<endl;
{
elem[i]=x[y[i]-1];
}
for(int j=0;j<4;j++)
{
L2[j]=elem[j];
R2[j]=R1[j]=elem[j+4];
}
key(k1,k2);//获取子密钥K1,K2
F(R1,k2,c);//E/P扩展及置换
for(int k=0;k<4;k++)
{
if(L2[k]==c[k])
const int S1[4][4] = //S1 Box
{
{0, 1, 2, 3},
{2, 0, 1, 3},
{3, 2, 1, 0},
{2, 1, 0, 3}
};
void F(char *x,char *y,char *z)//F函数,x是R0或R1,y是k1或k2
{
int yy[8]={4,1,2,3,2,3,4,1};//E/P扩展码
{
num[q]=L0[q];
num[q+4]=R0[q];
}
for(int qp=0;qp<8;qp++)//IP置换
{
m[qp]=num[z[qp]-1];
}
}
void jinzhi(int x[],int n)
//该函数的作用是将8位的二进制转换为十进制,并显示其对应的字符
{
int kp=0;char q=' ';
}
DES(temp,elem);//加密运算
for(int q=0;q<8;q++)
//将字符数组转换成整型数组
{
if(elem[q]=='0')
num[q]=0;
else
num[q]=1;
}
jinzhi(num,8);//进制转换
}
}
void Sbase(char *x,int n)//S-DES解密的主程序
int c=(dd[0])*2+dd[3];//1,4作为行号
int d=(dd[1])*2+dd[2];//2,3作为列号
int ab=S0[a][b];
int cd=S1[c][d];
int csc[4];char data[4];
csc[0]=(ab/2)%2,csc[1]=ab%2,csc[2]=(cd/2)%2,csc[3]=cd%2;
cout<<"\t\t|********** S-DES加密解密系统*******|"<<endl;
cout<<"\t\t|************************************|"<<endl;
cout<<"\t\t|**********软件学院093班***********|"<<endl;
for(int k=0;k<4;k++)
{
temp1[k]=temp1[k+1];
temp2[k]=temp2[k+1];
}
temp1[4]=x;temp2[4]=y;
pp(xx,temp1,temp2);//合并
for(int s=0;s<8;s++)//p8置换
{
k1[s]=xx[(px[s]-1)];
}
for(int j=0;j<4;j++)//拆分数组
{
L0[j]=elem[j];
L1[j]=R0[j]=elem[j+4];
}
key(k1,k2);//获取子密钥K1,K2
F(R0,k1,c);//E/P扩展及置换
for(int k=0;k<4;k++)
//异或运算,相同为0,不相同为1
{
if(L0[k]==c[k])
{
int c,b=y[k];
for(int j=7;j>=0;j--)
//将一个十进制数转换成一个8位的二进制数
{
c=b%2;
b=b/2;
z[j]=c;
}
for(int p=0;p<8;p++)
//异或运算,相同为0,不相同为1
{
if(z[p]==0)
temp[p]='0';
else
temp[p]='1';
}
else
{
ss[m]=1;
}
}
for(int r=0;r<4;r++)//将字符数组转换成整型数组
{
if(bb[r]=='0')
{
dd[r]=0;
}
else
{
dd[r]=1;
}
}
int a=(ss[0])*2+ss[3];//1,4作为行号
int b=(ss[1])*2+ss[2];//2,3作为列号
}
char a=temp1[0],b=temp1[1];
char c=temp2[0],d=temp2[1];
for(int f=0;f<3;f++)//左移两位
{
temp1[f]=temp1[f+2];
temp2[f]=temp2[f+2];
}
temp1[3]=a,temp1[4]=b;
temp2[3]=c,temp2[4]=d;
{
num[q]=L2[q];
num[q+4]=R2[q];
}
for(int qp=0;qp<8;qp++)//IP~1置换运算
{
m[qp]=num[z[qp]-1];
}
}
void SDES(char *x,char *m)//DES解密
{
int y[8]={2,6,3,1,4,8,5,7};//IP置换码
R2[k]=R1[k]='0';
else
R2[k]=R1[k]='1';
}
F(R1,k2,d);//F函数运算
for(int p=0;p<4;p++)
//异或运算,相同为0,不相同为1
{
if(L1[p]==d[p])
L2[p]='0';
else
L2[p]='1';
}
for(int q=0;q<4;q++)//合并数组
int z[8]={4,1,3,5,7,2,8,6};//IP~1置换码
//解密使用的临时数组
char L0[4],R0[4],L1[4],R1[4],L2[4];
char R2[4],elem[8],num[8],c[4],d[4];
char k1[8];char k2[8];//子密钥
for(int i=0;i<8;i++)//IP~1置换
pp(xx,temp1,temp2);
for(int q=0;q<8;q++)//p8置换
{
k2[q]=xx[(px[q]-1)];
}
}
const int S0[4][4] = //S0 Box
{
{1, 0, 3, 2},
{3, 2, 1, 0},
{0, 2, 1, 3},
{3, 1, 0, 2}
};
{
if(xx[j]==y[j])
xx[j]='0';
else
xx[j]='1';
}
for(int k=0;k<4;k++)//合并数组
{
aa[k]=xx[k];
bb[k]=xx[k+4];
}
for(int m=0;m<4;m++)//将字符数组转换成整型数组
{
if(aa[m]=='0')
{
ss[m]=0;
char xx[10];//临时数组
for(int i=0;i<10;i++)
{
xx[i]=elem[(exchange[i]-1)];//p10置换
}
for(int j=0;j<5;j++)//拆分
{
temp1[j]=xx[j];
using namespace std;
void pp(char *num,char *x,char *y)//合并数组
{
for(int i=0;i<5;i++)
{
num[i]=x[i];
num[i+5]=y[i];
}
}
void key(char *k1,char *k2)//生成子密钥
int ss[4];
int dd[4];
int abc[4]={2,4,3,1};//P4置换码
char xx[8];char aa[4],bb[4];
for(int i=0;i<8;i++)//将整型数组转换成字符数组
{
xx[i]=x[(yy[i]-1)];
}
for(int j=0;j<8;j++)//将整型数组转换成字符数组
}
for(int sh=0;sh<4;sh++)//p4置换
{
z[sh]=data[abc[sh]-1];
}
}
void DES(char *x,char *m)//DES加密
{
int y[8]={2,6,3,1,4,8,5,7};//IP置换码
int z[8]={4,1,3,5,7,2,8,6};//IP~1置换码
{
int *y;int *z;int num[8];
y=new int[n];z=new int[n];
char temp[8];
char elem[8];
for(int i=0;i<n;i++)//将字符转换成ASCLL码,并存储在一个整型数组中
{
y[i]=x[i];
}
for(int k=0;k<n;k++)
for(int mp=0;mp<4;mp++)
/*将整型数组转换成字符数组,如果字符数组中的一个元素为
'0',则对应的整型数组中的位置元素为0,反之为1*/
{
if(csc[mp]==0)
data[mp]='0';
else if(csc[mp]==1)
data[]='1';
else
data[mp]=' ';
{
int *y;int *z;int num[8];
y=new int[n];z=new int[n];
char temp[8];
char elem[8];
for(int i=0;i<n;i++)//将字符转换成ASCLL码,并存储在一个整型数组中
{
y[i]=x[i];
}
for(int k=0;k<n;k++)
L1[k]=R0[k]='0';
else
L1[k]=R0[k]='1';
}
F(R0,k1,d);//F函数运算
for(int p=0;p<4;p++)
//异或运算,相同为0,不相同为1
{
if(R1[p]==d[p])
L0[p]='0';
else
L0[p]='1';
}
for(int q=0;q<4;q++)//合并数组
for(int j=n-1;j>=0;j--)
{
int tem=1;int sum=0;
for(int i=0;i<n-1-j;i++)//幂运算
{
tem=tem*2;
}
sum+=tem*x[j];
kp+=sum;
}
q=kp;//将ASCLL码转换成字符
cout<<q;
}
void base(char *x,int n)//S-DES加密的主程序
//加密使用的临时数组
char L0[4],R0[4],L1[4],R1[4];
char L2[4],R2[4],elem[8],num[8],c[4],d[4];
char k1[8];char k2[8];//子密钥
for(int i=0;i<8;i++)//IP置换
{
elem[i]=x[y[i]-1];
}
SDES(temp,elem);
for(int q=0;q<8;q++)//将字符数组转换成整型数组
{
if(elem[q]=='0')
num[q]=0;
else
num[q]=1;
}
jinzhi(num,8);
}
}
int main()
{
system("color 34");
cout<<"\n\t\t|************************************|"<<endl;
{
char elem[10]={'1','0','1','0','0','0','0','0','1','0'};//主密钥
char temp1[5];char temp2[5];//S1-L,S2-L
int exchange[10]={3,5,2,7,4,10,1,9,8,6};//p10置换数
int px[8]={6,3,7,4,8,5,10,9};//p8置换数
{
int c,b=y[k];
for(int j=7;j>=0;j--)
//将一个十进制数转换成一个8位的二进制数
{
c=b%2;
b=b/2;
z[j]=c;
}
for(int p=0;p<8;p++)
//将整型数组转换成字符数组
{
if(z[p]==0)
temp[p]='0';
else
temp[p]='1';
cout<<"\t\t|***********左自强*****************|"<<endl;
cout<<"\t\t|********** 09033335 ****************|"<<endl;
cout<<"\t\t|************************************|"<<endl;
{
elem[i]=x[y[i]-1];
}
for(int j=0;j<4;j++)
{
L2[j]=elem[j];
R2[j]=R1[j]=elem[j+4];
}
key(k1,k2);//获取子密钥K1,K2
F(R1,k2,c);//E/P扩展及置换
for(int k=0;k<4;k++)
{
if(L2[k]==c[k])
const int S1[4][4] = //S1 Box
{
{0, 1, 2, 3},
{2, 0, 1, 3},
{3, 2, 1, 0},
{2, 1, 0, 3}
};
void F(char *x,char *y,char *z)//F函数,x是R0或R1,y是k1或k2
{
int yy[8]={4,1,2,3,2,3,4,1};//E/P扩展码
{
num[q]=L0[q];
num[q+4]=R0[q];
}
for(int qp=0;qp<8;qp++)//IP置换
{
m[qp]=num[z[qp]-1];
}
}
void jinzhi(int x[],int n)
//该函数的作用是将8位的二进制转换为十进制,并显示其对应的字符
{
int kp=0;char q=' ';
}
DES(temp,elem);//加密运算
for(int q=0;q<8;q++)
//将字符数组转换成整型数组
{
if(elem[q]=='0')
num[q]=0;
else
num[q]=1;
}
jinzhi(num,8);//进制转换
}
}
void Sbase(char *x,int n)//S-DES解密的主程序
int c=(dd[0])*2+dd[3];//1,4作为行号
int d=(dd[1])*2+dd[2];//2,3作为列号
int ab=S0[a][b];
int cd=S1[c][d];
int csc[4];char data[4];
csc[0]=(ab/2)%2,csc[1]=ab%2,csc[2]=(cd/2)%2,csc[3]=cd%2;
cout<<"\t\t|********** S-DES加密解密系统*******|"<<endl;
cout<<"\t\t|************************************|"<<endl;
cout<<"\t\t|**********软件学院093班***********|"<<endl;
for(int k=0;k<4;k++)
{
temp1[k]=temp1[k+1];
temp2[k]=temp2[k+1];
}
temp1[4]=x;temp2[4]=y;
pp(xx,temp1,temp2);//合并
for(int s=0;s<8;s++)//p8置换
{
k1[s]=xx[(px[s]-1)];
}
for(int j=0;j<4;j++)//拆分数组
{
L0[j]=elem[j];
L1[j]=R0[j]=elem[j+4];
}
key(k1,k2);//获取子密钥K1,K2
F(R0,k1,c);//E/P扩展及置换
for(int k=0;k<4;k++)
//异或运算,相同为0,不相同为1
{
if(L0[k]==c[k])
{
int c,b=y[k];
for(int j=7;j>=0;j--)
//将一个十进制数转换成一个8位的二进制数
{
c=b%2;
b=b/2;
z[j]=c;
}
for(int p=0;p<8;p++)
//异或运算,相同为0,不相同为1
{
if(z[p]==0)
temp[p]='0';
else
temp[p]='1';
}
else
{
ss[m]=1;
}
}
for(int r=0;r<4;r++)//将字符数组转换成整型数组
{
if(bb[r]=='0')
{
dd[r]=0;
}
else
{
dd[r]=1;
}
}
int a=(ss[0])*2+ss[3];//1,4作为行号
int b=(ss[1])*2+ss[2];//2,3作为列号
}
char a=temp1[0],b=temp1[1];
char c=temp2[0],d=temp2[1];
for(int f=0;f<3;f++)//左移两位
{
temp1[f]=temp1[f+2];
temp2[f]=temp2[f+2];
}
temp1[3]=a,temp1[4]=b;
temp2[3]=c,temp2[4]=d;
{
num[q]=L2[q];
num[q+4]=R2[q];
}
for(int qp=0;qp<8;qp++)//IP~1置换运算
{
m[qp]=num[z[qp]-1];
}
}
void SDES(char *x,char *m)//DES解密
{
int y[8]={2,6,3,1,4,8,5,7};//IP置换码
R2[k]=R1[k]='0';
else
R2[k]=R1[k]='1';
}
F(R1,k2,d);//F函数运算
for(int p=0;p<4;p++)
//异或运算,相同为0,不相同为1
{
if(L1[p]==d[p])
L2[p]='0';
else
L2[p]='1';
}
for(int q=0;q<4;q++)//合并数组
int z[8]={4,1,3,5,7,2,8,6};//IP~1置换码
//解密使用的临时数组
char L0[4],R0[4],L1[4],R1[4],L2[4];
char R2[4],elem[8],num[8],c[4],d[4];
char k1[8];char k2[8];//子密钥
for(int i=0;i<8;i++)//IP~1置换
pp(xx,temp1,temp2);
for(int q=0;q<8;q++)//p8置换
{
k2[q]=xx[(px[q]-1)];
}
}
const int S0[4][4] = //S0 Box
{
{1, 0, 3, 2},
{3, 2, 1, 0},
{0, 2, 1, 3},
{3, 1, 0, 2}
};
{
if(xx[j]==y[j])
xx[j]='0';
else
xx[j]='1';
}
for(int k=0;k<4;k++)//合并数组
{
aa[k]=xx[k];
bb[k]=xx[k+4];
}
for(int m=0;m<4;m++)//将字符数组转换成整型数组
{
if(aa[m]=='0')
{
ss[m]=0;
char xx[10];//临时数组
for(int i=0;i<10;i++)
{
xx[i]=elem[(exchange[i]-1)];//p10置换
}
for(int j=0;j<5;j++)//拆分
{
temp1[j]=xx[j];