Получить шестнадцатеричную зашифрованную строку в AES 256 Crypto++

Я пытаюсь реализовать алгоритм AES 256, используя Crypto++ в MS Visual Studio. Операционная система — Windows 7 (64 бит).

Мне нужно предоставить ключ в виде шестнадцатеричной строки, пароль в виде строки и, наконец, я хочу, чтобы зашифрованная строка также была шестнадцатеричной строкой.

Вот что я пытаюсь сделать:

Мой метод шифрования:

std::string encrypt(const std::string &password)
{
    std::string plain = password;
    std::string ciphertext;
    char * decodedKey= "729308A8E815F6A46EB3A8AE6D5463CA7B64A0E2E11BC26A68106FC7697E727E37011";

    byte key[ CryptoPP::AES::MAX_KEYLENGTH ], iv[ CryptoPP::AES::BLOCKSIZE ];
    CryptoPP::StringSource( reinterpret_cast<const char *>(decodedKey), true,
              new  CryptoPP::HashFilter(*(new  CryptoPP::SHA256), new CryptoPP::ArraySink(key, CryptoPP::AES::MAX_KEYLENGTH)) );
    memset( iv, 0x00,  CryptoPP::AES::BLOCKSIZE );

    CryptoPP::CBC_Mode<CryptoPP::AES>::Encryption Encryptor( key, sizeof(key), iv );
    CryptoPP::StringSource( plain, true, new CryptoPP::StreamTransformationFilter( Encryptor,
              new CryptoPP::HexEncoder(new CryptoPP::StringSink( ciphertext ) ) ) );

    std::cout<<"Ciphertext:" << ciphertext;
    return ciphertext;
}

Из основного метода

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

    encrypt("test");
    return 0;
}

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


person Parth Doshi    schedule 20.02.2014    source источник
comment
Помимо всего этого крипто++ — каков ваш главный вопрос? Как перевести из альфа-строки в шестнадцатеричную строку с двумя цифрами на символ?   -  person PaulMcKenzie    schedule 20.02.2014
comment
Попробуйте что-нибудь сделать с возвращаемым значением вашей функции, помимо того, чтобы позволить ему упасть в эфир?   -  person WhozCraig    schedule 20.02.2014


Ответы (1)


Мне нужно предоставить ключ в виде шестнадцатеричной строки, пароль в виде строки и, наконец, я хочу, чтобы зашифрованная строка также была шестнадцатеричной строкой.

Это описано в вики Crypto++ (там много примеров, готовых для копирования/вставки). Из Сценарии и строки HexDecoder:

Иногда в список рассылки будут поступать вопросы о перекрестной проверке. Например, см. AES CTR Chiper. Различный вывод между PHP-mcrypt и Crypto++. В вопросе строки PHP-mcrypt используются следующим образом:

$key = "1234567890123456789012345678901234567890123456789012345678901234";
$key = pack("H".strlen($key), $key);
$iv = "1111111111222222222233333333334444444444555555555566666666667777";
$iv = pack("H".strlen($iv), $iv);

Один из самых простых способов избежать опечаток — использовать Copy/Paste и HexDecoder:

string encodedKey = "1234567890123456789012345678901234567890123456789012345678901234";
string encodedIv = "1111111111222222222233333333334444444444555555555566666666667777";
string key, iv;

StringSource ssk(encodedKey, true /*pumpAll*/,
    new HexDecoder(
        new StringSink(key)
    ) // HexDecoder
); // StringSource

StringSource ssv(encodedIv, true /*pumpAll*/,
    new HexDecoder(
        new StringSink(iv)
    ) // HexDecoder
); // StringSource

После запуска приведенного выше кода key и iv представляют собой шестнадцатеричные (т. е. двоичные) строки, а не печатные (т. е. ASCII) строки.

person jww    schedule 20.02.2014
comment
Пожалуйста, можете проверить этот вопрос: stackoverflow.com/questions/21965102/ .. в нем указана реальная проблема - person Parth Doshi; 23.02.2014
comment
Parth — я не знаток Java и редко с ним работаю. Разработчики Java могли бы лучше ответить на ваши вопросы. - person jww; 23.02.2014
comment
да, HexDecoder работал нормально, и проблема решена. Советую всем .. пожалуйста, обратитесь к документации Crypto++ - person Parth Doshi; 25.02.2014