用c++实现聊天加密?将聊天内容换成密码,附各种知识点超详细介绍,一看就会!

聊天的消息很容易就被别人看到,并了解你在聊些什么。那么怎么防止这种情况呢?我们可以建立一种只有你与聊天对象之间知道的密码,这样别人就无法直接知道你们的聊天内容。当然,这就是图一乐,要是你爸妈逼你说出来,你不得照样说出来(doge)。

反正,建立一种密码往往是一件很酷的事情,想想当年一战,密码学可是十分重要的!

不说废话了,直接上代码!

#include <bits/stdc++.h>
using namespace std;
int main(){
	char j;
	cout<<"请输入t或s,若输入t表示将密码转化为英文,若输入s表示将英文转化为密码"<<endl;
	cin>>j;
	cout<<"请输入需要转换的语句(若是英文,必须全部小写,单词与单词之间用英文输入法中的‘;’隔开,不得有空格,不超过300个字符;若为密码,请使用英文输入法,确认输入正确,建议直接复制)"<<endl;
	char a[300];
	cin>>a;
	string b;
	int n=strlen(a);
	int k;
	if(j=='s'){
	
		for(int i=0;i<n;i++){
			if(a[i]==';'){
				b+=';';
			}
			else{
				k=int(a[i])-64;
				b+=char(k);
			}
		}
	}
	if(j=='t'){
	
		for(int i=0;i<n;i++){
			if(a[i]==';'){
				b+=';';
			}
			else{
				k=int(a[i])+64;
				b+=char(k);
			}
		}
	}
    cout<<b;
    int end;
    cin>>end;
   
	return 0;
}

 运行结果示例:

 

 如图,提示语已经说明了使用方法,这里就不再赘述。

现在说说其中的密码与明文是如何转换的:将明文各个字母的ascll码二进制的整数值统一减去64,再将该数值对应的字符按输入的格式输出,将密码译为明文就是把减去的64加回去。

如果理解了其中的原理,自然可以修改翻译的方法。

注:其中所有小写字母的ascll码值减去64后的数值对应的字符都避开了“;”,所以可以将它作为各个单词之间的分隔符,这里就用if语句将它单独提出来,无论如何翻译,“;”始终不变。

这个时候,你可能就要问了,为什么不能用空格呢?我的回答是,空格在c++输入数据时通常是指输入下一个变量的值,但是这里为了方便就只定义了一个变量,如果输入空格,空格后的数据就会丢失。(也有可能是作者了解尚浅,暂时不能解决,但是,能用就行了,换成空格也没什么区别,只是习惯问题罢了,再说了,敲c++代码的对“;”的习惯性肯定很强的吧)

这里再介绍一下其中的代码。(超详细的介绍哦!)

这里的头文件只有一个,但是又不只是一个,<bits/stdc++.h>函数库包含了c++所有(应该是所有)的函数库,是一个万能头文件,当你搞不清楚要使用的函数在哪个函数库的时候,你就直接用它,简单粗暴!

其他没什么好说的,就直接看主函数内容吧。

首先定义一个char(字符)型变量j来得知使用者是要将明文转化为密码还是将密码转化为明文。

接下来创建一个长度上限为300的char型数组(后文会通过示例继续介绍),这里解释一下,如果变量a后没有“[300]”是会报错的,因为char型变量只能存储一个字节的字符,只有加上“[number]”才能让它变为数组,这里的[number]就是在定义a的最大长度,同时也确定了a是一个一维数组。

从某种意义上来看,你可以把该数组理解为本质上是由多个char型变量组成的字符串,这种数组利于后面对其中元素的运算。

看代码,你会发现接下来的步骤就是创建了一系列变量。

string(字符串)型的变量b用于将处理完的字符储存,最后一起输出;

整型变量n利用strlen函数获取数组a的有效字符长度(就是你输入了几个字符),这样就能知道接下里的循环结构要循环几次;

整型变量k用于ascll码与字符的转换和ascll码值的运算,后文继续介绍。

