密码学作业——置换密码部分

news2024/11/17 13:51:23

part1: encrypt加密函数_代码补充:

/*请在此处添加*/
    cout<<Substition[plain[i]];

part2:Decrypt解密函数_代码补充:

/*请在此处添加代码*/
cout<<ReverseTable[cipher[i]];

part3:设置 转换表Substition[]部分:

// 将i对应的置换表元素设为s1中对应位置的字符
/*请在此处添加代码*/
    SubstitionTable[i] = s1[i-'a'] ;

悟:关键是 把这个 实验原理看明白:

(1)密钥是 I LOVE MY COUNTRY  -- 这个作为 初始的 string变量key

(2)第一步:去掉key中除了大写字母之外的东西 和 重复的大写字母:

得到ILOVEMYCUNTR  -- 作为 之后使用的string 变量 s1 ,(之后key就不用了...)

(3)第二步: 利用密钥s1,得到置换表SubstitionTable, 主要参考上面这张图片中的表格:

<1>贪心:先从小写字母a开始,能用的全用了,所以 , 上述例子中 才会有 "abcdefghijkl" 映射到 s1中的“ILOVEMYCUNTR”

<2>还是贪心:从大写字母A开始, 只要没有在s1中出现过, 就作为 当前小写字母的 映射结果:

所以例子中的 “mnopqrstuvwxyz” 才会 依次匹配 大写字母"ABDFGHJKPQSWXZ"

(4)第三步:就是构建 反函数 映射, 从大写字母 映射到 小写字母

3.完整代码(可运行):


#include<iostream> 
#include<string>

using namespace std;
// 引入输入输出流库#include<string>      
// 引入字符串库using namespace std; 
// 引入命名空间
void Encrypt(char Substitution[]);   // 声明加密函数
void Decrypt(char Substitution[]);   // 声明解密函数
void setSubstitution(char Substitution[], char ReverseTable[]);  // 声明设置置换表函数

int main() // 主函数
{
	int m; // 声明变量m,用于判断是加密还是解密,加密为1,解密为2    
	int flag = 1; // 声明变量 flag,用于控制循环程序是否运行,开始时为1    
	while (flag) // 循环运行    
	{
		cout << "单表置换算法加解密:" << endl;
		char SubstitutionTable['z' + 1];   // 定义数组,用于保存正向置换表(它的下标是原字符的 ASCII 码,其对应的值是替换后的字符的 ASCII 码),加密时使用,长度为 z+1        
		char ReverseTable['Z' + 1];  // 定义数组,用于保存反向置换表(它的下标是替换后的字符的 ASCII 码,其对应的值是原字符的 ASCII 码),解密时使用,长度为Z+1        
		cout << "加密按输入1,解密输入2" << endl;
		cin >> m;    // 读取用户输入的值,判断是加密还是解密        
		setSubstitution(SubstitutionTable, ReverseTable); // 调用设置置换表函数,设置正向置换表和反向置换表        
		if (m != 1 && m != 2) // 判断输入是否正确        
		{
			cout << "输入错误,请重新输入" << endl;
			cin >> m; // 再次读取用户输入的值        
		}
		if (m == 1) // 判断是否加密        
		{
			Encrypt(SubstitutionTable); // 调用加密函数        
		}
		if (m == 2) // 判断是否解密        
		{
			Decrypt(ReverseTable); // 调用解密函数        
		}
		cout << "是否继续加解密运算?[0->退出; 1 or 其他->继续]" << endl;
		cin >> flag; // 读取用户输入的值,判断是否继续循环    
	}
	return 0;
}
void Encrypt(char Substitution[]) // 加密函数
{
	string plain; // 定义字符串变量,用于保存明文    
	cout << endl << "请输入明文(小写):";
	cin >> plain; // 读取用户输入的明文    
	cout << plain << endl; // 输出用户输入的明文    
	cout << "加密后的密文为:" << endl;    // 遍历明文中的每个字符,利用置换表Substitution对字符进行替换,并输出替换后的字符,生成密文    
	for (int i = 0; i < plain.length(); i++) // 遍历明文中的每个字符    
	{
		if (plain[i] >= 'a' && plain[i] <= 'z') // 如果字符是小写字母        
			// 则在置换表中查找该字母对应的密文字母,输出密文字母
			/*请在此处添加代码可以参考注释的思路*/
		{
			cout << Substitution[plain[i]];
		}
		else cout << plain[i]; // 如果字符不是小写字母,则直接输出原字符        
	}
	cout << endl;
}

