当前位置: 首页 > news >正文

【C语言】对称密码——栅栏的加密和解密

 栅栏密码的原理:

栅栏层数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;
}

http://www.lryc.cn/news/322594.html

相关文章:

  • 一、rv1126开发之视频输入和视频编码
  • 4.1 用源文件写汇编代码
  • Linux TCP参数——tcp_abort_on_overflow
  • jupyter notebook设置代码提示方法
  • Linux 一点查询资料
  • 如何快速搭建一个完整的vue2+element-ui的项目-二
  • 多语言LLM的状态:超越英语
  • kafka什么情况下会认为发送失败进而去重试
  • 不满足软件包要求‘transformers==4.30.2‘, ‘sse-starlette
  • C# 设置AutoScroll为true没效果的原因分析和解决办法
  • <Senior High School Math>: inequality question
  • 详解Python中Pytest和Unittest的区别
  • 零基础入门多媒体音频(1)-音频基础
  • 40 道高频 C++ 面试、笔试题及答案
  • 【07】进阶html5
  • Linux|centos7|postgresql数据库|yum和编译方式安装总结(全系版本)
  • C++提高笔记(五)---STL容器(set/multiset、map/multimap)
  • 详解main函数参数argc、argv及如何传参
  • 解释什么是Web组件化开发及其优势
  • 那些场景需要额外注意线程安全问题
  • (C语言)球球大作战
  • 高级数据结构 <AVL树>
  • 在springboot中利用Redis实现延迟队列
  • UpGrow评论:AI能将我的Instagram粉丝数增加10倍吗?
  • 申请软著提交的演示视频有什么要求
  • mac【启动elasticsearch报错:can not run elasticsearch as root
  • 面试算法-65-二叉树的层平均值
  • Linux: boot: latency启动延迟分析
  • QT界面制作
  • 进阶二叉树