作业1.3

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
 
// 打印 
void display(char *num)
{
	puts(num); 
	printf("\n");
}
 
// 加密 
char *encrypt(char *str,int a[4][4],int b[4][1])
{
	int i,j,m[4][1],count=0,t,len=strlen(str);
	char* M = (char*)malloc(100);
	for(t=0;count<len;)
	{ 
		int c[4][1]={0};
		for(i=0;i<4;i++)    // 分组,每组四个字母	 
		{
			m[i][0]=str[count]-65;// 将字母转换成数字 
			count++;
	    }
		for(i=0;i<4;i++)
		{
			for(j=0;j<4;j++)
			{
				c[i][0]=c[i][0]+a[i][j]*m[j][0];
			}
			c[i][0]=(c[i][0]+b[i][0])%26;
			M[t++]=c[i][0]+65; // 将数字转换成字母 
		}
	}
	M[t]='\0'; 
	printf("加密成功!\n");
	printf("加密的密文为:");
	display(M);
	return M;
}
 
// 解密
void decrypt(char *str,int a[4][4],int b[4][1])
{
	int i,j,m[4][1],count=0,t,len=strlen(str);
	char C[100]; // 明文 C 
	for(t=0;count<len;)
	{ 
		int c[4][1]={0};
		for(i=0;i<4;i++)    // 分组,每组四个字母	 
		{
			m[i][0]=str[count]-65;// 将字母转换成数字 
			count++;
	    }
		for(i=0;i<4;i++)
		{ 
			for(j=0;j<4;j++)
			{
				c[i][0]=c[i][0]+a[i][j]*(((m[j][0]-b[j][0])+26)%26);
			}
			c[i][0]=c[i][0]%26;
			C[t++]=c[i][0]+65; // 将数字转换成字母 
		}
	}
	C[t]='\0'; 
	printf("解密成功!\n");
	printf("解密的明文为:");
	display(C);
}
 
int main()
{
	int a[4][4]={{3,13,21,9},   // 秘钥 A 
				 {15,10,6,25},  
	             {10,17,4,8},
				 {1,23,7,2}},
		b[4][1]={{1},{21},{8},{17}}; // 秘钥 B 
	int a_inverse[4][4]={{23,13,20,5},   // 秘钥 A 的逆矩阵 
				 		 {0,10,11,0},
	             		 {9,11,15,22},
				 		 {9,22,6,25}};
	char *str="PLEASESENDMETHEBOOKMYCREDITCARDNOISSIXDNETWOONETHREEEIGHTSIXZEROONESIXEIGHTFOURNINESEVENZEROTWOA",*p=0; // 最后一组不足4位,补 0即 A 
	printf("明文为:%s\n",str);
	printf("\n");
	p = encrypt(str,a,b);
	decrypt(p,a_inverse,b);
	printf("结束!\n");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值