2013-05-10 3 views
0

Я пытаюсь написать 2 различные функции для шифрования и дешифрования данных с использованием AES в криптоппе. Я хочу передать зашифрованный текст в качестве параметра функции дешифрования. Однако в функции дешифрования он получает некоторые специальные символы, поскольку шифртекст &, таким образом, не дешифрует правильно. Пожалуйста помоги.Pass AES ciphertext как параметр

// -- AES encryption function ---------- 
void Security_packetAgent::encryption(char out[]) 
{ 
    std::string plaintext = out; 
    std::string ciphertext = ""; 

    CryptoPP::AES::Encryption aesEncryption(key, CryptoPP::AES::DEFAULT_KEYLENGTH); 
    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() + 1); 
    stfEncryptor.MessageEnd(); 

    std::cout << "Cipher Text (" << ciphertext.size() << " bytes)" << std::endl; 

    for(int i = 0; i < ciphertext.size(); i++) 
    { 
     std::cout << "0x" << std::hex << (0xFF & static_cast<byte>(ciphertext[i])) << " "; 
    } 

    std::cout<<"\nMessage encrypted ..."; 
    std::cout << std::endl << std::endl; 
    sprintf(out, "%s", ciphertext.c_str()); 
    printf("Final Data: %s : %s ", out, reinterpret_cast<const unsigned char*>(ciphertext.c_str())); 
} 

// ---- AES decryption ------------------ 
void Security_packetAgent::decryption(char out[]) 
{ 
    cout<<"\nCipher recieved: "<<out; 
    std::cout<<"\nEntered decryption .."; 
    std::string ciphertext = out; 
    std::string decryptedtext; 

    cout<<"\nCipher recieved: "<<reinterpret_cast<const unsigned char*>(ciphertext.c_str()); 
    CryptoPP::AES::Decryption aesDecryption(key, CryptoPP::AES::DEFAULT_KEYLENGTH); 
    CryptoPP::CBC_Mode_ExternalCipher::Decryption cbcDecryption(aesDecryption, iv); 

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

    std::cout << "Decrypted Text: " << std::endl; 
    std::cout << decryptedtext; 
    std::cout << std::endl << std::endl;  
} 
+0

Можете ли вы предоставить образец кода, воспроизводящий проблему? Кроме того, покажите, что такое ошибки и какой результат вы ожидали. –

+0

dauphic ответил на ваш вопрос. Вы можете подумать о том, чтобы предоставить ему любезность отметить его ответ. – jww

ответ

3

Вы не должны строить std::string из char*, если char* указывает на то, что не является текстовая строка, такие как зашифрованные данные.

std::string ciphertext = out; 

строительство ciphertext собирается прекратить копирование из out, как только он достигает 0 байт. Вместо этого вам нужно также передать в длину зашифрованных данных и использовать конструктор std::string(const char* data, size_t size).

std::string ciphertext(out, outSize); 

В качестве альтернативы вы также можете использовать конструктор, начинающий и конец итератора.

Смежные вопросы