所以我試圖用PBKDF2派生一個給定base64的256位字符串的密鑰。我能夠使用C#的Rfc2898DeriveBytes和node-crypto的pbkdf2來派生相同的密鑰,但是,我不能說C++是一樣的。我不確定我是否進行了錯誤的轉換或使用不當的功能,但我會讓你們看看它。Crypto ++ pbkdf2輸出不同於Rfc2898DeriveBytes(C#)和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=
*/
那麼主要問題是,我在做什麼錯了C++的CryptoPP 庫,這是不得出相同的價值。
SOLUTION:我是啞巴......我的評論後意識到我對JavaScript和C#最初實現我錯過了關鍵的一步,由於某種原因,我沒有得到來自編譯器抱怨。基本上,問題是,我並沒有轉換我的C#和JS實現算法之前使用的成字節數據的密鑰...
不管怎麼說,提出的解決方案是:凌晨4點不代碼,並確保將一致的你的數據轉換...
我想TL; DR的這是C#和JS正在轉換我的256位密鑰字節數據爲ASCII而不是base64轉換。
你說的觀察,但你必須沒有問一個問題。你的問題是什麼?順便說一下,你是否針對實現運行測試向量/已知答案測試,以查看哪些答案是正確的和錯誤的? – jww 2014-12-02 20:41:43
那麼主要的問題是,我在C++的CryptoPP庫中做了什麼錯誤,它不是得到相同的值。我沒有設置一個環境來單獨測試這個庫。然而,在每種語言中,我也有相應的解密方法,它們將採用這些字節值並解密消息。唯一沒有返回正確值的是C++,但如果我從其他任何語言中傳遞derivedKey並繼續解密,那麼輸出是正確的。現在,cryptopp庫正在與android平臺上的Cocos2dx C++結合使用,所以很難調試 – Chebn 2014-12-02 23:35:24