Я использую 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. Это то, где я делаю это неправильно? Длина сгенерированного открытого ключа?
Ваш открытый ключ имеет длину 52 байта — он слишком короткий. Как вы это генерируете?
ToPublicKeyFromBlob()
метод является ярлыком для return CngKey.Import(byteArray, CngKeyBlobFormat.EccPublicBlob)
— он работает только с ключами на основе Ecc и сгенерированными .NET. ад использует ключи ECC по кривой P384, что означает, что каждый открытый ключ будет иметь 48 * 2 = 96 байтов плюс 8 байтов заголовка (как описано Вот), всего 104 байта.
Андрей, ад использует только кривую NIST P-384. Что еще более важно, единственные кривые, поддерживаемые платформой .NET (из коробки), это P-256, P-384 и P-521.