La salida de Crypto ++ pbkdf2 es diferente de Rfc2898DeriveBytes (C #) y crypto.pbkdf2 (JavaScript)

Así que estoy tratando de usar PBKDF2 para derivar una clave dada una cadena base64 de 256 bits. Puedo usar Rfc2898DeriveBytes de C # y pbkdf2 de node-crypto para derivar la misma clave, sin embargo, no puedo decir lo mismo para C ++. No estoy seguro si estoy haciendo conversiones incorrectas o si estoy usando las funciones de manera incorrecta, pero les dejaré que lo vean.

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=
 */

Bueno, la pregunta principal es, ¿qué estoy haciendo mal en la biblioteca CryptoPP de C ++ para que no obtenga el mismo valor?

SOLUCIÓN: Estaba siendo tonto ... Me di cuenta después de revisar mi implementación original en JavaScript y C #. Perdí un paso crucial que por alguna razón no recibí una queja del compilador. Básicamente, el problema era que no convertí la clave utilizada en datos de bytes antes del algoritmo en mi implementación de C # y JS ...

De todos modos, la solución propuesta es: no codifique a las 4 AM y asegúrese de ser coherente en su conversión de datos ...

Supongo que el TL; DR de esto es que C # y JS estaban convirtiendo mi clave de 256 bits en datos de bytes como ASCII en lugar de la conversión de base64.

Respuestas a la pregunta(1)

Su respuesta a la pregunta