#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;
}
作业1.3
于 2024-09-25 21:21:57 首次发布