void Decrypt(char ReverseTable[]) // 解密函数
{
	string cipher;  // 定义字符串变量,用于保存用户输入的密文 
	cout << endl << "请输入密文(大写):";
	cin >> cipher; // 读入用户输入的密文并存储到cipher中 
	cout << cipher << endl; // 输出密文 
	cout << "解密后的明文为:" << endl;
	for (int i = 0; i < cipher.length(); i++) // 循环遍历密文中的每一个字符 
	{
		if (cipher[i] >= 'A' && cipher[i] <= 'Z') // 判断字符是否在大写字母范围内 // 如果是,则将其对应的反置换表中的字符输出 
			/*请在此处添加代码可以参考注释的思路*/
		{
			cout << ReverseTable[cipher[i]];
		}
		else cout << cipher[i]; // 否则直接输出原字符 
	} cout << endl;
}

void setSubstitution(char SubstitutionTable[], char ReverseTable[])
{
	int i;  // 定义循环变量i和j 
	char j;
	string key;  // 定义字符串,用于存储密钥key 
	cout << "请输入密钥(大写):";
	cin >> key; // 读入密钥 
	cout << key << endl; // 输出密钥 
	cout << "置换表为:" << endl;
	string s1; // 定义字符串,用于存储处理后的密钥s1     
	// 对密钥进行处理(去掉空格和重复的字符) 
	for (i = 0; i < key.length(); i++) // 循环遍历密钥中的每一个字符 
	{
		bool sign = 0;  // 定义标志变量,判断是否已经出现过该字符,初始化为false 
		if (key[i] >= 'A' && key[i] <= 'Z') // 如果当前字符是大写字母 
		{
			for (int j = 0; j < s1.length(); j++) // 遍历处理后的密钥字符串s1 
			{
				if (key[i] == s1[j]) // 如果当前字符已经在s1中出现过 
				{                    // 如果已经出现,将标志变量sign设为true,跳出循环  
					sign = 1;  break;
				}
			}             // 如果当前字符没有在s1中出现过,则将其加入s1中 
			if (sign == 0) s1 = s1 + key[i];             // 如果当前字符已经出现过,则将标志变量sign设为false 
			else sign = 0;
		}
	}
	for (j = 'a'; j <= 'z'; j++)
		cout << j << " ";
	cout << endl; // 输出小写字母 从a到z 
	char ch = 'A'; // 定义变量ch,表示当前未被 用作置换表  元素 的大写字母,初始化为'A'     // 该循环利用密钥得到置换表 
	


	for (i = 'a'; i <= 'z'; i++) // 遍历小写字母a~z 
	{
		if (i < 'a' + s1.length()) // 如果当前位置i在s1的长度范围内 
		{// 将i对应的置换表元素设为s1中对应位置的字符
		 /*请在此处添加代码可以参考注释的思路*/ 
			SubstitutionTable[i] = s1[i - 'a'];
		}
		else // 如果i在s1的长度范围外 
		{            // 遍历s1中的每一个字符 
			for (int j = 'a'; j < 'a' + s1.length(); j++)
			{
				if (ch == SubstitutionTable[j]) // 如果当前生成的字符ch已经在置换表中出现过 
				{                    // 将ch加1,重新从头开始搜索
					ch++;  
					j = 'a';  
					continue;
				}
			}             
			// 将i对应的置换表元素设为当前的字符ch,然后将ch加1 
			SubstitutionTable[i] = ch;  ch++;
		}
		cout << SubstitutionTable[i] << " "; // 输出生成的置换表元素 
	}
	cout << endl;     // 该循环用于构建反置换表     // 将置换表中的字符和它的下标进行反向映射 
	for (i = 'a'; i <= 'z'; i++) //遍历小写字母a~z 
	{        
		// 循环变量 i 遍历了所有小写字母        
		// 对于每个字母,它首先通过置换表找到映射到的字母        
		// 然后将该字母作为下标,将当前遍历到的小写字母作为值,存入到反置换表中        
		// 这个过程确保了当使用反置换表进行解密时,可以将密文中的字符逆向映射回原来的明文字符
		ReverseTable[SubstitutionTable[i]] = i;
	}
	// 输出反置换表7
	cout << "反置换表为:" << endl;
	for (i = 'A'; i <= 'Z'; i++) // 循环遍历大写字母 
	{
		cout << ReverseTable[i] << " "; // 输出反置换表中A到Z字母对应的字符,用空格分隔 
	}
	cout << endl;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/485978.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

prometheus实战之三:告警规则

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《prometheus实战》系列的第三篇&#xff0c;一起来学习prometheus的告警功能&#xff0c;如下图所示&#xff0c;整个告警功能分为规则和通…

Python使用AI animegan2-pytorch制作属于你的漫画头像/风景图片

Python使用AI animegan2-pytorch制作属于你的漫画头像 1. 效果图2. 原理3. 源码参考 git clone https://github.com/bryandlee/animegan2-pytorch cd ./animegan2-pytorch python test.py --photo_path images/photo_test.jpg --save_path images/animegan2_result.png1. 效果图…

全球首个机器人辅助试管婴儿降生

近日&#xff0c;两名通过机器人辅助受精手术成功诞生的女婴成为全球瞩目的焦点。这是全球首批由机器人成功辅助受精的婴儿案例&#xff0c;预示着未来生育技术的发展趋势。 以往&#xff0c;试管婴儿受精过程中将精子注入卵子内的环节都是由人工完成。胚胎技术人员需要在显微镜…

最简单的循环

☃️个人主页&#xff1a;fighting小泽 &#x1f338;作者简介&#xff1a;目前正在学习C语言和数据结构 &#x1f33c;博客专栏&#xff1a;C语言学习 &#x1f3f5;️欢迎关注&#xff1a;评论&#x1f44a;&#x1f3fb;点赞&#x1f44d;&#x1f3fb;留言&#x1f4aa;&am…

6. Docker——详说镜像

本章讲解知识点 Docker 镜像 Union File System&#xff08;联合文件系统&#xff09;技术 回说 Docker 镜像分层 Docker 镜像分层原理 1. Docker 镜像 镜像是一种轻量级、可执行的独立软件包&#xff0c;用来打包软件运行环境和基于运行环境开发的软件&#xff0c;它包含…

一文了解 Zebec Labs 投资的 Coral Finance,空投计划或在不久推出

在前不久&#xff0c;Zebec Labs 宣布对链上衍生品协议 Coral Finance 进行150万美元的投资&#xff0c;以帮助该协议完成早期启动并&#xff0c;并在后续持续的为其提供孵化支持。Coral Finance 将在不久部署在 Nautilus Chain 主网上。据了解&#xff0c;Coral Finance 是 Na…

【VM服务管家】VM4.2平台SDK_6.2 模块操作类

目录 2.2.1 流程操作&#xff1a;通过流程或Group设置输入输出图像的方法2.2.2 模块操作&#xff1a;设置输入图像、参数和ROI2.2.3 N点标定&#xff1a;清空标定点、生成标定文件2.2.4 分支字符&#xff1a;控制调试模式开关的方法2.2.5 条件检测&#xff1a;条件检测模块设置…

【GAMES101】02 Review Of Linear Algebra

1.点乘&#xff1a; 向量点乘 → 一个数值 点乘在图形学中的应用&#xff1a; 找到两个方向之间的夹角。找到一个向量投影到另一个向量上是什么样的。计算两个向量的方向&#xff08;是接近还是远离&#xff09;判定高光范围&#xff0c;从1&#xff08;重合&#xff…

【VM服务管家】VM4.2平台SDK_6.5 全局类

目录 2.5.1 全局相机&#xff1a;获取全局相机列表和设置相机参数的方法 2.5.1 全局相机&#xff1a;获取全局相机列表和设置相机参数的方法 描述 环境&#xff1a;VM4.2 VS2013及以上 问题&#xff1a;问题1&#xff1a;如何获取方案中所有的全局相机的连接状态&#xff0c;…

c++基础-分支语句

目录 if语句 if-else switch语句 if语句 在C中&#xff0c;if语句是一种分支结构&#xff0c;它允许程序根据条件执行不同的操作。可以使用if语句来检查一个条件是否为真&#xff0c;如果为真就执行一个语句块&#xff0c;否则执行另一个语句块。 if语句的语法如下&#xff…

自媒体平台图文创作建议和技巧

自媒体博主在自媒体平台进行图文创作时&#xff0c;需要注意哪些方面才能创造出更好的内容获得更多的关注呢&#xff1f;今天跟大家分享自媒体创作中的一些图文创作建议和技巧。 一、确定目标受众 首先需要明确自己要传达的信息和目标受众。要考虑读者的兴趣、需求和阅读习惯&…

2001-2021年全国30省就业人数数据

2001-2021年全国30省就业人数数据/各省就业人数数据 1、时间&#xff1a;2001-2021年 2、范围&#xff1a;包括30个省市不含西藏 3、指标&#xff1a;就业人数 4、来源&#xff1a;各省NJ、社会统计NJ 5、缺失情况说明&#xff1a;无缺失 6、指标说明&#xff1a; 就业人…

【Python入门】人生苦短,我用Python

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于Python零基础入门系列&#xff0c;本专栏主要内容为Python基础语法、判断、循环语句、函…

10万字城市大脑一网统管分析平台及大数据平台建设方案(WORD)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 一.1.1.督查监管子系统 督察监管子系统是指通过独立的督察队伍&#xff0c;以日常督察、专项督察的方式&#xff0c;来检查运行效果。根据工作进度&#xff0c;工作中存在的…

【无人车】无人驾驶地面车辆避障研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

ChatGPT常见问题及其解决方法汇总

好久没有更新过技术类的文章了&#xff0c;希望本篇文章能够对你有所帮助&#xff0c;今天这篇博客将会把ChatGPT注册中可能遇到的问题彻头彻尾的讲一下&#xff0c;创作不易&#xff0c;如果感觉有帮助的话就动动你发财的小手点个收藏点个赞吧。如有需要转载请附上原文链接&am…

mysql5.7以上的启动、停止、赋权命令

文章目录 1、启动mysql server2、查看初始密码3、本地登陆mysql4、修改本地root用户密码5、防火墙设置6、开启mysql的远程登录 1、启动mysql server systemctl start mysqld #启动程序 systemctl enable mysqld #开机自运行 systemctl status mysqld #查看状态…

浅谈WebGIS未来应用与技术发展趋势

前言 WebGIS&#xff08;Web GIS&#xff09;是一种基于Web的地理信息系统&#xff0c;它可以实现地理空间数据的查询、分析、管理和可视化。与传统的 GIS 相比&#xff0c;WebGIS 是通过浏览器实现客户端与服务器间的信息交流&#xff0c;成本降低&#xff0c;且界面友好&…

No.046<软考>《(高项)备考大全》【专项2】《案例分析 - 计算题(上)》

《&#xff08;高项&#xff09;备考大全》【专项2】《案例分析 - 计算题》 1 题型全部概况2 时间管理2.1 关键路径法 CMP2.1.1 原理2.1.2 关键路径的基本问题2.1.3 题目7、题目6 - 正推、反推8、题目7 2.2 PERT&#xff08;计划评审技术&#xff09;2.3 活动排序网络图 3 成本…

CesiumForUnreal、UE5实现限高分析效果

文章目录 1.实现目标2.实现过程2.1 材质2.2 Widget2.3 运行测试3.参考资料1.实现目标 在UE5中基于CesiumForUnreal插件实现简单GIS分析功能中的限高分析效果,GIF动图如下: 2.实现过程 实现限高分析功能的方法可以大致分为两种,一种是修改3DTileset的材质;另一种是基于贴花…