c # — cryptographicexception параметр неверен

Я использую ECDSA с шифрованием SHA1, потому что пытаюсь активировать лицензирование для настольного приложения. Для этого я использую сервер PHP, которому я даю информацию о ПК, и сервер дает мне открытый ключ, а затем я хочу проверить данные в C #.

Я сгенерировал этот открытый ключ в PHP:

"-----BEGIN PUBLIC KEY-----
MDIwEAYHKoZIzj0CAQYFK4EEAAYDHgAEKzL3PFVVo3IWftdEYmwiSO/4zULGM/wB
8BrLjQ==
-----END PUBLIC KEY-----";

Я использовал код отсюда http://securitydriven.net/inferno/ Чтобы добраться до этого

byte[] thePublicKeyToBytes = GetBytesFromPEM(thePublicKey2, "PUBLIC KEY");
CngKey dsaKeyPublic2 = thePublicKeyToBytes.ToPublicKeyFromBlob();

byte[] theRestToBytes = GetBytes(theRestInBinary);
byte[] meinData = GetBytes("Blabla");

using (var ecdsa = new ECDsaCng(dsaKeyPublic2) { HashAlgorithm = CngAlgorithm.Sha1 }) // verify DSA signature with public key
{
if (ecdsa.VerifyData(meinData, theRestToBytes)) MessageBox.Show("Signature verified.");
else MessageBox.Show("Signature verification failed.");
}

где процедура:

byte[] GetBytesFromPEM(string pemString, string section)
{
var header = String.Format("-----BEGIN {0}-----", section);
var footer = String.Format("-----END {0}-----", section);

var start = pemString.IndexOf(header, StringComparison.Ordinal) + header.Length;
var end = pemString.IndexOf(footer, start, StringComparison.Ordinal) - start;

if (start < 0 || end < 0)
{
return null;
}

return Convert.FromBase64String(pemString.Substring(start, end));
}

Проблема в том, что я получаю это исключение «cryptographicexception параметр неверен» в этой строке:

CngKey dsaKeyPublic2 = thePublicKeyToBytes.ToPublicKeyFromBlob();

Я не могу показать открытый ключ адского компьютера, но я увидел, что длина его ключа составляет 384. Это то, где я делаю это неправильно? Длина сгенерированного открытого ключа?

0

Решение

Ваш открытый ключ имеет длину 52 байта — он слишком короткий. Как вы это генерируете?
ToPublicKeyFromBlob() метод является ярлыком для return CngKey.Import(byteArray, CngKeyBlobFormat.EccPublicBlob) — он работает только с ключами на основе Ecc и сгенерированными .NET. ад использует ключи ECC по кривой P384, что означает, что каждый открытый ключ будет иметь 48 * 2 = 96 байтов плюс 8 байтов заголовка (как описано Вот), всего 104 байта.

1

Другие решения

Андрей, ад использует только кривую NIST P-384. Что еще более важно, единственные кривые, поддерживаемые платформой .NET (из коробки), это P-256, P-384 и P-521.

0

По вопросам рекламы [email protected]