文件的加密/解密?

时间:2013-05-13 20:03:14

标签: c++ file encryption

我正在尝试加密,然后解密文件。当我尝试解密文件时,我想在屏幕上显示内容,以确保解密过程没有问题。但是,我没有任何文件解密的显示。我不确定我的代码中缺少什么。我正在使用Dev_C ++。非常感谢您的帮助。代码如下。

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>



using namespace std;


int main()
{ 
    string line;

    string file, encrfile;
    int i, key_length, longueur;
    unsigned int key=0;
    char ch[100];

    cout<<"enter a secret key: ";
    cin.getline(ch, 100);

    for (i=0;ch[i];i++)
    key=(key+3)*ch[i];

    cout<<"Password generated: "<<key;

    cout<<"\n\nEnter the name of the input file: ";
    getline(cin,file);

    cout<<"\nEnter the name of the output file: ";
    getline(cin,encrfile);

    ifstream IS;
    IS.open(file.c_str() );  
    ofstream OS;
    OS.open(encrfile.c_str());

    while(IS>>line);
    {

        //encrypting each character
        for (i=0;i<line.length();i++)
        {
            line[i]^=rand()>>8;
            OS<<line[i];  //writing the character in the output file            
        }
    }

    IS.close();
    OS.close(); 

    cout<<"File "<<encrfile<<" has been encrypted"<<endl;

    cout<<"\nEnter the name of the file to decrypt: ";
    getline(cin,encrfile);  

    cout<<"\n\nDecryption of file:  "<<endl;
    ifstream IS2;
    IS2.open(encrfile.c_str()); 

    while(IS2>>line);
    {

        for (i=0;i<line.length();i++)
        {
            line[i]^=rand()>>8;
            cout<<line[i];
       }
    }
    IS2.close();



return 0;

}

1 个答案:

答案 0 :(得分:3)

;表示循环有一个空体。 所以你在这里逐字阅读整个文件。

while(IS>>line);

所以纠正以上内容:
现在你正在读一个单词。但它正在消除文字之间的空间。

while(IS>>line)

这应该比你期望的更多。

while(std::getline(IS, line))

但是在这里你丢弃了新的线条角色。所以这可能不是你想要的。加密点是保留所有字符。

让所有角色最简单的就是逐一阅读:

char c;
while(IS >> std::noskipws >> c)

使用std :: noskipws(这样你就不会丢失任何字符)。

您正在使用兰特号加密 罚款:但您可能希望使用密钥为随机数生成器播种,以确保每次都获得相同的rands序列。 这只适用于非常具体的OS / Lib组合。

        line[i]^=rand()>>8;

或者你可以用密钥替换rand()。

        line[i]^=key>>8;

与上述相同的问题

while(IS2>>line);

与上述相同的问题

        line[i]^=rand()>>8;

使用rand()作为加密密钥:

未测试: 但应该是一个起点:

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>

int main()
{ 
    std::cout<<"enter a secret key: ";
    std::string ch; 
    std::getline(std::cin,ch);
    unsigned int key = 0;

    for (int i=0;i < ch.size();i++)
        key=(key+3)*ch[i];

    std::cout << "Password generated: "<<key << "\n"
              << "\nEnter the name of the input file:\n";

    std::string file;
    std::getline(std::cin,file);
    std::ifstream IS(file.c_str());  

    std::cout<<"Enter the name of the output file:\n";
    std::string encrfile;
    std::getline(std::cin,encrfile);
    std::ofstream OS(encrfile.c_str());

    std::string line;

    char c;

    srand(key);  // Reset the random number sequence.
    while(IS >> std::noskipws >> c)
    {   
        c ^= (rand() >> 8); 
        OS << c;
    }   
    IS.close();
    OS.close();

    std::cout << "File " << encrfile << " has been encrypted\n"
              << "Enter the name of the file to decrypt:\n";

    std::getline(std::cin,encrfile);
    std::cout<<"\nDecryption of file:\n";

    std::ifstream IS2(encrfile.c_str());

    srand(key);  // Reset the random number sequence.
    while(IS >> std::noskipws >> c)
    {
        c ^= (rand()>>8);
        std::cout << c;
    }
    IS2.close();
}