📄 modes.c
字号:
# include "stdio.h"
# include "string.h"
# include "conio.h"
# include "stdlib.h"
char S[50][10];
static char c[2][10];
int length;
/*分组模块*/
void fenzu(char *P)
{
int i,j;
for(i=0;;i++)
{
for(j=0;j<8&&P[8*i+j]!='\0';j++)
S[i][j]=P[8*i+j];
S[i][j]='\0';
if(P[8*i+j]=='\0')
break;
}
S[i][9]=EOF;
}
/*查找最后一个分组的组号*/
int searchlast()
{
int i=0;
while(S[i][9]!=EOF)
i++;
return i;
}
//显示明文的内容
void display1()
{
int i,j;
printf("明文为:");
for(i=0;i<searchlast();i++)
for(j=0;j<8;j++)
printf("%C",S[i][j]);
for(j=0;S[i][j]!='\0';j++)
printf("%C",S[i][j]);
putchar('\n');
}
//显示填充后密文的内容
void display2()
{
int i,j;
printf("密文为:");
for(i=0;i<=searchlast();i++)
for(j=0;j<8;j++)
if(S[i][j]<=0xf)
printf("0%X",S[i][j]);
else
printf("%X",S[i][j]);
putchar('\n');
}
/*显示密文挪用中加密后的内容*/
void display3()
{
int i,j;
printf("密文为:");
for(i=0;i<searchlast();i++)
for(j=0;j<8;j++)
if(S[i][j]<=0xf)
printf("0%X",S[i][j]);
else
printf("%X",S[i][j]);
for(j=0;j<length%8;j++)
if(S[i][j]<=0xf)
printf("0%X",S[i][j]);
else
printf("%X",S[i][j]);
putchar('\n');
}
//显示最后两个分组的内容
void displaylasttwo()
{
int i,j;
printf("最后两个分组的内容:");
for(i=searchlast()-1;i<=searchlast();i++)
{
printf("[");
for(j=0;j<8;j++)
if(S[i][j]<=0xf)
printf("0%X",S[i][j]);
else
printf("%X",S[i][j]);
printf("]");
}
putchar('\n');
}
/*ECB异或加解密模块*/
void yihuommECB(int a,int b,char *mima)
{
int i=0,j=0;
for(i=a;i<=b;i++)
for(j=0;j<8;j++)
{
S[i][j]=S[i][j]^mima[j%strlen(mima)];
}
}
/*ECB移位加密*/
void yiweijiamiECB(int a,int b,int n)
{
int i,j;
for(i=a;i<=b;i++)
for(j=0;j<8;j++)
{
S[i][j]=(S[i][j]+n%128)%128;
}
}
/*ECB移位解密*/
void yiweijiemiECB(int a,int b,int n)
{
int i,j;
for(i=a;i<=b;i++)
for(j=0;j<8;j++)
{
if(S[i][j]-n%128<0)
S[i][j]=128+S[i][j]-n%128;
else
S[i][j]=S[i][j]-n%128;
}
}
/*CBC异或加密*/
void yihuojiamiCBC(int a,int b,char *mima)
{
int i,j;
char IV[9]="goodluck";
for(i=a;i<=b;i++)
for(j=0;j<8;j++)
{
if(i==0)
S[i][j]=S[i][j]^IV[j];
else
S[i][j]=S[i][j]^S[i-1][j];
S[i][j]=S[i][j]^mima[j%strlen(mima)];
}
}
/*CBC异或解密*/
void yihuojiemiCBC(int a,int b,char *mima)
{
int i,j;
char IV[9]="goodluck",ls[2][10];
for(i=a;i<=b;i++)
{
for(j=0;j<8;j++)
ls[i%2][j]=S[i][j];
ls[i%2][j]='\0';
for(j=0;j<8;j++)
{
S[i][j]=S[i][j]^mima[j%strlen(mima)];
if(i==0)
S[i][j]=S[i][j]^IV[j];
else
S[i][j]=S[i][j]^ls[(i+1)%2][j];
}
}
}
/*CBC密文挪用下的异或解密*/
void nuoyongyihuojiemiCBC(int a,int b,char *mima)
{
int i,j,count;
char IV[9]="goodluck",ls[2][10];
for(i=a;i<=b;i++)
{
for(j=0;j<8;j++)
ls[i%2][j]=S[i][j];
ls[i%2][j]='\0';
for(j=0;j<8;j++)
{
S[i][j]=S[i][j]^mima[j%strlen(mima)];
if(i==0)
S[i][j]=S[i][j]^IV[j];
else
if(i==searchlast())
{
for(count=length%8+1;count<8;count++)
ls[(i+1)%2][count]=0;
ls[(i+1)%2][8]='\0';
S[i][j]=S[i][j]^ls[(i+1)%2][j];
}
else
S[i][j]=S[i][j]^ls[(i+1)%2][j];
}
}
}
/*CBC移位加密*/
void yiweijiamiCBC(int a,int b,int n)
{
int i,j;
char IV[9]="goodluck";
for(i=a;i<=b;i++)
for(j=0;j<8;j++)
{
if(i==0)
S[i][j]=S[i][j]^IV[j];
else
S[i][j]=S[i][j]^S[i-1][j];
S[i][j]=(S[i][j]+n%128)%128;
}
}
/*CBC移位解密*/
void yiweijiemiCBC(int a,int b,int n)
{
int i,j;
char IV[9]="goodluck",ls[2][10];
for(i=a;i<=b;i++)
{
for(j=0;j<8;j++)
ls[i%2][j]=S[i][j];
ls[i%2][j]='\0';
for(j=0;j<8;j++)
{
if(S[i][j]-n%128<0)
S[i][j]=128+S[i][j]-n%128;
else
S[i][j]=S[i][j]-n%128;
if(i==0)
S[i][j]=S[i][j]^IV[j];
else
S[i][j]=S[i][j]^ls[(i+1)%2][j];
}
}
}
/*CBC密文挪用下的移位解密*/
void nuoyongyiweijiemiCBC(int a,int b,int n)
{
int i,j,count;
char IV[9]="goodluck",ls[2][10];
for(i=a;i<=b;i++)
{
for(j=0;j<8;j++)
ls[i%2][j]=S[i][j];
ls[i%2][j]='\0';
for(j=0;j<8;j++)
{
if((S[i][j]-n%128)<0)
S[i][j]=(128+S[i][j]-n)%128;
else
S[i][j]=S[i][j]-n%128;
if(i==0)
S[i][j]=S[i][j]^IV[j];
else
if(i==searchlast())
{
for(count=length%8+1;count<8;count++)
ls[(i+1)%2][count]=0;
ls[(i+1)%2][8]='\0';
S[i][j]=S[i][j]^ls[(i+1)%2][j];
}
else
S[i][j]=S[i][j]^ls[(i+1)%2][j];
}
}
}
/*ECB'0'填充模块*/
void tianchongECB()
{
int i,j=0,count;
i=searchlast();
for(j=0;;j++)
{
if(j<=7&&S[i][j]=='\0')
{
for(count=j;count<7;count++)
S[i][count]='0';
S[i][7]=56-j;
S[i][8]='\0';
S[i][9]=EOF;
break;
}
if(j==8)
{
strcpy(S[i+1],"00000008");
S[i][9]=0;
S[i+1][9]=EOF;
break;
}
}
}
/*CBC密文挪用填充模块*/
void tianchongCBC()
{
int i,j=0,count;
i=searchlast();
if(length%8!=0)
{
for(count=length%8;count<8;count++)
S[i][count]=S[i][count]^S[i][count];
S[i][8]='\0';
S[i][9]=EOF;
}
else
{
for(count=0;count<7;count++)
S[i+1][count]=S[i+1][count]^S[i+1][count];
S[i+1][8]='\0';
S[i][9]=0;
S[i+1][9]=EOF;
}
}
/*去'0'模块*/
void qu0()
{
int i;
i=searchlast();
if(S[i][7]<='7'||S[i][7]>='0')
S[i][56-S[i][7]]='\0';
if(S[i][7]=='8')
S[i][9]=EOF;
}
/*ECB模式中的密文挪用*/
void miwennuoyongECB()
{
int i,j=0;
if(length%8==0)
return;
for(i=0;i<length%8;i++)
c[1][j++]=S[searchlast()-1][i];
c[1][j]='\0';
j=0;
for(i=length%8;i<8;i++)
c[0][j++]=S[searchlast()-1][i];
c[0][j]='\0';
strcat(S[searchlast()],c[0]);
}
/*在ECB密文挪用中交换最后两个分组*/
void jiaohuanECB()
{
int i,j;
j=searchlast();
for(i=0;i<8;i++)
S[j-1][i]=S[j][i];
for(i=0;i<8;i++)
S[j][i]=c[1][i];
}
/*在CBC密文挪用中交换最后两个分组*/
void jiaohuanCBC()
{
char temp[10];
int i,j;
j=searchlast();
for(i=0;i<8;i++)
temp[i]=S[j-1][i];
for(i=0;i<8;i++)
S[j-1][i]=S[j][i];
for(i=0;i<8;i++)
S[j][i]=temp[i];
}
/*主函数*/
void main()
{
char ch,M[100],mima[10];
int i=0,n;
while(1)
{
system("cls");
i=0;
printf("请输入明文:");
fflush(stdin);
while((ch=getchar())!='\n')
{
M[i++]=ch;
M[i]='\0';
}
if(ch==27)
exit(0);
length=strlen(M);
fenzu(M);
while(1)
{
printf("请选择加密模式->1.ECB模式;2.CBC模式;0.退出:");
fflush(stdin);
ch=getchar();
if(ch=='0'||ch=='1'||ch=='2')
break;
}
if(ch=='0')
break;
if(ch=='1')
{
while(1)
{
printf("请输入填充模式->:1.'0'填充模式;2.密文挪用;0.退出:");
fflush(stdin);
ch=getchar();
if(ch=='0'||ch=='1'||ch=='2')
break;
}
if(ch=='0')
break;
if(ch=='1')
{
tianchongECB();
while(1)
{
printf("请输入加密算法->:1.异或加密;2.移位加密;0.退出:");
fflush(stdin);
ch=getchar();
if(ch=='0'||ch=='1'||ch=='2')
break;
}
if(ch=='0')
break;
if(ch=='1')
{
printf("请输入密码:");
fflush(stdin);
gets(mima);
display1();
yihuommECB(0,searchlast(),mima);
display2();
printf("请输入密码:");
fflush(stdin);
gets(mima);
yihuommECB(0,searchlast(),mima);
display1();
qu0();
display1();
printf("\n按Q键再来一次!\n");//getch();continue;
while(getch()!='q'&&getch()!='Q')
{
getch();continue;
}
}
if(ch=='2')
{
printf("请输入密码:");
scanf("%d",&n);
display1();
yiweijiamiECB(0,searchlast(),n);
display2();
printf("请输入密码:");
scanf("%d",&n);
yiweijiemiECB(0,searchlast(),n);
display1();
qu0();
display1();
printf("\n按Q键再来一次!\n");//getch();continue;
while(getch()!='q'&&getch()!='Q')
{
getch();continue;
}
}
}
if(ch=='2')
{
while(1)
{
printf("请输入加密算法->:1.异或加密;2.移位加密;0.退出:");
fflush(stdin);
ch=getchar();
if(ch=='0'||ch=='1'||ch=='2')
break;
}
if(ch=='0')
break;
if(ch=='1')
{
printf("请输入密码:");
fflush(stdin);
gets(mima);
display1();
yihuommECB(0,searchlast()-1,mima);
displaylasttwo();
miwennuoyongECB();
printf("密文挪用后...\n");
displaylasttwo();
yihuommECB(searchlast(),searchlast(),mima);
jiaohuanECB();
display3();
printf("请输入密码:");
fflush(stdin);
gets(mima);
yihuommECB(0,searchlast()-1,mima);
displaylasttwo();
miwennuoyongECB();
printf("密文挪用后...\n");
displaylasttwo();
yihuommECB(searchlast(),searchlast(),mima);
jiaohuanECB();
display1();
printf("\n按Q键再来一次!\n");//
//getch();continue;
while(getch()!='q'&&getch()!='Q')
{
getch();continue;
}
}
if(ch=='2')
{
printf("请输入密码:");
scanf("%d",&n);
display1();
yiweijiamiECB(0,searchlast()-1,n);
displaylasttwo();
miwennuoyongECB();
printf("密文挪用后...\n");
displaylasttwo();
yiweijiamiECB(searchlast(),searchlast(),n);
jiaohuanECB();
display3();
printf("请输入密码:");
scanf("%d",&n);
yiweijiemiECB(0,searchlast()-1,n);
displaylasttwo();
miwennuoyongECB();
printf("密文挪用后...\n");
displaylasttwo();
yiweijiemiECB(searchlast(),searchlast(),n);
jiaohuanECB();
display1();
printf("\n按Q键再来一次!\n");//
while(getch()!='q'&&getch()!='Q')
{
getch();continue;
}
}
}
}
if(ch=='2')
{
while(1)
{
printf("请输入填充模式->:1.'0'填充模式;2.密文挪用;0.退出:");
fflush(stdin);
ch=getchar();
if(ch=='0'||ch=='1'||ch=='2')
break;
}
if(ch=='0')
break;
if(ch=='1')
{
tianchongECB();
while(1)
{
printf("请输入加密算法->:1.异或加密;2.移位加密;0.退出:");
fflush(stdin);
ch=getchar();
if(ch=='0'||ch=='1'||ch=='2')
break;
}
if(ch=='0')
break;
if(ch=='1')
{
printf("请输入密码:");
fflush(stdin);
gets(mima);
display1();
yihuojiamiCBC(0,searchlast(),mima);
display2();
printf("请输入密码:");
fflush(stdin);
gets(mima);
yihuojiemiCBC(0,searchlast(),mima);
display1();
qu0();
display1();
printf("\n按Q键再来一次!\n");//getch();continue;
while(getch()!='q'&&getch()!='Q')
{
getch();continue;
}
}
if(ch=='2')
{
printf("请输入密码:");
scanf("%d",&n);
display1();
yiweijiamiCBC(0,searchlast(),n);
display2();
printf("请输入密码:");
scanf("%d",&n);
yiweijiemiCBC(0,searchlast(),n);
display1();
qu0();
display1();
printf("\n按Q键再来一次!\n");//getch();continue;
while(getch()!='q'&&getch()!='Q')
{
getch();continue;
}
}
}
if(ch=='2')
{
tianchongCBC();
while(1)
{
printf("请输入加密算法->:1.异或加密;2.移位加密;0.退出:");
fflush(stdin);
ch=getchar();
if(ch=='0'||ch=='1'||ch=='2')
break;
}
if(ch=='0')
break;
if(ch=='1')
{
printf("请输入密码:");
fflush(stdin);
gets(mima);
display1();
yihuojiamiCBC(0,searchlast(),mima);
jiaohuanCBC();
display3();
jiaohuanCBC();
printf("请输入密码:");
fflush(stdin);
gets(mima);
nuoyongyihuojiemiCBC(0,searchlast(),mima);
display1();
printf("\n按Q键再来一次!\n");//getch();continue;
while(getch()!='q'&&getch()!='Q')
{
getch();continue;
}
}
if(ch=='2')
{
printf("请输入密码:");
scanf("%d",&n);
display1();
yiweijiamiCBC(0,searchlast(),n);
jiaohuanCBC();
display3();
jiaohuanCBC();
printf("请输入密码:");
scanf("%d",&n);
nuoyongyiweijiemiCBC(0,searchlast(),n);
display1();
printf("\n按Q键再来一次!\n");//getch();continue;
while(getch()!='q'&&getch()!='Q')
{
getch();continue;
}
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -