大家好,欢迎来到IT知识分享网。
栅栏密码的原理:
栅栏层数n
①把将要传递的信息中的字母交替排成上下n行。
②再将下面每一行字母排依次在上面一行的后边,从而形成一段密码。
③例如:栅栏层数为2
明文:THE LONGEST DAY MUST HAVE AN END
加密:
1、把将要传递的信息中的字母交替排成上下两行。
T E O G S D Y U T A E N N
H L N E T A M S H V A E D
2、 密文:
将下面一行字母排在上面一行的后边。
TEOGSDYUTAENN HLNETAMSHVAED
解密:
先将密文分为两行
T E O G S D Y U T A E N N
H L N E T A M S H V A E D
再按上下上下的顺序组合成一句话
明文:THE LONGEST DAY MUST HAVE AN END
代码实现
根据上面的原理,显然我们可以用二维数组来解决加密解密的问题。
#include <stdio.h> #include <string.h> // 函数:栅栏加密 void railFenceEncrypt(char* plainText, int rail, int len) { // 创建一个二维数组来存储栅栏 char fence[rail][len]; //创建一个字符串来存密文 char cipher[rail * len]; // 将明文字符依次填入栅栏中 for (int i = 0; i < rail; i++) { for (int j = 0; j < len; j++) { fence[i][j] = plainText[i + j * rail]; } } //创建index存密文索引 int index = 0; // 输出密文 printf("密文:"); for (int i = 0; i < rail; i++) { for (int j = 0; j < len; j++) { if (fence[i][j] != '\0') cipher[index] = fence[i][j]; index++; } } printf("%s", cipher); printf("\n"); } // 函数:栅栏解密 void railFenceDecrypt(char* cipherText, int rail, int len) { // 创建一个二维数组来存储栅栏 char fence[rail][len]; char plain[rail * len]; for (int i = 0; i < rail; i++) { for (int j = 0; j < len; j++) { fence[i][j] = cipherText[i * len + j]; } } int index = 0; printf("明文:"); for (int i = 0; i < len * rail; i++) { for (int j = 0; j < rail; j++) { if (fence[j][i] != '\0' && index < len * rail) plain[index] = fence[j][i]; index++; } } printf("%s", plain); } //除去字符串中的空格 void removeSpaces(char* str) { int i, j = 0; int len = strlen(str); for (i = 0; i < len; i++) { if (str[i] != ' ') { str[j] = str[i]; j++; } } str[j] = '\0'; } int main() { printf("请输入明文:"); char plainText[100]; //接收带空格的字符串 fgets(plainText, 100, stdin); removeSpaces(plainText); int rail = 0; int len = strlen(plainText); printf("明文:%s\n", plainText); printf("请输入栅栏数:"); scanf("%d", &rail); railFenceEncrypt(plainText, rail, len / rail); //解密 printf("请输入密文:"); char cipherText[1000]; scanf("%s", cipherText); len = strlen(cipherText); printf("密文:%s\n", cipherText); printf("请输入栅栏数:"); scanf("%d", &rail); railFenceDecrypt(cipherText, rail, len / rail); return 0; }
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/116916.html