Problems with CryptoPP C++ AES-256+Base64

筅森魡賤 提交于 2019-12-25 17:18:06

问题


could someone please tell me as to why the decryption starts to mess up. It works fine with short strings but it will mess up as you can see as it goes on. I THINK it has something to do with the string conversions.

std::string encrypt(const std::string& str_in, const std::string& key, const std::string& iv)
{

    std::string str_out;
    CryptoPP::CFB_Mode<CryptoPP::AES>::Encryption encryption((byte*)key.c_str(),    key.length(), (byte*)iv.c_str());
    CryptoPP::StringSource encryptor(str_in, true,
        new CryptoPP::StreamTransformationFilter(encryption,
            new CryptoPP::Base64Encoder(
                new CryptoPP::StringSink(str_out),
                false // do not append a newline
            )
        )
    );
    return str_out;
}


std::string decrypt(const std::string& str_in, const std::string& key, const std::string& iv)
{

    std::string str_out;    
    CryptoPP::CFB_Mode<CryptoPP::AES>::Decryption decryption((byte*)key.c_str(), key.length(), (byte*)iv.c_str());

    CryptoPP::StringSource decryptor(str_in, true,
        new CryptoPP::Base64Decoder(
            new CryptoPP::StreamTransformationFilter(decryption,
                new CryptoPP::StringSink(str_out)
            )
        )
    );
    return str_out;
}

This would be my output of the program

key:qwertyuiopasdfghjklzxcvbnmqwerty
IV:0123456789123456

STR:I do not like green eggs and ham I do not like them Sam-I-Am. Try them, try them, and you may! Try them and you may, I say. I will not eat them in a house, i will not eat them with a mouse,i will not eat them in a box i will not eat them with a fox, i will not eat them here of there i will not eat them anywhere, I do not like green eggs and ham i do not like them sam i am

STR_ENCRYPTED: ffyHj0rFQ0fn+jJcuZAznaioo+2oqqq+7ayjqe2lrKBF8s6QLdosGuIXzz/+vL+Bz
c3Nzc3Nzc3Nzc3Nzc3Nzd78yyKlu7P47yMSlKi7AhEyLs55pj9nZcEIPPadhISD4bQSGVWiWGbEMr7Ev
UCA+f9XQnePvQrfDwpegOLwYk8YyjXa9rLprhk7gAOU4LcdSRT6Udgohsolvrick6CSyUB9gJmkK6Ng1
MjSw4zBQkYMmt7oobkObBQY5XJHcTX5fVGXE5MJsVkQqGqAAKwD6jq4yZcG26WfA9LkwVgj0AwpxjKGV
VeYM/HKK9gzDA9u0/x0y/H4be8rpOYXPyrxXB8++iBL6cFz/Hq+y37uznfmqgAFdTkoW9FsHcGfmxZpJ
PYqrPKKwbt0EuMVGT1Z1F8kgvnwGiAg7/t7oa8RFStF3dsBd5LIYujx0nbnebSrkAFR0qMPzMDF4+Pox
n8KaEm6dtRYGEyYBfJWju+kWqug7aTtrKA=


STR_DECRYPTED: I do not like green eggs and ham I do not like t                y
 them, try them π♥┤k≥¬¿♀┼±;PIINry them and you 2ÜÅ║Bp╟↕┬╟ôM/=»éll not eat them ä
┘7£§σKΦsuQ^m_♦ll not eat them ┴W‼%lt├í┘╒(┐è╝°4ill not eat them≈u♦Z╦▬hR╬▼)♀òε↔┴ n
ot eat them wi▲1╣♠<5á"µi+┌≥τ<æ not eat them he+g═╚╕⌠σû∟í╨♀RV█ñll not eat them ÆΘ
..%♂▓╟Ñnot like them sam i amg]╠£▼n┬☺
Press any key to continue . . .

EDIT

This is how I call the code in my program, I use a liscensed version of Visual Studio 2012 on Windows 7.

std::string szEncryptionKey= "qwertyuiopasdfghjklzxcvbnmqwerty";;
std::string szEncryptionIV= "0123456789123456";
std::string str="I do not like green eggs and ham I do not like them Sam-I-Am. Try them, try them, and you may! Try them and you may, I say. I will not eat them in a house, i will not eat them with a mouse,i will not eat them in a box i will not eat them with a fox, i will not eat them here of there i will not eat them anywhere, I do not like green eggs and ham i do not like them sam i am";
std::string str_encrypted = encrypt(str, szEncryptionKey, szEncryptionIV);
std::string str_decrypted = decrypt(str_encrypted, szEncryptionKey, szEncryptionIV);

std::cout<< "str encrypted: "<<str_encrypted<<std::endl;
std::cout<< "str decrypted: "<<str_decrypted<<std::endl;

回答1:


For your information, this works fine on my end:

int main()
{
    std::string key = "qwertyuiopasdfghjklzxcvbnmqwerty";
    std::string IV = "0123456789123456";

    std::string input = "I do not like green eggs and ham I do not like them Sam-I-Am. Try them, try them, and you may! Try them and you may, I say. I will not eat them in a house, i will not eat them with a mouse,i will not eat them in a box i will not eat them with a fox, i will not eat them here of there i will not eat them anywhere, I do not like green eggs and ham i do not like them sam i am";

    //Your encrypt function
    auto encr = encrypt(input, key, IV);
    std::cout << encr << std::endl;  

    //Your decrypt function
    auto decr = decrypt(encr, key, IV);
    std::cout << decr << std::endl;
}

Also, I saw that you are calling new without an associated delete in your encrypt and decrypt functions. I assume this is because the library is taking care of deleting the objects on your behalf?

EDIT

noloader confirmed that Crypto++ does take care of deleting the objects. Thanks, noloader!




回答2:


I fixed it! I had changed the AES::BLOCKSIZE to 32 in the library because I was playing around with rijndael. I have now found the error thanks to an answer on sci.crypt that pointed out the errors were every 16 bytes (or the block size for AES)



来源:https://stackoverflow.com/questions/19130498/problems-with-cryptopp-c-aes-256base64

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!