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

📄 modes.c

📁 1. 分析ECB模式和CBC模式的加密过程。 2. 用程序设计语言将算法过程编程实现。 3. 输入明文:I do like this book 加密算法E:异或⊕
💻 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 + -