一个简单的C++加密程序实战
适合入门。因为这也是我入门的时候写的。完成最原始的加密解密,实现英文字符串和数字字符串的转化。完整程序在最后。
先看一下效果,是不是自己想要的东西。
一个简单的C++入门加密器
加密方法是将每一个英文或英文符号对应一个两位数,然后将所有两位数全部输出。这需要程序自带一个字典,将输入的英文字符串的每一个字母与字典中相同的字符对应,如第一个英文字母为“C”,那么用一个循环遍历程序字典中的字母,“C”是字典中第三个,那么“C”就翻译为03。加密函数translate1()将输入的英文加密为一串数字,
void translate1() //加密函数
{
for (short i = 0; i < 500; i++)
{
for (short j = 0; j < 61; j++)
{
if (worlds[j] == input[i])
{
cout << j + 10 + key;
}
}
}
}
解密函数translate2()将输入的数字解密为英文文本,
void translate2() //解密函数
{
int a = 0;
for (short i = 0; i < 1000; i = i + 2)
{
for (short j = 0; j < 10; j++)
{
if (input[i] == transnum[j])
{
a = j * 10;
}
}
for (short j = 0; j < 10; j++)
{
if (input[i + 1] == transnum[j])
{
a = a + j;
}
}
if (a !=0 )
{
cout << worlds[a - 10 - key];
}
a = 0;
}
}
这就是两个核心的函数。
为了更不易破解,我向上文加入了一个新的参数,key,在刚才的加密函数中“C”被翻译为03,但是对于其他有这个程序的人来说,直接把03输入,就可以解密得“C”,那如果我加入一个叫做key的参数,加密的时候加密成3+key,比如key=2,那么此时“C”就被加密成05了,然后跟对方约好key的规律,比如星期八的时候key就等于8,那么对方也可以在解密的时候先减去key的值,就可以解密了,但是对于其他有这个程序的人来说,如果没有key的话,就无法解密,即使输入一个不正确的key,解密出来仍然是乱码,即使偶然一天猜出来key,下一次的key又不一样。
但是这样其实还是可以破解的,如果程序内部的字典是已知顺序的话,那么只要定位到一个字母就可以解密了,当然,这个最多的字母是什么,是“_”,没错,是空格,输入英文文本的时候用“_”来占位,所以只要用一个循环找出加密后数字中出现次数最多的那个两位数,就可以解密了,毕竟已经开源了,程序内部的字典当然是已知的,所以为了屏蔽其他人,大家在用这个程序的时候最好还是把这个字典打乱一下,再发给对方,这样订制的加密解密器,就只有你们两个有了。
但是还是可以破解的,前提是盗取你们两个的订制程序,然后一个一个key试,试出来哪个不是乱码,就成功解密了,但是这个解密要求就太高了。
但是还是可以破解了,运用神经网络算法,将这些全部当做输入,一定可以在理论上解密出来的。最后再记得给输入的字符串加一个初始化的程序。接下来是完整的代码。
#include <iostream> //记得把版本改为Release版
using namespace std;
short key, s = 0;
char input[1000]; //输入
char worlds[61] = { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','_','.','!','?',',','’','"','(',')','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
char transnum[10] = { '0','1','2','3','4','5','6','7','8','9' };//把输入的数字(字符形式)转成数字
void translate1(), translate2();
int main()
{
restart:
for (short u = 0; u < 1000; u++) //初始化程序
{
input[u] = { '0' };
}
cout << "加密则输入0,解密则输入1:";
cin >> s;
if (s == 0) //加密
{
cout << "输入加密号:";//解密号(加密号)不同,得到的加密文本也不同,可以和对方约定加密号的使用方法,比如星期三加密号就是3*2=6,星期四就是8
cin >> key;
cout << "输入待加密文本:" << endl;
cin >> input;
cout << "加密结果:" << endl;
translate1();
}
if (s == 1) //解密
{
cout << "输入解密号:";
cin >> key;
cout << "输入待解密文本:" << endl;
cin >> input;
cout << "解密结果:" << endl;
translate2();
}
cout << endl << "程序结束。" << endl << "继续程序,请输入1;终止程序,请输入0:";
cin >> s;
if (s == 1)
{
goto restart;
}
return 0;
}
void translate1() //加密函数
{
for (short i = 0; i < 500; i++)
{
for (short j = 0; j < 61; j++)
{
if (worlds[j] == input[i])
{
cout << j + 10 + key;
}
}
}
}
void translate2() //解密函数
{
int a = 0;
for (short i = 0; i < 1000; i = i + 2)
{
for (short j = 0; j < 10; j++)
{
if (input[i] == transnum[j])
{
a = j * 10;
}
}
for (short j = 0; j < 10; j++)
{
if (input[i + 1] == transnum[j])
{
a = a + j;
}
}
if (a !=0 )
{
cout << worlds[a - 10 - key];
}
a = 0;
}
} //获得成就:九九八十一行代码。最后一步,导出EXE,在Rlease文件夹中,
以上是完整的代码。
以下是一些杂谈。
学习程序还是我高二的事,因为一个B站大佬用程序模拟了熵增,当然,以前还有很多刺激我去额外学习程序的视频,于是还是忍不住去学编程,顺便可以写一些自己想要的程序,以及装一下B,当时不知道应该先学Python还是C还是C++,先学了一点Python,然后恍然大悟这个东西不能在没有安装环境的电脑上运行,这不就装比失败了吗,然后果断转到C,但是C的那个scan函数,就是那个输入函数,把我给劝退了,这个输入都没有还怎么搞啊,当然后面编写了更复杂的物理模拟程序才发现直接写到程序内部就行了,真的没什么关系,以后搞科研有的时候不用输入甚至更好,当然这都是后话了,但是因此我就放弃了C的学习,因为学业也不是那么简单的,学习都是分散到每天早上十分钟的,但是忘了因为什么,到了高二暑假,下个学期就是高三了,不知道吃错了什么药,又想学C了,但是这次学的是C++,直到开学的时候都还在学,因为不能影响学业嘛,我还记得,网课的时候写这个加密解密器,因为缺少经验,然后那个程序数组没有初始化,就会打出来“烫烫烫烫”,然后这个不是bug的bug,找了两个半小时,最后蓦地从计算机硬件常识那里想到这个问题,当然,最后把.exe发给朋友,装比成功,非常开心。
但是还是要说一下,以装比的心态开发一个项目着实非常不好,装比自古以来便是人间佳话,但是开发一个稍微复杂一点的东西,项目的推进情况和天气一样,不太能预测,有风也有雨,遇到闪电风暴更是常态,而且这个小程序已经是算法改过两遍,是第三代的算法了,真正在开发的时候,如果心急着装比,遇到bug是非常苦恼的。
那如何解决这个问题呢,非常简单,只需要在你的大脑里部署一个很简单的道理,装比这种东西啊,装完之后,喜欢你的人还是喜欢你,不喜欢你的人还是不喜欢你,装比也不会改变什么的,但是做这个程序这个项目,真正收获的是自己,一来是刺激大脑前额,让自己更聪明,二来是学会以冯诺依曼的架构去把数学问题写成代码,经验就是这么来的,最后才是可能会获得的声誉。