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

2024-03-21 23:44

本文主要是介绍【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;
}

这篇关于【C语言】对称密码——栅栏的加密和解密的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/834115

相关文章

Oracle登录时忘记用户名或密码该如何解决

《Oracle登录时忘记用户名或密码该如何解决》:本文主要介绍如何在Oracle12c中忘记用户名和密码时找回或重置用户账户信息,文中通过代码介绍的非常详细,对同样遇到这个问题的同学具有一定的参... 目录一、忘记账户:二、忘记密码:三、详细情况情况 1:1.1. 登录到数据库1.2. 查看当前用户信息1.

基于Python实现多语言朗读与单词选择测验

《基于Python实现多语言朗读与单词选择测验》在数字化教育日益普及的今天,开发一款能够支持多语言朗读和单词选择测验的程序,对于语言学习者来说无疑是一个巨大的福音,下面我们就来用Python实现一个这... 目录一、项目概述二、环境准备三、实现朗读功能四、实现单词选择测验五、创建图形用户界面六、运行程序七、

SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)

《SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)》本文介绍了如何在SpringBoot项目中使用Jasypt对application.yml文件中的敏感信息(如数... 目录SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密)前言一、J

MySQL9.0默认路径安装下重置root密码

《MySQL9.0默认路径安装下重置root密码》本文主要介绍了MySQL9.0默认路径安装下重置root密码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录问题描述环境描述解决方法正常模式下修改密码报错原因问题描述mysqlChina编程采用默认安装路径,

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

MySQL修改密码的四种实现方式

《MySQL修改密码的四种实现方式》文章主要介绍了如何使用命令行工具修改MySQL密码,包括使用`setpassword`命令和`mysqladmin`命令,此外,还详细描述了忘记密码时的处理方法,包... 目录mysql修改密码四种方式一、set password命令二、使用mysqladmin三、修改u

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允