C++:文件加密(凯撒加密、栅栏加密、异或加密四方加密、Base64加密)

可选加密解密:凯撒加密、栅栏加密、异或加密、四方加密、base64加密。

凯撒加密:秘钥自动根据随机数生成,并且每次加密时随机生成1和2,若是1则向后移位实现加密,若是2则向前移位实现加密,将秘钥和1或2存入文件密文中,解密时根据其进行解密,凯撒加密可对字母,数字,中文等进行加密。

栅栏加密:栅栏加密一般不超过30个字符,根据字符长短分为2栏和7栏加密方式,若是偶数则全部进行加密,若是奇数则最后一个字符不进行加密而是在前面的偶数加密完成后直接加到最后,栅栏加密可对对字母,数字,中文等进行加密。

异或加密:对字符进行异或操作实现加密,异或加密可对字母、数字、中文进行加密。

四方加密:对小写26个字母和0~9数字进行对称加密,四方加密只可对小写26个字母和0~9数字进行对称加密。

Base64加密:三个字符的各八位二进制转换成四位的六位二进制,找出转换表的对应位置,实现加密。

在加密后的密文最后加上一个大写字母代表加密的方式:C(凯撒加密)、B(栅栏加密)、X(异或加密)、S(四方加密),解密时可根据最后一个字母来进行解密操作。

具体加密操作详见百度。


对这个程序做一个简单的介绍:

个人将这个程序分为了三个部分来写:


1.界面。

界面就是采用了gotoxy函数。

这个函数的作用就是如下所示:

原型:extern void gotoxy(int x, int y);
用法:#include <system.h>
功能:将 光标移动到指定位置说明:gotoxy(x,y)将光标移动到指定行y和列x。设置光标到文本屏幕的指定位置,其中参数x,y为文本屏幕的坐标。
gotoxy(0,0)将光标移动到屏幕左上角。

然后,根据计算得出屏幕上的各个坐标的位置,然后将光标定位到不同的坐标点上即可,而且根据用户输入的指令可以将坐标点进行变化。然后根据此时的坐标点的位置选择进入不同的界面。

这个类实现的内容核心就是这个,其余的内容经过简单计算即可。


2.加密和解密。

加密和解密无非就是整个程序的核心所在,前面已经对程序的加密解密大致思想进行了介绍,这里在简单介绍一下实现过程:


凯撒加密:

这个就比较简单了,就是简单的位移计算,没有一点技术含量。为了加强加密的安全,这里采用了随机位数加密和随机向后向前加密。也就是说如果一个字母是A的话,算法会先产生一个随机数和在1和2(1的话向右进行加密,2的话向左进行加密),然后将A的ascii减去或加上(也就是向左或者向右)这个随机数,产生的新的ascii对应的字符就是加密后的密文,由于每次进行加减的位数不定,所以加密强度会有所提升,并且需要将加密时的随机数和向左或者向右的标志(秘钥)进行记录,否则无法解开密文。解密的时候根据秘钥进行计算就好了。


栅栏加密:


栅栏 加密法是一种比较简单快捷的加密方法。栅栏加密法就是把要被加密的文件按照一上一下的写法写出来,再把第二行的文字排列到第一行的后面。相应的,破译方法就是把文字从中间分开,分成2行,然后插入。栅栏加密法一般配合其他方法进行加密。
例:
加密information
分行
i f r a i n
n o m t o
合并
ifrainnomto
完成~

这种也比较简单,同样的比较容易破解,这个百度词条上的是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 << "  
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值