Вывод Crypto ++ pbkdf2 отличается от Rfc2898DeriveBytes (C #) и crypto.pbkdf2 (JavaScript)

Поэтому я пытаюсь использовать PBKDF2 для получения ключа с заданной строкой base64 256 бит. Я могу использовать Rfc2898DeriveBytes в C # и pbkdf2 для узла-криптоза для получения одного и того же ключа, однако я не могу сказать то же самое для C ++. Я не уверен, что делаю неправильные преобразования или неправильно использую функции, но я позволю вам, ребята, взглянуть на это.

C ++

/* 256bit key */
string key = "Y1Mjycd0+O+AendY5pB58JMlmS0EmBWgjdj2r2KW6qQ=";
string decodedKey;
StringSource(key, true, new Base64Decoder(new StringSink(decodedKey)));
const byte* keyByte = (const byte*) decodedKey.data();

/* Generate IV */
/*
    AutoSeededRandomPool prng;
    byte iv[AES::BLOCKSIZE];
    prng.GenerateBlock(iv, sizeof(iv));
*/

/* FOR TESTING PURPOSES, HARDCODE IV */
string iv = "5iFv54dCRq5icQbD7QHQzg==";
string decodedIv;
StringSource(iv, true, new Base64Decoder(new StringSink(decodedIv)));
const byte* ivByte = (const byte *) decodedIv.data();

byte derivedKey[32];
PKCS5_PBKDF2_HMAC<CryptoPP::SHA1> pbkdf2;
pbkdf2.DeriveKey(derivedKey, 32, 0, keyByte, 32, ivByte, 16, 100);

/* 
 * derivedKey: 9tRyXCoQLTbUOLqm3M4OPGT6N25g+o0K090fVp/hflk=
 */

C #

// string key = "Y1Mjycd0+O+AendY5pB58JMlmS0EmBWgjdj2r2KW6qQ="; // need to convert it to byte data
string key = Convert.FromBase64String("Y1Mjycd0+O+AendY5pB58JMlmS0EmBWgjdj2r2KW6qQ="); // change above to this
RijndaelManaged symKey = new RijndaelManaged();
symKey.GenerateIV(); /* Assume hardcoded IV same as above */
Rfc2898DeriveBytes derivedKey = new Rfc2898DeriveBytes (key, symKey.IV, 100);

/*
 * derivedKey: dZqBpZKyUPKn8pU4pyyeAw7Rg8uYd6yyj3WI1MIJSyc=
 */

JS

// var key = "Y1Mjycd0+O+AendY5pB58JMlmS0EmBWgjdj2r2KW6qQ="; // need to convert it to byte data
var key = new Buffer("Y1Mjycd0+O+AendY5pB58JMlmS0EmBWgjdj2r2KW6qQ=", "base64"); // changed above to this
var iv = crypto.randomBytes(16);
iv = "5iFv54dCRq5icQbD7QHQzg=="; /* HARDCODE IV */
crypto.pbkdf2(key, iv, 100, 32, function(err, derivedKey) { }

/*
 * derivedKey: dZqBpZKyUPKn8pU4pyyeAw7Rg8uYd6yyj3WI1MIJSyc=
 */

Ну, главный вопрос в том, что я делаю неправильно в библиотеке CryptoPP C ++, что она не выводит одно и то же значение.

РЕШЕНИЕ: я был тупым ... Я понял, после проверки моей первоначальной реализации на JavaScript и C #, я пропустил важный шаг, который по какой-то причине мне не понравился компилятор. В основном проблема заключалась в том, что я не преобразовывал используемый ключ в байтовые данные до алгоритма в моей реализации на C # и JS ...

В любом случае, предлагаемое решение таково: не кодируйте в 4 часа утра и убедитесь в том, что вы преобразуете свои данные ...

Я предполагаю, что TL; DR этого заключается в том, что C # и JS преобразовывали мой 256-битный ключ в байтовые данные как ASCII вместо преобразования base64.

Ответы на вопрос(1)

Ваш ответ на вопрос