为什么 Crypto++ pbkdf2 输出与 C# 中的 Rfc2898DeriveBytes 和 JavaScript 中的 crypto.pbkdf2 不同

问题描述 投票:0回答:1

因此,我尝试使用 PBKDF2 在给定 256 位的 Base64 字符串的情况下派生密钥。我可以使用 C# 的 Rfc2898DeriveBytes 和 node-crypto 的 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=
 */

我在 C++ 的 CryptoPP 库上做错了什么,它没有派生相同的值?

c++ rijndael crypto++ pbkdf2 hmacsha1
1个回答
3
投票

主要问题是,我在 C++ 的 CryptoPP 库上做错了什么,它没有派生相同的值。

嗯,我认为你在 C++ 中使用 Crypto++ 和 PBKDF2 没有做任何错误。我认为其他库设置参数的方式不同,或者它们有点不标准。

我能够使用 Crypto++ 获得 IETF 的 PBKDF2 测试向量:

// From https://www.ietf.org/rfc/rfc6070.txt // PKCS #5: Password-Based Key Derivation Function 2 (PBKDF2) Test Vectors // // Input: // P = "password" (8 octets) // S = "salt" (4 octets) // c = 1 // dkLen = 20 // // Output: // DK = 0c 60 c8 0f 96 1f 0e 71 // f3 a9 b5 24 af 60 12 06 // 2f e0 37 a6 (20 octets) int main(int argc, char* argv[]) { byte password[] ="password"; size_t plen = strlen((const char*)password); byte salt[] = "salt"; size_t slen = strlen((const char*)salt); int c = 1; byte derived[20]; PKCS5_PBKDF2_HMAC<CryptoPP::SHA1> pbkdf2; pbkdf2.DeriveKey(derived, sizeof(derived), 0, password, plen, salt, slen, c); string result; HexEncoder encoder(new StringSink(result)); encoder.Put(derived, sizeof(derived)); encoder.MessageEnd(); cout << "Derived: " << result << endl; return 0; }

程序的运行:

$ ./cryptopp-test.exe Derived: 0C60C80F961F0E71F3A9B524AF6012062FE037A6


我认为您应该做的第一件事是验证 C# 和 Javascript 实现是否使用与 Crypto++ 和 IETF 相同的字符编码。

如果不是这样,请检查 C# 和 Javascript 是否使用目的字节。 Crypto++ 没有,您可以在

pwdbased.h. 查看实现


不幸的是,当我输入你的参数时,我得到的东西有点不同:

int main(int argc, char* argv[]) { string t1 = "Y1Mjycd0+O+AendY5pB58JMlmS0EmBWgjdj2r2KW6qQ="; string t2 = "5iFv54dCRq5icQbD7QHQzg=="; string pw, iv; Base64Decoder b1(new StringSink(pw)); b1.Put((const byte*)t1.data(), t1.size()); b1.MessageEnd(); Base64Decoder b2(new StringSink(iv)); b2.Put((const byte*)t2.data(), t2.size()); b2.MessageEnd(); int c = 100; byte derived[32]; cout << "pw size: " << pw.size() << endl; cout << "iv size: " << iv.size() << endl; PKCS5_PBKDF2_HMAC<CryptoPP::SHA1> pbkdf2; pbkdf2.DeriveKey(derived, sizeof(derived), 0, (byte*)pw.data(), pw.size(), (byte*)iv.data(), iv.size(), c); string result; HexEncoder encoder(new StringSink(result)); encoder.Put(derived, sizeof(derived)); encoder.MessageEnd(); cout << "Derived: " << result << endl; return 0; }

运行结果:

$ ./cryptopp-test.exe pw size: 32 iv size: 16 Derived: F6D4725C2A102D36D438BAA6DCCE0E3C64FA376E60FA8D0AD3DD1F569FE17E59
    
© www.soinside.com 2019 - 2024. All rights reserved.