C ++正确写入/读取十六进制值(CryptoPP)

时间:2010-07-08 07:41:03

标签: c++ console-application crypto++

我正在尝试运行一个使用AES加密和解密的程序。

(来自http://www.codeproject.com/KB/security/AESProductKey.aspx

// From aestest1.cpp

// Runtime Includes
#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>
#include <string>
#include "stdafx.h"

// Crypto++ Includes
#include "cryptlib.h"

#include "aes.h"        // AES

#include "modes.h"      // CBC_Mode< >

#include "filters.h"    // StringSource

using namespace std;

int main(int argc, char* argv[]) {

// Key and IV setup
byte key[ CryptoPP::AES::DEFAULT_KEYLENGTH ], 
      iv[ CryptoPP::AES::BLOCKSIZE ];

::memset( key, 0x01, CryptoPP::AES::DEFAULT_KEYLENGTH );
::memset(  iv, 0x01, CryptoPP::AES::BLOCKSIZE );

// Message M
string PlainText = "Hello AES World";

// Debug
cout << "Plain Text:" << endl;
cout << "  '" << PlainText << "'" << endl;
cout << endl;

// Cipher Text Sink
string CipherText;

// Encryption
CryptoPP::CBC_Mode<CryptoPP::AES>::Encryption
    Encryptor( key, sizeof(key), iv );

CryptoPP::StringSource( PlainText, true,
    new CryptoPP::StreamTransformationFilter( Encryptor,
        new CryptoPP::StringSink( CipherText )
    ) // StreamTransformationFilter
); // StringSource


///////////////////////////////////////
//                DMZ                //
///////////////////////////////////////
//Write data
ofstream write ("file.txt", ios::out | ios::binary);
write.write((char*)key,sizeof(key));
write.write((char*)iv,sizeof(iv));
int at = CipherText.length();
write.write(CipherText.c_str(),at); 
write.close();
CipherText.erase();
//Using new key and iv later;
byte key1[ CryptoPP::AES::DEFAULT_KEYLENGTH ], 
     iv1[ CryptoPP::AES::BLOCKSIZE ];

//Read data
ifstream read ("file.txt", ios::in | ios::binary);

read.seekg (0, ios::end);
int fsize = read.tellg();
read.seekg (0, ios::beg);

read.read((char*)key1,sizeof(key));
read.read((char*)iv1,sizeof(iv));




int toRead = fsize - sizeof(key) - sizeof(iv);
vector<char> bData(toRead);
read.read(&bData[0],toRead);

read.close();
// Recovered Text Sink
string RecoveredText;

// Decryption
CryptoPP::CBC_Mode<CryptoPP::AES>::Decryption
    Decryptor( key1, sizeof(key1), iv1 );

CryptoPP::StringSource( &bData[0], true,
    new CryptoPP::StreamTransformationFilter( Decryptor,
        new CryptoPP::StringSink( RecoveredText )
    ) // StreamTransformationFilter
); // StringSink

// Debug
cout << "Recovered Text:" << endl;
cout << "  '" << RecoveredText << "'" << endl;
cout << endl;
system("pause");
return 0;

} 因此,我无法编写代码,这将正确地完成注释中提到的内容(在DMZ之后,在流开始的地方)。提前谢谢。

1 个答案:

答案 0 :(得分:2)

您需要禁用文字处理,这会混淆换行符。

尝试

ofstream write ("text.txt", ios::out | ios__binary);

ifstream read ("text.txt", ios::in | ios::binary);