栅栏密码的原理:
栅栏层数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、 密文:
将下面一行字母排在上面一行的后边。
扫描二维码关注公众号,回复:
17590903 查看本文章

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;
}