Quindi sto cercando di utilizzare PBKDF2 per derivare una chiave con una stringa base64 di 256 bit. Sono in grado di utilizzare Rfc2898DeriveBytes di C# e pbkdf2 di node-crypto per derivare la stessa chiave, tuttavia, non posso dire lo stesso per C++. Non sono sicuro se sto eseguendo conversioni errate o utilizzando le funzioni in modo improprio, ma ti lascio guardare da loro.L'output di Crypto ++ pbkdf2 è diverso da Rfc2898DeriveBytes (C#) e crypto.pbkdf2 (JavaScript)
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=
*/
bene le questioni principali è, che cosa sto sbagliando su cryptopp libreria C++ 's che non è derivando lo stesso valore.
SOLUZIONE: Ero essere muto ... ho capito dopo la revisione mia implementazione originale su JavaScript e C# ho perso un passo cruciale che per qualche motivo non ho avuto un lamentano dal compilatore. In sostanza il problema era che non mi converto la chiave utilizzata in byte di dati prima che l'algoritmo sul mio C# e implementazione JS ...
In ogni modo, la soluzione proposta è: non il codice alle 4 del mattino e assicurarsi di essere coerente sulla conversione dei dati ...
Immagino che il TL; DR di questo è che C# e JS stava convertendo la mia chiave a 256 bit in dati byte come ASCII invece di conversione base64.
Hai dichiarato un'osservazione, ma si deve non ha fatto una domanda Qual è la tua domanda? A proposito, hai lanciato vettori di test/test di risposta noti contro le implementazioni per vedere quali risposte giuste e sbagliate? – jww
Beh, le domande principali sono, cosa sto facendo male sulla libreria CryptoPP di C++ che non sta ottenendo lo stesso valore. Non ho installato un ambiente per testare individualmente la libreria. Tuttavia su ogni lingua ho anche il metodo di decrittazione equivalente che prenderà quei valori di byte e decodificherà un messaggio. L'unico che non restituisce il valore corretto è in C++, ma se passo la derivata da uno degli altri linguaggi e continuo la mia decifratura, l'output è corretto. In questo momento la libreria di cryptopp viene utilizzata in combinazione con Cocos2dx C++ sulla piattaforma Android, così fastidiosa da eseguire il debug di – Chebn