Получите закрытый ключ X509Certificate2 без экспорта как CngKeyC#

Место общения программистов C#
Ответить
Anonymous
 Получите закрытый ключ X509Certificate2 без экспорта как CngKey

Сообщение Anonymous »

Я использую ncrypt.dll для создания хэша с использованием MD5 + SHA1 для DTLS следующим образом:

Код: Выделить всё

private static class NCryptInterop
{
private struct BCRYPT_PKCS1_PADDING_INFO
{
internal IntPtr pszAlgId;
}

[Flags]
private enum NCryptSignFlags
{
BCRYPT_PAD_PKCS1 = 2,
}

[DllImport("ncrypt.dll")]
private static extern int NCryptSignHash(
SafeNCryptKeyHandle hKey,
ref BCRYPT_PKCS1_PADDING_INFO padding,
ref byte pbHashValue,
int cbHashValue,
ref byte pbSignature,
int cbSignature,
out int cbResult,
NCryptSignFlags dwFlags);

internal static byte[] SignHashRaw(CngKey key, byte[] hash, int keySize)
{
int keySizeBytes = keySize / 8;
byte[] signature = new byte[keySizeBytes];

// The Handle property returns a new object each time.
using (SafeNCryptKeyHandle keyHandle = key.Handle)
{
// Leave pszAlgId NULL to "raw sign"
BCRYPT_PKCS1_PADDING_INFO paddingInfo = new BCRYPT_PKCS1_PADDING_INFO();

int result = NCryptSignHash(
keyHandle,
ref paddingInfo,
ref hash[0],
hash.Length,
ref signature[0],
signature.Length,
out int cbResult,
NCryptSignFlags.BCRYPT_PAD_PKCS1);

if (result != 0)
{
throw new CryptographicException(result);
}

if (cbResult != signature.Length)
{
throw new InvalidOperationException();
}

return signature;
}
}
}
который я получил из ответа на свой предыдущий вопрос много лет назад (спасибо, bartonjs!). Для этого мне нужен CngKey. В настоящее время я получаю закрытый ключ следующим образом:

Код: Выделить всё

((RSACng)certificate.PrivateKey).Key;
который, как я знаю, уже устарел. Я считаю, что новый способ:

Код: Выделить всё

certificate.GetRSAPrivateKey();
но мне еще предстоит найти способ конвертировать RSA в CngKey без экспорта сертификата. К сожалению, сертификат не мой, и я не могу его контролировать, поэтому я не могу просто сделать его экспортируемым, и у меня нет пароля.
В .NET6 и 7 получение закрытого ключа устаревший способ прекрасно работает. Однако в .NET8 что-то изменилось, и я получаю исключение «Невозможно привести объект типа «System.Security.Cryptography.RSABCrypt» к типу «System.Security.Cryptography.RSACng».
Можно ли в .NET8 каким-либо образом получить закрытый ключ в виде CngKey без необходимости экспорта? Или, может быть, ncrypt.dll может принимать что-то кроме CngKey, которое я могу получить без необходимости экспорта закрытого ключа?

Подробнее здесь: https://stackoverflow.com/questions/784 ... -as-cngkey
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»