Próbuję użyć PBKDF2 do wyprowadzenia klucza z łańcuchem o długości 256 bitów. Jestem w stanie użyć C# 's Rfc2898DeriveBytes i pbkdf2 węzła-crypto, aby wyprowadzić ten sam klucz, jednak nie mogę powiedzieć tego samego dla C++. Nie jestem pewien, czy robię niewłaściwe konwersje lub niewłaściwie wykorzystuję funkcje, ale pozwolę wam na to spojrzeć.Wyjście Crypto ++ pbkdf2 różni się od Rfc2898DeriveBytes (C#) i 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=
*/
dobrze główne pytania o to, co robię źle na C++ 's CryptoPP biblioteki, która nie jest uzyskując tę samą wartość.
ROZWIĄZANIE: Byłem głupi ... I jest realizowany po przeglądzie moje oryginalne wykonanie na JavaScript i C# Tęskniłem za ważny krok, który z jakiegoś powodu nie dostał skarżą się od kompilatora. Zasadniczo problemem było to, że nie konwertować klucz używany do danych bajtowych przed algorytmu na moim C# i wdrożenia JS ...
Anyways, proponowane rozwiązanie jest: nie kod o 4 rano i upewnij się Konsekwentnie na konwersję danych ...
Chyba TL; DR to, że C# i JS konwertowały mój klucz 256-bitowy do danych bajtowych jako ASCII zamiast do konwersji base64.
pan stwierdził obserwacji, ale trzeba nie zadał pytania. Jakie jest Twoje pytanie? A tak przy okazji, czy uruchomiłeś testowe wektory/znane testy odpowiedzi przeciwko implementacjom, aby zobaczyć, które dają prawidłowe i błędne odpowiedzi? – jww
Cóż, główne pytania brzmią: co robię źle w CryptoPP C++, że nie wywodzi się z tej samej wartości. Nie skonfigurowałem środowiska, aby przetestować bibliotekę indywidualnie. Jednak w każdym języku mam również równoważną metodę deszyfrowania, która pobiera te wartości bajtów i odszyfrowuje wiadomość. Jedynym, który nie zwraca właściwej wartości jest C++, ale jeśli przekażę pochodnąKey z dowolnego z innych języków i kontynuuję mój deszyfrowanie, wynik jest poprawny. W tej chwili biblioteka cryptopp jest używana w połączeniu z Cocos2dx C++ na platformie Android, więc denerwujące do debugowania – Chebn