由于前面的变量j,接下来用if分支结构进行讨论,这里就只介绍j=='s'即将明文翻译成密码的情况。

if语句中直接嵌套了一个循环结构,先看循环体。

可以注意到,其中出现了a[i],i是数字,所以应该是a[number],这里不再是定义a的长度,而是一个下标。a数组中每一个元素都有一个下标,因为a是一维数组,所以它的元素的下标只有一个数字。所以a[n]就代表了a数组中第(n+1)个元素即字符(因为数组的下标是从0开始的)。

这里用代码示例总结一下涉及的数组概念:

#include <bits/stdc++.h>
using namespace std;
int main(){
	char a[6];//这里的[6]就是定义长度 
	cin>>a;
	cout<<"a[1]的ascll值: "<<int(a[1])<<endl;//这里的[1]就是元素下标 
	cout<<"b的ascll值: "<<int('b')<<endl;
	cout<<"a数组为: "<<a;
	cout<<"a的长度为: "<<strlen(a);//这是输出a存储的有效字符的个数 
	return 0;
}

 其中,输入数组a的值是"abc d"(见行1),但空格后会直接丢失,所以a的真正的值是"abc"(见行4),虽然a的定义长度是6,但只存储了三个有效字符,所以它的长度是3(见行5).

a[1]就是a中下标为1的字符,即第二个字符b,所以第二三行输出的值相同。

这里还有一点,char型变量可以用int强行转型,得到的整型数值就是它的ascll码值。

继续看循环体。

循环体显然是一个if-else语句,就是为了将“;”单独提出来,使它始终保留。语句的意思就是将数组中每一个元素都与“;”比较,如果是就保留,如果不是就把它的ascll码值减去64再转化成对应的字符,k就在中间做了一个承接的作用。

回到for的括号里,i的作用就是保证把a的每一个字符都运算一遍。

这个时候,字符串变量b就把运算过的结果存储起来,最终输出。

最后的end变量是为了防止其生成的exe文件计算结果瞬间消失,没有特别作用。

这只是一个示例,自己也可以去修改,还可以将翻译过程变得更繁琐,比如可以将26个字母分成几类,分别进行不同运算。

我觉得读者应该都看懂了(没看懂的没关系,只是想玩的直接去用,感兴趣的自己再去搜)。

最后,就是文章的最后(自豪)。

后记-----------------------------------------------------------------------------------------

后来我找到了解决输入时不能输入空格的方法,并对代码进行了一定的完善,我就把代码展示,不再加以解释。

#include <bits/stdc++.h>
using namespace std;
int main(){
	cout<<"请输入需要转换的语句(若是英文,符号仅限于逗号与句号,不超过300个字符;若为密码,请使用英文输入法,确认输入正确,建议直接复制)"<<endl;
	char a[300];
	cin.getline(a, 300);
	int j;
	cout<<"请输入1或2,若输入1表示将英文转化为密码,若输入2表示将密码转化为英文"<<endl;
	cin>>j;
	
	string b;
	int n=strlen(a);
	int k;
	if(j==1){
	
		for(int i=0;i<n;i++){
			if(a[i]==' '){
				b+=' ';
			}
			else if(a[i]==','){
				b+='=';
			}
			else if(a[i]=='.'){
				b+='?';
			}
			else if(int(a[i])>=97){
				k=int(a[i])-64;
				b+=char(k);
			}
			else{
				k=int(a[i])+20;
				b+=char(k);
			}
		}
	}
	if(j==2){
	
		for(int i=0;i<n;i++){
			if(a[i]==' '){
				b+=' ';
			}
			else if(a[i]=='='){
				b+=',';
			}
			else if(a[i]=='?'){
				b+='.';
			}
			else if(int(a[i])<=58){
				k=int(a[i])+64;
				b+=char(k);
			}
			else{
				k=int(a[i])-20;
				b+=char(k);
			}
		}
	}
    cout<<b;
    int end;
    cin>>end;
   
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值