📄 矩阵变换密码之c语言实现.txt
字号:
矩阵变换密码之C语言实现[原创]
构造一个置换矩阵A(每行每列都只有一个元素为1,其他均为0),设明文为x,则把明文分组以后,乘以置换矩阵,即得密文c。其实就是把明文乱序重排。解密时,用密文分组c与置换矩阵A的逆矩阵相乘即可。根据矩阵论知识,对于置换矩阵,有A-1=AT。
代码如下,简单模拟:
#define N 80
#define K 5
#i nclude <conio.h>
void jiajiemi(char source[],int core[K][K],char result[])
{
int i,j,m;
for(i=0;source[i];i+=K)
{
for(m=0;m<K;m++)
{
int temp=0;
for(j=i;j<i+K;j++)
temp+=source[j]*core[j-i][m];
result[m+i]=temp;
}
}
result[i]=0;
}
int validate(int core[])
{
int i,j;
for(i=0;i<K-1;i++)
for(j=i+1;j<K;j++)
if(core[j]==core[i])
return -1;
return 1;
}
void expand(char source[])
{
int i,j;
j=strlen(source);
if(j%K==0)
return;
else
{
for(i=0;i<K-j%K;i++)
source[j+i]='x';
source[j+i]=0;
}
}
void keyinput(int key[])
{
int i;
for(i=0;i<K;i++)
scanf("%d",key+i);
}
void corecreate(int key[],int core[K][K],int coreT[K][K])
{
int i,j;
for(i=0;i<K;i++)
for(j=0;j<K;j++)
{
core[i][j]=0;
coreT[i][j]=0;
}
for(i=0;i<K;i++)
{
j=key[i]-1;
core[i][j]=1;
coreT[j][i]=1;
}
}
void main()
{
char source[N],result[N],mid[N];
int key[K],core[K][K],coreT[K][K];
int srclen;
printf("\nPlease input the mingwen:\n");
gets(source);
srclen=strlen(source);
expand(source);
printf("\nPlease input %d key:\n",K);
keyinput(key);
while(validate(key)!=1)
{
printf("Key error.Please input again:\n");
keyinput(key);
}
corecreate(key,core,coreT);
jiajiemi(source,coreT,result);
jiajiemi(result,core,mid);
source[srclen]=mid[srclen]=0;
printf("\nYou have input the mingwen:\n%s\n",source);
printf("\nThe result is:\n%s\n",result);
printf("\nThe restored string is:\n%s\n",mid);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -