如何读取图像到加密Crypto ++的字符串 [英] How to read an image to a string for encrypting Crypto++

查看:273
本文介绍了如何读取图像到加密Crypto ++的字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要读取一个文件作为二进制数据,然后才能加密和解密。我正在Crypto ++中测试不同算法的速度。直到现在,我一直在使用getline来阅读文本文件。

I need to read a file as binary data, then be able encrypt and decrypt it. I am testing speeds of different algorithms in Crypto++. Up until now, I have been using getline to read text files.

int main( int argc, char* argv[] ) {
string plaintext, ciphertext, encoded, recovered, sample_files_path, data_file, line_contents, file_size; 

ifstream initial_file_contents ( "1MB.txt");
if (initial_file_contents.is_open()) {
    plaintext = "";
    while ( getline( initial_file_contents, line_contents ) ) {
        plaintext = plaintext + line_contents;
        plaintext.push_back('\n');
        initial_file_contents.close();
    }
} else {
    cout << "Unable to open file" << endl;
}

/*BLOWFISH ALGORITHM*/
AutoSeededRandomPool blowfish_prng; // This class seeds itself using an operating system provided RNG
SecByteBlock blowfish_key(Blowfish::DEFAULT_KEYLENGTH); // Generate a random key
blowfish_prng.GenerateBlock(blowfish_key, blowfish_key.size()); // Generate a random initialization vector
byte blowfish_iv[Blowfish::BLOCKSIZE];
blowfish_prng.GenerateBlock(blowfish_iv, sizeof(blowfish_iv));

// Encrypts the plaintext
e.SetKeyWithIV( blowfish_key, blowfish_key.size(), blowfish_iv, sizeof(blowfish_iv) );
ciphertext.clear();
StringSource ss1(plaintext, true, new AuthenticatedEncryptionFilter( e, new StringSink( ciphertext ) )  ); 

// Decrypts the test
EAX< Blowfish >::Decryption d;
d.SetKeyWithIV( blowfish_key, blowfish_key.size(), blowfish_iv, sizeof(blowfish_iv) );
recovered.clear();
StringSource ss2(ciphertext, true, new AuthenticatedDecryptionFilter( d, new StringSink( recovered ), AuthenticatedDecryptionFilter::THROW_EXCEPTION ) ); 
return 0;
}

我看过其他文章,如读取C / C ++中的图像文件使用c ++将二进制文件(jpg)读取到字符串中,但我不确定该怎么做。我觉得 http://www.cplusplus.com/reference/istream/istream/读/ 可能是一个很好的例子,但我仍然不确定如何实现它。有人可以告诉我如何读取文件,如.jpg文件,并将其存储为字符串,以便加密?

I have seen other articles like Reading an image file in C/C++ and Read a binary file (jpg) to a string using c++ , but I am unsure how to do it. I feel like http://www.cplusplus.com/reference/istream/istream/read/ might be a good example, but I am still unsure how to implement it. Can someone show me how to read in a file such as a .jpg file, and store it as a string so I can encrypt it?

如果我有一个名为image.jpg,我如何读取它在一个字符串变量,如明文?

If I had a file named image.jpg, how would I read it in to be in a string variable like plaintext?

推荐答案

使用 FileSource FileSink 。它避免将数据读入中间对象,如 string ,但在某些情况下可能会更有效。

Use a FileSource and FileSink. It avoids reading the data into an intermediate object like a string, but its probably a little more efficient under some cases.

AutoSeededRandomPool prng;

SecByteBlock key(Blowfish::DEFAULT_KEYLENGTH);
prng.GenerateBlock( key, key.size() );

byte iv[ Blowfish::BLOCKSIZE ];
prng.GenerateBlock( iv, sizeof(iv) );

string ofilename = "puppy-and-teddy-orig.jpg";
string efilename = "puppy-and-teddy.enc";
string rfilename = "puppy-and-teddy-recovered.jpg";

try {

    /*********************************\
    \*********************************/

    EAX< Blowfish >::Encryption e1;
    e1.SetKeyWithIV(key, key.size(), iv, sizeof(iv));

    FileSource fs1(ofilename.c_str(), true,
                   new AuthenticatedEncryptionFilter(e1,
                       new FileSink(efilename.c_str())
                   ) );

    /*********************************\
    \*********************************/

    EAX< Blowfish >::Decryption d2;
    d2.SetKeyWithIV( key, key.size(), iv, sizeof(iv) );

    FileSource fs2(efilename.c_str(), true,
                   new AuthenticatedDecryptionFilter( d2,
                       new FileSink( rfilename.c_str() ),
                       AuthenticatedDecryptionFilter::THROW_EXCEPTION
                   ) );

} catch (const Exception& ex) {
    cerr << ex.what() << endl;
}

以下是图片:

这是加密图像在十六进制编辑器下:

Here's the encrypted image under a hex editor:

运行它在原始和恢复的图像之间没有区别:

Running it produces no difference between the original and recovered images:

$ ./cryptopp-test.exe
$ diff puppy-and-teddy-orig.jpg puppy-and-teddy-recovered.jpg 
$






如果您真的想将其读入字符串,相关更改:


If you really want to read it into a string, here are the relevant changes:

std::ifstream ifile("puppy-and-teddy-orig.jpg", ios::binary);
std::ifstream::pos_type size = ifile.seekg(0, std::ios_base::end).tellg();
ifile.seekg(0, std::ios_base::beg);

string temp;
temp.resize(size);
ifile.read((char*)temp.data(), temp.size());

/*********************************\
\*********************************/

EAX< Blowfish >::Encryption e1;
e1.SetKeyWithIV(key, key.size(), iv, sizeof(iv));

StringSource ss1(temp, true,
                 new AuthenticatedEncryptionFilter( e1,
                     new FileSink(efilename.c_str())
                 ) );

/*********************************\
\*********************************/

EAX< Blowfish >::Decryption d2;
d2.SetKeyWithIV( key, key.size(), iv, sizeof(iv) );

FileSource fs2(efilename.c_str(), true,
               new AuthenticatedDecryptionFilter(d2,
                   new FileSink(rfilename.c_str()),
                   AuthenticatedDecryptionFilter::THROW_EXCEPTION
               ) );

这篇关于如何读取图像到加密Crypto ++的字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