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

📄 矩阵变换密码之c语言实现.txt

📁 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 + -