美文网首页
维吉尼亚密码加密文件

维吉尼亚密码加密文件

作者: 比轩 | 来源:发表于2015-11-03 22:40 被阅读406次

一.维吉尼亚密码加密文本文件

要求:
用维吉尼亚密码实 现加密任意文本文件,注意用控制台方式实现。
输入格式:
>-e/-d key filename (key为一个单词,或者一串字符串)

代码:
// Console-维吉尼亚加密文本
//2015-10-4
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>

using namespace std;

//void encrypt (string, ifstream);
//void decrypt (string, ofstream);

int main(int argc, char *argv[])
{
    if (argc != 4)//处理输入指令,输入有误,返回提示
    {
        //QIUT for wrong input
        cout << "wrong input!" << endl;
        exit(EXIT_FAILURE);
    }

    //for (int i = 0; i<argc; i++) //验证输入指令
    //  cout << argv[i] << '\t';

    string tag(argv[1]), key(argv[2]), filename(argv[3]); //接收加解密标志,密钥,文件名
    char temp;
    int et = tag.find('-e'), dt = tag.find('-d'); //查找加密解密指令
    int klen = key.size(), j = 0;
    for (int i = 0; i < klen; i++) //处理密钥为大写
    {
        if (key[i] >= 97 && key[i] < 122)
            key[i] = key[i] - 32;
    }
    if (et != string::npos && dt == string::npos) //加密文件
    {
        //定义文件指针
        ifstream fin(filename);
        ofstream fout("foe.txt", ios_base::out | ios_base::trunc); //文件打开方式为清除原有数据,重新天填入
        while (fin.get(temp))
        {
            for (;;)
            {
                if (temp >= 65 && temp <= 90)
                {
                    temp = (((temp - 65) + (key[j] - 65)) % 26 + 97);
                    fout << temp;
                }
                else if (temp >= 97 && temp <= 122)
                {
                    temp = (((temp - 97) + (key[j] - 65)) % 26 + 65);
                    fout << temp;
                }
                else
                    fout << temp;;
                j = (j + 1) % klen;
                break;

            }
        }
        fin.close();//关闭文件指针
        fout.close();
    }
    else if (et == string::npos && dt != string::npos) //解密文件
    {
        ifstream fin(filename);
        ofstream fout("fod.txt", ios_base::out | ios_base::trunc);

        while (fin.get(temp))
        {
            for (;;)
            {
                if (temp >= 65 && temp <= 90)
                {
                    temp = (((temp - 65 + 26) - (key[j] - 65)) % 26 + 97);
                    fout << temp;
                }
                else if (temp >= 97 && temp <= 122)
                {
                    temp = (((temp - 97 + 26) - (key[j] - 65)) % 26 + 65);
                    fout << temp;
                }
                else
                    fout << temp;
                j = (j + 1) % klen;
                break;

            }
        }
        fin.close();
        fout.close();
    }
    else
    {
        cout << "no find :-e or -d" << endl; //没有找到加密加密指令,返回错误信息
        exit(EXIT_FAILURE);
    }
    return 0;
}

二.维吉尼亚密码加密任意类型文件

要求:

用维吉尼亚密码加密任意类型的文件,用控制台方式实现。

代码:
// Console维吉尼亚加密任意文件
//2015-10-4

#include <iostream>
#include <fstream>  //文件流
#include <string>  //string型操作
#include <cstdlib> //读取写入二进制数据
#include <cstdio> //为生成临时文件名

using namespace std;

