Я реализую 192-битную подпись ECDSA на C # с помощью BouncyCastle. Это было указано в тексте моим заказчиком. Они прислали мне спецификацию OpenSSL после того, как я начал внедрять в BouncyCastle. Теперь у меня проблемы с перемещением ключей между OpenSSL и BouncyCastle. Я думаю, что я что-то упускаю из виду, и прошу вашей помощи, чтобы понять, как ECDSA 192 работает в двух библиотеках.
Первая строка спецификации:
openssl ecparam -name secp192r1 -genkey -noout -out priv.pem
Полученный файл priv.pem содержит строку Base64, которая декодируется до 97 байт. Когда я передаю этот ключ BouncyCastle с использованием 192-битной кривой, я получаю исключения.
ECDomainParameters spec = GetEcdsaCurveParamsForInit();
// D is the Private Key
BigInteger d = new BigInteger(tbSigKeyHex.Text, 16);
ECPrivateKeyParameters sKey = new ECPrivateKeyParameters("ECDSA", d, spec);
ECPublicKeyParameters vKey = GL_ECKeyPairGenerator.GetCorrespondingPublicKey(sKey); // EXCEPT on d > 24byte max value
Конкретным исключением является System.InvalidOperationException в этой строке EcKeyPairGenerator.cs:
ECPoint q = новый FixedPointCombMultiplier (). Multiply (ec.G, privKey.D);
Если я усекаю входную строку Ascii-hex до 48 байтов, так что privKey.D никогда не превышает максимальное значение в 24 байта, все работает нормально. Но теперь мой код отличается от спецификации.
Я также заметил, что BouncyCastle создает 24-байтовые ключи с 192-битными кривыми:
AsymmetricCipherKeyPair keyPair = GenerateKeys(192); // bit length selects curve in GL_ECKeyPairGenerator
ECPrivateKeyParameters sKey = (ECPrivateKeyParameters)keyPair.Private;
string szD = sKey.D.ToString(16);
PrintToFeedback(string.Format("Generated Private D Key {0} bytes: {1}", szD.Length/2, szD));
ECPublicKeyParameters vKey = (ECPublicKeyParameters)keyPair.Public;
распечатывает:
Сгенерированный закрытый ключ D 24 байта: 92e67f4a42c3031349f7e88d082a8e1f122eaee8d8b0823d
Когда я ломаю и проверяю sKey, я не вижу ничего похожего на 97-байтовое число. Я вижу, как 24 байта соответствуют 192 битам, но не 97. Поскольку мой клиент говорит, что OpenSSL является спецификацией, я должен предположить, что это правильно. Но я немного заблудился. Перед тем, как они прислали мне спецификацию OpenSSL, я убедился, что ECDSA192 использует 24-байтовые закрытые ключи (и 48-байтовые открытые ключи, более или менее), но этот 97-байтовый ключ OpenSSL снова ставит все под сомнение. Я специализируюсь на технологиях реального времени и RFID, а не в криптографии.
Может ли кто-нибудь помочь мне понять, как использовать байтовый ключ OpenSSL 97 с BouncyCastle? Или мне просто разорвать BouncyCastle и переписать с помощью OpenSSL.Net?
Я работаю в окне Cygwin bash под Win10, версия openssl:
OpenSSL 1.0.2o 27 марта 2018 г.
Спасибо.