首页 > 编程语言 >C++实现维吉尼亚密码的加密和解密

C++实现维吉尼亚密码的加密和解密

时间:2024-12-11 12:32:00浏览次数:6  
标签:case 加密 cout 解密 C++ && 维吉尼亚 ASCII

思路:将加密和解密的过程转化为ASCII编码的运算

#include<iostream>
using namespace std;
void showMenu() {    //菜单
	cout << "------维吉尼亚密码加密解密------" << endl;
	cout << "1.加密" << endl;
	cout << "2.解密" << endl;
	cout << "3.退出" << endl;
	cout << "请输入需要进行的操作:" << endl;
}
string StoB(string Key) {  //将Key全部转换成大写字母,方便后续进行ASCII编码的计算
	for (int i = 0;i<Key.length();i++) {
		if (Key[i] >= 'a' && Key[i] <= 'z') Key[i] = char(Key[i] + 'A' - 'a');
	}
	return Key;
}
void encrypt(string EnMessage,string Key) {   //加密
	int len_K = Key.length();
	int index = 0;
	cout << "加密后为:";
	for (auto n : EnMessage) {
		if (index > len_K-1) index = 0;  //通过ASCII编码的运算实现加密操作
		if (n >= 'A' && n <= 'Z') {  //大写字母
			if ((n + Key[index] - 'A') <= 'Z') cout << char(n + Key[index] - 'A');
			else cout << char('A' + (n + Key[index] - 'A' - 'Z') - 1);
		}
		else if (n >= 'a' && n <= 'z') {  //小写字母
			if ((n + (Key[index] - 'A' + 'a') - 'a') <= 'z') cout << char(n + (Key[index] - 'A' + 'a') - 'a');
			else cout << char('a' + (n + (Key[index] - 'A' + 'a') - 'a' - 'z') - 1);
		}
		else cout << n;  //其他字符直接输出
		index++;
	}
	cout << endl;
}
void decrypt(string DeMessage,string Key) {  //解密
	int len_K = Key.length();
	int index = 0;
	cout << "解密后为:";
	for (auto n: DeMessage) {
		if (index > len_K-1) index = 0;  //通过ASCII编码的运算实现解密操作
		if (n >= 'A' && n <= 'Z') {  //大写字母
			if ((n - Key[index] + 'A') >= 'A') cout << char(n - Key[index] + 'A');
			else cout << char('Z' - ('A' - (n - Key[index] + 'A')) + 1);
		}
		else if (n >= 'a' && n <= 'z') {  //小写字母
			if ((n - (Key[index] - 'A' + 'a') + 'a') >= 'a') cout << char(n - (Key[index] - 'A' + 'a') + 'a');
			else cout << char('z' - ('a' - (n - (Key[index] - 'A' + 'a') + 'a')) + 1);
		}
		else cout << n;  //其他字符直接输出
		index++;
	}
	cout << endl;
}
int main()
{
	int select;
	string EnMessage,DeMessage,EnKey,DeKey;
	while (1) {
		showMenu();
		cin >> select;
		switch (select) {
		case 1:  //加密
			cout << "请输入加密的密钥:" << endl;
			cin >> EnKey;
			cout << "请输入需要加密的消息:" << endl;
			cin >> EnMessage;
			encrypt(EnMessage, StoB(EnKey));
			break;
		case 2:  //解密
			cout << "请输入需要解密的消息:" << endl;
			cin >> DeMessage;
			cout << "请输入密钥:" << endl;
			cin >> DeKey;
			decrypt(DeMessage,StoB(DeKey));
			break;
		case 3:  //退出
			cout << "欢迎下次使用!" << endl;
			return 0;  //结束程序
		default:  //其他情况
			cout << "输入错误!请重新输入" << endl;
			break;
		}
	}
}

此程序能保证密文和明文大小写保持一致,且若文本中出现非字母字符会原样保留。具有较强的健壮性。

若有其他bug,欢迎在评论区指正

标签:case,加密,cout,解密,C++,&&,维吉尼亚,ASCII
From: https://blog.csdn.net/Young_iM/article/details/144397163

相关文章

  • c++ 样式错误 “Unknown property transition” /“Could not parse stylesheet of o
    解决办法通过遍历所有的控件,“Unknownpropertytransition打印出所有的控件地址,将地址GPS2>&1log.log输出到log日志中“Couldnotparsestylesheetofobject0xb88164f8”关键函数QStringgetWidgetHierarchy(QObject*widget)获得所有的控件#include<QA......
  • C++_构造函数和析构函数与对象的封装
    头文件和源文件分离源文件--类内声明和类外实现声明和实现分离struct结构的默认访问类型是public,而类为private。POD,PlainOldData只表示纯粹的数据对象classpublicprivate类作用域classscope成员变量成员函数--函数-函数头和函数体-作用域解析运算符(::......
  • 基于C和C++的高效职工管理与演讲比赛系统设计源码-Z5yUlJ9p
    基于C和C++的高效职工管理与演讲比赛系统设计源码地址本项目采用C++为主要开发语言,辅以C语言,构建了一个高效的职工管理与演讲比赛系统。项目共包含60个文件,其中包含14个头文件(.h),12个源文件(.cpp),8个日志文件(.tlog),6个文本文件(.txt),以及VisualStudio项目文件(.vcxproj,.filters,.sln)......
  • RSA加解密
    无废话,直接上工具类usingSystem.Security.Cryptography;usingSystem.Text;namespaceDZCloudServer.Core.Util{publicclassEncryptUtil{/*RSA加密算法*////<summary>///获取RSA密钥///下标......
  • [C++11] 右值引用和移动语义
    目录左值引用和右值引用左值引用与右值引用比较​编辑右值引用使用场景和意义左值引用的使用场景:右值引用和移动语义移动拷贝移动赋值右值引用引用左值及其一些更深入的使用场景分析完美转发完美转发维持值自身属性完美转发的使用场景左值引用和右值引用什么......
  • C++游戏开发探秘【1】
    成长路上不孤单......
  • 【C++】控制台清空/清除部分字符
    目录清空整个屏幕:清空特定的某一行:(附录)一些常用的ANSI转义码清空整个屏幕:(头文件<cstdlib>)system(“cls”);*该方法容易造成闪屏等问题,可以尝试用WIN-API函数解决(?)      /待研究清空特定的某一行:若是清空方才输出的那一行     使用 \r  将......
  • C++_C++对象初始化
    类定义有两种方式:一是在类内声明时同时实现,另一种是在类内声明函数原型、在类外实现类内定义的成员函数默认为内联函数 类外实现减少编译依赖减少编译依赖并清晰地分离接口与实现初始化显式初始化和隐式初始化 声明定义初始化--初始值的......
  • 11C++循环结构-for循环(1)
    一、for语句引出问题:当需要重复执行某一语句时,使用for语句。for语句最常用的格式为:for(循环变量赋初值;循环条件;循环变量增值)语句;注:“语句;”就是循环体,可以是一个简单的语句,也可以是一个用“{}”括起来的复合语句。它的执行过程如图示:编写这个程序可以如此:#include......
  • jmeter RAS加密/解密
    RAS加密算法介绍:RSA(全称:Rivest-Shamir-Adleman)是一种非对称加密算法,在加密/解密过程中使用不同的密钥,即公钥和私钥。公钥和私钥是成对生成的,一般公钥会存放在客户端,客户端可以使用公钥对内容进行加密,服务器端存放私钥,当服务器端收到加密的内容后,可以通过私钥进行解密。。公钥可......