置换加密算法

  1 #include "stdio.h"
  2 #include "stdlib.h"
  3 #define column 3
  4 typedef char DataType;
  5 
  6 
  7 /************************************************************************/
  8 /* 置换加密算法。
  9 content为需要加密的内容,index为置换的密匙                                                                     */
 10 /************************************************************************/
 11 char * secertIn(DataType * content, int * index)
 12 {    
 13     int getLength(DataType *);
 14     char * returnChar = NULL,**putIn = NULL;
 15     int count = 0,getIndex = 0,i = 0,j = 0,length = 0,row = 0; //将内容分割后的行数
 16     length = getLength(content);
 17     // printf("明文内容长度: %d\n", length);
 18     //计算切割内容后的行数
 19     row = length / column;
 20     i = length % column;
 21     if(i > 0)
 22         row = row + 1;
 23     // printf("明文行数为:%d\n", row);
 24 
 25     //分配二维数组存放切割后的内容
 26     putIn = (char **) malloc(sizeof(char *) * row);
 27     for(i = 0; i < row; i++)
 28     {
 29         putIn[i] = (char * )malloc(sizeof(char) * column);
 30     }
 31 
 32     returnChar = (char *) malloc(sizeof(char) * row * column + 1);
 33     
 34     //将需要加密的内容存放进二维数组里
 35     for(i = 0; i < row; i++)
 36     {
 37         for(j = 0; j < column; j++)
 38         {
 39             if(i * column + j < length)
 40                 putIn[i][j] = content[i * column + j];
 41             else
 42                 putIn[i][j] = ' ';
 43         }
 44     }
 45     
 46     //对内容进行加密
 47     for(i = 0; i <column; i++)
 48     {
 49         getIndex = index[i];
 50         for(j = 0; j < row; j++)
 51         {
 52             returnChar[count] = putIn[j][getIndex];
 53             count++;
 54         }
 55     }
 56     returnChar[count] = '\0';
 57     
 58     return returnChar;
 59 }
 60 
 61 /************************************************************************/
 62 /* 置换加密算法的解密方法
 63 content为需要解密密的内容,index为置换的密匙                                                                     */
 64 /************************************************************************/
 65 char * secretOut(DataType * content, int * index)
 66 {
 67     int getLength(DataType *);
 68     char * returnChar = NULL,**putIn = NULL,**buffer =NULL;
 69     int count = 0,getIndex = 0,i = 0,j = 0,length = 0,row = 0; //将内容分割后的行数
 70     length = getLength(content);
 71     // printf("密文内容长度: %d\n", length);
 72     //计算切割内容后的行数
 73     row = length / column;
 74     i = length % column;
 75     if(i > 0)
 76         row = row + 1;
 77     // printf("密文文行数为:%d\n", row);
 78 
 79     //分配二维数组存放切割后的内容
 80     putIn = (char **) malloc(sizeof(char *) * row);
 81     for(i = 0; i < row; i++)
 82     {
 83         putIn[i] = (char * )malloc(sizeof(char) * column);
 84     }
 85     
 86     returnChar = (char *) malloc(sizeof(char) * row * column + 1);
 87 
 88     //分配二维数组空间,用来存放解密后的内容
 89     buffer = (char **) malloc(sizeof(char *) * row);
 90     for(i = 0; i < row; i++)
 91     {
 92         buffer[i] = (char * )malloc(sizeof(char) * column);
 93     }
 94     
 95     //将需要解密的内容存放进二维数组里
 96     for(i = 0; i < row; i++)
 97     {
 98         for(j = 0; j < column; j++)
 99         {
100             if(i * column + j < length)
101                 putIn[i][j] = content[i * column + j];
102             else
103                 putIn[i][j] = ' ';
104         }
105     }
106 
107     //将加密的内容按照密匙对行重新排列
108     for(i = 0; i < row; i++)
109     {
110         getIndex = index[i];
111         buffer[getIndex] = putIn[i];
112     }
113     for(i = 0; i < column; i++)
114     {
115         for(j = 0; j < row; j++)
116         {
117             returnChar[count] = buffer[j][i];
118             count++;
119         }
120     }
121     
122     returnChar[count] = '\0';
123 
124     return returnChar;
125 }
126 
127 
128 /************************************************************************/
129 /* 计算数组长度                                                                     */
130 /************************************************************************/
131 int getLength(DataType * content)
132 {
133     int count = 0;
134     while(*content != '\0')
135     {
136         content++;
137         count++;
138     }
139     return count;
140 }
141 
142 int main()
143 {
144 
145     char *a = "abcdefghi"; //明文
146     char *get;
147     int index[] = {2,1,0}; //密匙,长度和列数相同
148     
149     printf("明文:%s\n", a);
150     get = secertIn(a, index); //加密
151     printf("密文 :%s\n", get);
152     get = secretOut(get, index); //将上面加密后的密文进行解密
153     printf("解密后的得到明文: %s\n\n", get);
154     
155 }
一颗平常心,踏踏实实,平静对待一切
原文地址:https://www.cnblogs.com/hanyuan/p/2695813.html