int main(int argc, char *argv[])
{
    if (argc != 4)
    {
        //输入有错时返回提示信息并结束程序
        cout << "输入指令错误,请确认输入格式为:exeFileName '-e'or'-d' keyword FileName" << endl;
        exit(EXIT_FAILURE);
    }

    //for (int i = 0; i<argc; i++) //验证输入指令
    //  cout << argv[i] << '\t';

    string tag(argv[1]), keytext(argv[2]), filename(argv[3]);//接收加解密标志,密钥,文件名
    //把keytext存到临时文件里,然后以二进制读取作为密钥

    char tempfname[L_tmpnam] = { '\0' };
    tmpnam_s(tempfname);//生成临时文件名
    //cout << tempfname << endl;
    ofstream tempfout(tempfname, ios_base::out | ios_base::trunc);
    tempfout << keytext;//把keytext写入临时文件
    ifstream tempfin;
    tempfin.open(tempfname, ios_base::in | ios_base::binary);
    tempfin.seekg(0, ios::end); //定位指针到文件末尾
    streampos tfp = tempfin.tellg();//tfp为定位指针,指在文件末尾,所以就是文件长度
    tempfin.seekg(0, ios::beg);//恢复临时文件指针到文件头,以便后续操作
    cout << "临时文件操作完成" << endl;

    char temp[1];//存储待加密解密文件数据
    int et = tag.find('-e'), dt = tag.find('-d');//查找加密解密指令

    if (et != string::npos && dt == string::npos) //加密文件
    {
        cout << "-e 确认为加密操作" << endl << "待加密文件名:" << filename << endl;
        //定义文件指针
        ifstream fin;
        fin.open(filename, ios_base::in | ios_base::binary);
        ofstream fout("file.enc", ios_base::out | ios_base::trunc | ios_base::binary);//文件打开方式为清除原有数据,重新天填入
        int i = 0, count = 0;
        char tempdate[1];//临时存储一字节加密解密数据
        char ttemp[1];//存储密钥数据
        while (fin.read(temp, 1)) //外循环读取源文件
        {
            for (;;)//内循环读取密钥数据
            {
                tempfin.read(ttemp, 1);
                tempdate[0] = (ttemp[0] + temp[0]) % 256;
                fout.write(&tempdate[0], 1);
                count++;
                if (count == tfp)
                    tempfin.seekg(0);
                break;
            }
        }
        cout << "加密完成,加密后文件:file.enc" << endl;
        cout << "总共加密" << count << "字节数据" << endl;
        fin.close();//关闭文件指针
        fout.close();
        tempfout.close();
        tempfin.close();
        remove(tempfname);//删除临时文件
    }
    else if (et == string::npos && dt != string::npos) //解密文件
    {
        cout << "-d 确认为解密操作" << endl << "待解密文件名:" << filename << endl;
        //定义文件指针
        ifstream fin;
        fin.open(filename, ios_base::in | ios_base::binary);
        ofstream fout("FileOfDec", ios_base::out | ios_base::trunc | ios_base::binary);//文件打开方式为清除原有数据,重新天填入
        int i = 0, count = 0;
        char tempdate[1];//临时存储一字节加密解密数据
        char ttemp[1];//存储密钥数据
        while (fin.read(temp, 1))
        {
            for (;;)
            {
                tempfin.read(ttemp, 1);
                tempdate[0] = (temp[0] - ttemp[0]) % 256;
                fout.write(&tempdate[0], 1);
                count++;
                if (count == tfp)
                    tempfin.seekg(0);
                break;
            }
        }
        cout << "解密完成,解密后文件:FileOfDec" << "请自行确认解密后文件类型后补充文件后缀" << endl;
        cout << "总共解密" << count << "字节数据" << endl;
        fin.close();//关闭文件指针
        fout.close();
        tempfout.close();
        tempfin.close();
        remove(tempfname);//删除临时文件
    }
    else
    {
        cout << "没有找到加密或者解密指令 :-e or -d" << endl; //没有找到加密加密指令,返回错误信息
        exit(EXIT_FAILURE);
    }
    return 0;
}

相关文章

  • 维吉尼亚密码加密文件

    一.维吉尼亚密码加密文本文件 要求:用维吉尼亚密码实 现加密任意文本文件,注意用控制台方式实现。输入格式:>-e/...

  • 密码那些事儿(十)

    在说维吉尼亚加密法的破解方法之前,有必要来回顾一下它的加密原理。 维吉尼亚加密法是由26套密码组成的表,我们默认要...

  • 维吉尼亚密码

    维吉尼亚密码是以法国外交官、密码学家布莱斯·德·维吉尼亚的名字命名的,不过不是他本人发明的。 【加密原理】...

  • 文件/文件夹加密操作

    给 PDF 添加密码保护 你可以给 PDF 添加密码,这样每个人都需要输入密码才能打开该文件。密码用于加密文件。 ...

  • C基础—文件操作

    读取文本文件 文件的写入 文件的拷贝 获取文件的大小 文件加密 文件解密 字符串密码进行加密 对字符串密码进行解密...

  • python实现维吉尼亚秘钥破解

    关于维吉尼亚密码,百度百科中有着较为详细的描述:维吉尼亚密码——百度百科维吉尼亚密码的原理与凯撒密码类似,其实是凯...

  • Ansible 安全 之【加密主机清单】

    主机清单源文件 使用1234567密码进行加密主机清单 编辑加密后的主机清单文件 使用加密文件运行任务 运行ans...

  • 怎么为cache.xml中的密码加密呢

    Apache Geode 提供了一个gfsh工具来生成加密密码. cache.xml文件接受明文密码或者加密密码....

  • 维吉尼亚密码(Vigenere)(一)

    维吉尼亚密码的原理与凯撒密码类似,其实是凯撒的一种强化和变形,通过使加密相同明文的秘钥不同,来掩盖字符的频率。 我...

  • openssl加解密原理整理

    一、几组概念1、对称加密诸如:AES加密, 加密是用一个密码加密文件,然后解密也用同样的密码2、非对称加密而有些加...

网友评论

      本文标题:维吉尼亚密码加密文件

      本文链接:https://www.haomeiwen.com/subject/doiqhttx.html