cryptoPP AES,奇怪的加密输出

时间:2014-08-04 10:27:02

标签: c++ encryption aes crypto++

我是新的并测试了cryptoPP,我正在尝试使用cryptoPP一次加密一个字符,我注意到一些字符没有正确加密并表现出奇怪的行为,如多于或少于16个字符,或奇怪的安排。

我使用的代码是:

std::string data;
std::cin >> data;

std::string plaintext = data;

std::string ciphertext;
byte key[16 ] = {1,2,3,5,6,7,8,9,0,1,2,3,4,5,6} ; 
byte iv[ 16 ]={1,2,3,5,6,7,8,9,0,1,2,3,4,5,6};

memset( key, 0, sizeof(key));
memset( iv, 0, sizeof(iv) );

CryptoPP::AES::Encryption aesEncryption(key, 16);
CryptoPP::CBC_Mode_ExternalCipher::Encryption cbcEncryption( aesEncryption, iv );

CryptoPP::StreamTransformationFilter stfEncryptor(cbcEncryption, new CryptoPP::StringSink( ciphertext ) );
stfEncryptor.Put( reinterpret_cast<const unsigned char*>( plaintext.c_str() ), plaintext.length());
stfEncryptor.MessageEnd();

std::cout << ciphertext << std::endl;

std::ofstream file("d:\\log.txt", std::ofstream::out | std::ofstream::app);
file.write(ciphertext.c_str(), ciphertext.size());
file.close();

system("PAUSE");

解密代码如下:

byte key[16 ] = {1,2,3,5,6,7,8,9,0,1,2,3,4,5,6} ; 
byte iv[ 16 ]={1,2,3,5,6,7,8,9,0,1,2,3,4,5,6};

memset( key, 0, 16  );
memset( iv, 0, 16 );

std::string decryptedtext;
std::string test = get_file_contents("d:\\log.txt");

for (int i = 0; i < test.length() ; i += 16)  {

    std::string block = test.substr(i, i + 16);
    test.replace(i, i + 16, block);

    CryptoPP::AES::Decryption aesDecryption(key, 16);
    CryptoPP::CBC_Mode_ExternalCipher::Decryption cbcDecryption( aesDecryption, iv );

    CryptoPP::StreamTransformationFilter stfDecryptor(cbcDecryption, new CryptoPP::StringSink( decryptedtext ) );
    stfDecryptor.Put( reinterpret_cast<const unsigned char*>( block.c_str() ), 16 );
    stfDecryptor.MessageEnd();
}

std::cout << decryptedtext << std::endl;

std::ofstream fout("d:\\aesencrypt.txt");
fout << decryptedtext;

如果我没有键入某些字符,它就有效。当我输入字符“c”或“r”时出现问题,它变得很奇怪,当我解密时我无法解析16个字符。 解密将失败,因为加密文本未对齐或多于或少于16个字符。

1 个答案:

答案 0 :(得分:0)

我在没有写入/读取文件的情况下运行您的代码并且它可以正常运行。 (它适用于&#39; c&#39;以及&#39; r&#39;以及)。我将这两个片段合并为一个,删除了文件并分配了test = ciphertext;。也许问题在于读/写文件......

加密一个或多个字符无关紧要:如果输入不是块大小的倍数,CBC模式会添加填充。