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 }