Данные DPAPI зашифрованы. Зашифрованные данные DPAPI начинаются с шестнадцатеричного числа с байтовой последовательностью 0x01000000D08C9DDF0115D1118C7A00C04FC297EB
или Base64, кодированной с AQAAANCMnd8BFdERjHoAwE/Cl+
, здесь .
Для расшифровки с помощью C# может использоваться класс ProtectedData
или, точнее, метод stati c ProtectedData.Unprotect
. Если значение энтропии не известно, s_aditionalEntropy
, следует попробовать null
. Более подробную информацию об этом параметре можно найти здесь .
Если зашифрованные данные кодируются в Base64, они должны быть декодированы в Base64 перед расшифровкой:
using System.Security.Cryptography;
...
String encryptedDataB64 = "AQAAANCMnd8BFdERjHoAwE/Cl+...";
byte[] encryptedData = Convert.FromBase64String(encryptedDataB64);
byte[] s_aditionalEntropy = null;
byte[] data = ProtectedData.Unprotect(encryptedData, s_aditionalEntropy, DataProtectionScope.CurrentUser);
Более подробный пример можно найти в связанной документации. Расшифровка не ограничена. NET, но также возможна для других языков при условии, что существует соответствующий DPAPI-упаковщик, например, в Python с win32crypt.CryptUnprotectData
или в Java с Java DPAPI .
Вот консольная программа, которая получает строковое представление Unicode для декодированных данных:
using System;
using System.Security.Cryptography;
namespace ConsolePassDecrypter {
class Program {
static void Main(string[] args) {
string encryptedPass = "AQAAANC[...]";
var decryptedPassBytes = ProtectedData.Unprotect(Convert.FromBase64String(encryptedPass), null, DataProtectionScope.LocalMachine);
Console.WriteLine("Decrypted pass: " + System.Text.Encoding.Unicode.GetString(decryptedPassBytes));
}
}
}