长春专业企业网站建设工作室,wordpress手机客户端源码,网站体验分享,做gif表情包网站栅栏密码的原理#xff1a;
栅栏层数n
①把将要传递的信息中的字母交替排成上下n行。
②再将下面每一行字母排依次在上面一行的后边#xff0c;从而形成一段密码。
③例如#xff1a;栅栏层数为2
明文#xff1a;THE LONGEST DAY MUST HAVE AN END
加密#xff1a; … 栅栏密码的原理
栅栏层数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;
}