До Chrome 80 пароли и файлы cookie могут быть расшифрованы только с помощью функции WindowsAPI CryptUnprotectData
(например, используется здесь ). Но с Chrome 80 безопасность изменилась, например, объяснение здесь . Но у меня есть некоторые трудности при переходе от теории к практике.
Как уже объяснялось, я начал с получения ключа из файла Local State
. Я декодирую его из base64 и расшифровываю с помощью cryptUnprotectData
. Но мне сложно понять, что будет дальше. Я не понимаю, что подразумевает история 12-byte random IV data
и v10
, и как это сделать с практической точки зрения. Как работает этот шаг? Я пробовал использовать Sodium lib, но это не удалось:
void decrypt(const unsigned char *cryptedPassword, std::string &masterKey){
std::string str{reinterpret_cast<const char*>(cryptedPassword)};
const std::string iv = str.substr(3, 12);
const std::string payload{str.substr(15)};
unsigned char decrypted[payload.length()];
unsigned long long decrypted_len;
crypto_aead_aes256gcm_decrypt(
decrypted, &decrypted_len,
NULL,
reinterpret_cast<const unsigned char *>(payload.c_str()), payload.length(),
reinterpret_cast<const unsigned char *>(iv.c_str()), iv.length(),
reinterpret_cast<const unsigned char *>(crypto_aead_aes256gcm_NPUBBYTES),
reinterpret_cast<const unsigned char *>(masterKey.c_str())
);
std::cout << "decrypted: " << decrypted << std::endl;
}
Error C2131: expression did not evaluate to a constant (it is about the definition of decrypted)
Но я не могу установить, что он имеет постоянную величину, потому что длина неизвестна перед запуском.
Более того , Я очень сомневаюсь в успехе этого алгоритма, даже без этой проблемы.