可选加密解密:凯撒加密、栅栏加密、异或加密、四方加密、base64加密。
凯撒加密:秘钥自动根据随机数生成,并且每次加密时随机生成1和2,若是1则向后移位实现加密,若是2则向前移位实现加密,将秘钥和1或2存入文件密文中,解密时根据其进行解密,凯撒加密可对字母,数字,中文等进行加密。
栅栏加密:栅栏加密一般不超过30个字符,根据字符长短分为2栏和7栏加密方式,若是偶数则全部进行加密,若是奇数则最后一个字符不进行加密而是在前面的偶数加密完成后直接加到最后,栅栏加密可对对字母,数字,中文等进行加密。
异或加密:对字符进行异或操作实现加密,异或加密可对字母、数字、中文进行加密。
四方加密:对小写26个字母和0~9数字进行对称加密,四方加密只可对小写26个字母和0~9数字进行对称加密。
Base64加密:三个字符的各八位二进制转换成四位的六位二进制,找出转换表的对应位置,实现加密。
在加密后的密文最后加上一个大写字母代表加密的方式:C(凯撒加密)、B(栅栏加密)、X(异或加密)、S(四方加密),解密时可根据最后一个字母来进行解密操作。
具体加密操作详见百度。
对这个程序做一个简单的介绍:
个人将这个程序分为了三个部分来写:
1.界面。
界面就是采用了gotoxy函数。
这个函数的作用就是如下所示:
然后,根据计算得出屏幕上的各个坐标的位置,然后将光标定位到不同的坐标点上即可,而且根据用户输入的指令可以将坐标点进行变化。然后根据此时的坐标点的位置选择进入不同的界面。
这个类实现的内容核心就是这个,其余的内容经过简单计算即可。
2.加密和解密。
加密和解密无非就是整个程序的核心所在,前面已经对程序的加密解密大致思想进行了介绍,这里在简单介绍一下实现过程:
凯撒加密:
这个就比较简单了,就是简单的位移计算,没有一点技术含量。为了加强加密的安全,这里采用了随机位数加密和随机向后向前加密。也就是说如果一个字母是A的话,算法会先产生一个随机数和在1和2(1的话向右进行加密,2的话向左进行加密),然后将A的ascii减去或加上(也就是向左或者向右)这个随机数,产生的新的ascii对应的字符就是加密后的密文,由于每次进行加减的位数不定,所以加密强度会有所提升,并且需要将加密时的随机数和向左或者向右的标志(秘钥)进行记录,否则无法解开密文。解密的时候根据秘钥进行计算就好了。
栅栏加密:
这种也比较简单,同样的比较容易破解,这个百度词条上的是2栏加密,程序中除了实现2栏加密外,还有7栏加密。7栏加密与2栏加密的思想一致,算法也大概相同(不过程序中的7栏加密有缺陷,只能加密字符为:17、21、28的,其余的还是使用2栏加密实现的)。
3.异或加密。
这个就是用来凑数的,算法简单明了,将字符的ascii记性异或运算就好了,同样进行异或运算时的字符也是随机产生的,所以需要将秘钥进行保存。
4.四方加密。
这里是对四方密码的一个详细介绍,可以查看这个。
http://baike.baidu.com/link?url=EW-hRWmLoQdAt0NMIf4wgW3Tbfk1WxffbnDPw5oMUNUfavOL9OqvW9LL3o0jWE4W
算法就是根据这里的思想进行编写的,而且这里使用的加密矩阵可以进行简单修改,所以可以说如果不知道加密矩阵的话,是无法解开密文的。
5.base64加密。
同样的,下面是关于base64的介绍:
http://baike.baidu.com/link?url=JN4tj8Su4fjZR6vLOHWDtP2-LcDaIz8W31-8GRO4d4cDbImQiF6NyjL2A-p4_BerDv4Ykxhs6JEn3X0Dc_QrK_
加密过程采用了二进制转换的方法,就是讲明文的ascii转换成八位的二进制,每三个字符一组,就是24位二进制数。再将这24个二进制数,每6个一组分割成4组,再转换成十进制。这样就将三个字符分割成四个字符了,然后根据转换表转换成对应的密文即可。
3.整体逻辑控制。
这个就是main函数中实现的内容,采用了多个while循环嵌套,然后使用esc返回到上层界面。使用起来相对灵活。
课程设计相对应的报告(需要两个下载积分,没有积分的可以私信我邮箱,我进行发送):http://download.csdn.net/detail/leafage_m/9741417
#include <iostream>//凯撒 栅栏 异或 四方 Base64
#include <windows.h>
#include <conio.h>
#include <fstream>
#include <string>
#include <ctime>
using namespace std;
//空格键ASCII 32 回车 13 Esc 27
void hide_cursor()
{
CONSOLE_CURSOR_INFO cci = {1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
}
void gotoxy(int x,int y)
{
COORD loc={x,y};
HANDLE hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOutput,loc);
}
class Interface
{
public:
Interface()
{
x = 0;
y = 0;
}
int Choose();//选择开始说明结束
int Display_Choose();//选择加密或者解密
int Choose_Passwd();//选择密码
void Move(int &x,int &y);//移动图标
void Empty();//清空区域
void Explain();//密码说明
private:
int x,y,m,n;
};
int Interface::Choose()
{
Empty();
m = 6;
n = 14;
x = 39;
y = 6;
gotoxy(x,y);
cout << "开始";
gotoxy(x,y+4);
cout << "说明";
gotoxy(x,y+8);
cout << "结束";
Move(x,y);
Empty();
return y;
}
int Interface::Display_Choose()
{
Empty();
m = 6;
n = 10;
x = 39;
y = 6;
gotoxy(x,y);
cout << "加密";
gotoxy(x,y+4);
cout << "解密";
Move(x,y);
Empty();
return y;
}
int Interface::Choose_Passwd()
{
Empty();
m = 4;
n = 20;
x = 39;
y = 4;
gotoxy(x,y);
cout << "凯撒";
gotoxy(x,y+4);
cout << "栅栏";
gotoxy(x,y+8);
cout << "异或";
gotoxy(x,y+12);
cout << "四方";
gotoxy(x-1,y+16);
cout << "Base64";
Move(x,y);
Empty();
return y;
}
void Interface::Move(int &x,int &y)
{
char ch;
gotoxy(x-4,y);
cout << ">>";
gotoxy(x+6,y);
cout << "<<";
ch = getch();
while(ch!=27 && ch!=13)
{
switch(ch)
{
case 'W':
case 'w':
if(y != m)
{
gotoxy(x-4,y);
cout << " ";
gotoxy(x+6,y);
cout << " ";
y = y - 4;
gotoxy(x-4,y);
cout << ">>";
gotoxy(x+6,y);
cout << "<<";
}
else
{
gotoxy(x-4,y);
cout << " ";
gotoxy(x+6,y);
cout << " ";
y = n;
gotoxy(x-4,y);
cout << ">>";
gotoxy(x+6,y);
cout << "<<";
}
break;
case 'S':
case 's':
if(y != n)
{
gotoxy(x-4,y);
cout << " ";
gotoxy(x+6,y);
cout << " ";
y = y + 4;
gotoxy(x-4,y);
cout << ">>";
gotoxy(x+6,y);
cout << "<<";
}
else
{
gotoxy(x-4,y);
cout << "