一个简单的C++加密程序实战

一个简单的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是非常苦恼的。

那如何解决这个问题呢,非常简单,只需要在你的大脑里部署一个很简单的道理,装比这种东西啊,装完之后,喜欢你的人还是喜欢你,不喜欢你的人还是不喜欢你,装比也不会改变什么的,但是做这个程序这个项目,真正收获的是自己,一来是刺激大脑前额,让自己更聪明,二来是学会以冯诺依曼的架构去把数学问题写成代码,经验就是这么来的,最后才是可能会获得的声誉。

  • 12
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
第1篇 编程基础 第1章 开发环境 1.1 工程创建 实例001如何创建基于对话框的MFC工程 实例002如何创建基于文档视图的MFC工程, 实例003打开已存在的工程 实例004怎样查找工程中的信息 实例005怎样在添加对话框资源时创建对话框类 实例006在工作区中管理多个工程 实例007创建MFCActiveX工程 实例008创建ATL工程 实例009创建控制台应用程序 1.2 开发环境设置与使用 实例010怎样定制自己的工具栏 实例011在VC项目中使用自定义资源 实例012向VisualC++开发环境中添加插件 实例013添加消息处理函数 实例014设置开发环境文本颜色 实例015设置批量注释 实例016如何对齐零乱的代码 实例017判断代码中的括号是否匹配 实例018修改可执行文件中的资源 1.3 程序调试 实例019创建调试程序 实例020在Release版本中进行调试 实例021在vc中如何进行远程调试 实例022利用简单断点进行程序调试 实例023利月条件断点进行程序调试 实例024利用数据断点进行程序调试 实例025利用消息断点进行程序调试 实例026利用Watch调试窗口查看对象信息 实例027利用CallStack窗口查看函数调用信息 实例028利用Memory窗口查看内存信息 实例029利用Variables窗口查看变量信息 实例030利用Registers窗口查看CPU寄存器信息 实例031利用Disassembly窗口查看汇编信息 第2章 语言基础 2.1 基本语法 实例032输出问候语 实例033输出带边框的问候语 实例034不同类型数据的输出 实例035输出字符表情, 实例036获取用户输入的用户名 2.2 运算符的妙用 实例037简单的字符加密 实例038实现两个变量的互换 实例039判断性别 实例040用宏定义实现值互换 实例041简单的位运算 实例042整数加减法练习 2.3 条件语句 实例043李白喝酒问题 实例044桃园三结义 实例045何年是闰年 实例046小球称重 实例047购物街中的商品价格竞猜 实例048促销商品的折扣计算 实例049利用switch语句输出倒三角形 2.4 循环语句 实例050PK少年高斯 实例051灯塔数量 实例052上帝创世的秘密 实例053小球下落 实例054再现乘法口诀表 实例055判断名次 2.5 循环的数学应用 实例056序列求和 实例057简单的级数运算 实例058求一个正整数的所有因子 实例059一元钱兑换方案 2.6 趣味计算 实例060加油站加油 实例061买苹果问题 实例062猴子吃桃 实例063老师分糖果 实例064新同学的年龄 实例065百钱买百鸡问题 实例066彩球问题 实例067集邮册中的邮票数量 2.7 多重循环打印图形 实例068用打印三角形 实例069用叶印图形 实例070绘制余弦曲线 实例071打印杨辉三角 2.8 算法 实例072计算某日是该年第几天 实例073斐波那契数列 实例074角谷猜想 实例075哥德巴赫猜想 实例076四方定理 实例077尼科彻斯定理 实例078魔术师的秘密

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值