资源简介

压缩包内有一个C语言代码,实现密码算法的加密解密,还有两个文本文档,是代码实现过程中的输入与输出文档。多表代换与Hill2密码算法类似,这里是3阶的,基于C语言实现 密钥矩阵随机生成、加密、解密

资源截图

代码片段和文件信息

#include
#include
#include
#include
#include
#define M 3   //定义一下三阶矩阵
int gcd(int a int b){
return b==0?a : gcd(b a%b);
}

int main()
{
   FILE *fp;
   FILE *fp1;
   int ijdetinvdetlenflaglen1=0;
   int A[M][M]={0}comA[M][M]={0}invA[M][M]={0}B[M]={0}tran1[10000]={0}T1[3]={0}cip[3]={0}s[10000]={0};
   int msg[3]={0}mes[10000]={0}x[3]={0};
   int T2[3]={0}tran2[10000]={0};
   char pla[10000]={‘\0‘}; //明文
   char ciph[10000]={‘\0‘}; //密文
   char plas[10000]={‘\0‘}; //对密文解密后的明文
   
   //产生满足条件的随机三阶矩阵A
   srand(time(0));
   do{
      for(i=0;i        for(j=0;j            A[i][j]=rand()%26; 

  }
  det = -1;
      for(i=1; det < 0; i++)
        {
            det = ((A[0][0]*A[1][1]*A[2][2]+A[1][0]*A[2][1]*A[0][2]+A[0][1]*A[1][2]*A[2][0]-A[0][2]*A[1][1]*A[2][0]-A[0][0]*A[1][2]*A[2][1]-A[0][1]*A[1][0]*A[2][2]) + 26 * i)%26; //行列式的表达式
        }
  
   }while(gcd(det26)!=1||det==0);   //行列式必须不等于0并且与26互素

   printf(“Encryption matrix A: \n“);
   for(i=0;i<3;i++){
        for(j=0;j<3;j++){
            printf(“%d “A[i][j]); 
        } 
        printf(“\n“); 
    } //输出生成的A矩阵

   i = 1;
   while(1)
        {
            if((det * i) % 26 == 1)
            {
                invdet = i;
                break;
            }
            else
            {
                i++;
            }
   } //求三阶矩阵A的行列式的逆元为invdet
   

    //以下为求A的伴随矩阵
comA[0][0] = (A[1][1] * A[2][2] - A[2][1] * A[1][2]);
comA[1][0] = -(A[1][0] * A[2][2] - A[1][2] * A[2][0]);
comA[2][0] = (A[1][0] * A[2][1] - A[1][1] * A[2][0]);
comA[0][1] = -(A[0][1] * A[2][2] - A[0][2] * A[2][1]);
comA[1][1] = (A[0][0] * A[2][2] - A[0][2] * A[2][0]);
comA[2][1] = -(A[0][0] * A[2][1] - A[0][1] * A[2][0]);
    comA[0][2] = (A[0][1] * A[1][2] - A[0][2] * A[1][1]);
comA[1][2] = -(A[0][0] * A[1][2] - A[0][2] *A[1][0]);
comA[2][2] = (A[0][0] * A[1][1] - A[0][1] * A[1][0]);
    //以下求A的逆矩阵
    for (i = 0; i < 3; i++){
for (j = 0; j < 3; j++){
invA[i][j]=invdet*comA[i][j];  
invA[i][j] %= 26;
if (invA[i][j] < 0) invA[i][j] += 26;
}
}

//以下生成B矩阵
do{
        for (i = 0; i < 3; i++)
{
            B[i]=rand()%25;
}
}while(B[1]==0&&B[2]==0&&B[0]==0);
     printf(“In this experimentwe use Key B as follows:\n“);
     printf(“%d %d %d\n“B[0]B[1]B[2]);

   fp = fopen(“plain.txt“ “r“); //  r打开只读文件,该文件必须存在plain文件中存放着需要进行加密的字符
   i=0;
   while(!feof(fp))  //将文件中的字符一个一个读入到char型的pla数组中
{
       pla[i]=fgetc(fp);
   i++;
}  
len=strlen(pla)-1;   //使用这样方式读写数组最后一个会多出一个空格,我们在操作中需要丢弃这个空格,所以strlen(pla)-1才是实际的长度

    if(len % 3 == 2)   //填充
 {
            pla[len] = ‘a‘;
            len = len+1;
            flag = 1;
     }
    if(len % 3 == 1)   //填充
 {
            pla[len] = ‘a‘;
            len = len+1;
            pla[len] = ‘a‘;
            len = len+1;
            flag = 2;
     }


//加密

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        6689  2018-11-17 10:19  多表代换 加密解密 C语言\MulTabCip.c
     文件          12  2018-12-23 12:31  多表代换 加密解密 C语言\output.txt
     文件          12  2018-11-20 19:59  多表代换 加密解密 C语言\plain.txt
     目录           0  2018-12-23 12:31  多表代换 加密解密 C语言\

评论

共有 条评论