Well, the main questions: what am I doing wrong in the CryptoPP C ++ library, that it does not get the same value.
Well, I donโt think you are doing something wrong in C ++ with Crypto ++ and PBKDF2. I think other libraries configure the settings differently, or they are a few non-standard.
I managed to get IATF test vectors for PBKDF2 using Crypto ++:
// 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; }
And starting the program:
$ ./cryptopp-test.exe Derived: 0C60C80F961F0E71F3A9B524AF6012062FE037A6
I think the first thing you need to do is verify that the C # and Javascript implementations use the same character encoding as Crypto ++ and IETF.
If not, then check if C # and Javascript use the target byte. Crypto ++ does not, and you can see the implementation on pwdbased.h .
Unfortunately, something is slightly different for me when I type in the parameters:
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; }
Execution Result:
$ ./cryptopp-test.exe pw size: 32 iv size: 16 Derived: F6D4725C2A102D36D438BAA6DCCE0E3C64FA376E60FA8D0AD3DD1F569FE17E59