Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CypTopp C++ AES-256+Base64的问题_C++_Encryption_Base64_Aes_Crypto++ - Fatal编程技术网

CypTopp C++ AES-256+Base64的问题

CypTopp C++ AES-256+Base64的问题,c++,encryption,base64,aes,crypto++,C++,Encryption,Base64,Aes,Crypto++,有人能告诉我为什么解密开始出错吗。它可以很好地处理短字符串,但随着它的继续,你会看到它会变得一团糟。我认为这与字符串转换有关 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>::Encrypti

有人能告诉我为什么解密开始出错吗。它可以很好地处理短字符串,但随着它的继续,你会看到它会变得一团糟。我认为这与字符串转换有关

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;
}
这将是我的程序输出

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 . . .
编辑 这就是我在程序中调用代码的方式,我在Windows7上使用了Visual Studio 2012的liscensed版本

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;

供您参考,这在我这边很有效:

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;
}

另外,我看到您正在调用new,而在加密和解密函数中没有关联的delete。我想这是因为库正在代表您删除对象

编辑


noloader确认Crypto++确实负责删除对象。谢谢,空载者

我修好了!我在库中将AES::BLOCKSIZE更改为32,因为我在玩rijndael。由于sci.crypt上的一个答案指出错误为每16字节或AES的块大小

我使用相同的密钥、相同的iv和相同的输入字符串尝试了您的加密和解密函数,并且在我的Windows 8机器上与Visual Studio 2012配合使用时一切正常。也许您可以向我们展示如何调用函数?我看到您在调用new时没有关联的delete…-这是在Crypto++中记录的行为。请参阅.Kevin-yes中的重要用法说明。如果对象接受指针,则该对象“拥有”该指针,并将删除指向的对象。如果对象接受引用,则您“拥有”该引用,并对引用的对象负责。请参阅中的重要用法说明。