Как преобразовать открытый ключ RSA в строку, используя BouncyCastle c # - PullRequest
1 голос
/ 03 мая 2019

Я пытаюсь сохранить открытый ключ RsaKeyParameter в базу данных SQL.Я получаю сообщение об ошибке, что Bouncy Castle не может преобразовать RsaKeyParameters в байты.

Использование BouncyCastle c #.

Я создал пару ключей RSA, извлек частный и открытый ключи в переменные.Затем мне нужно сохранить открытый ключ для проверки на более позднем этапе в приложении.

Я нашел сообщение о преобразовании в байты, а затем в строку следующим образом:

byte[] serializedPublicBytes = 
publicKeyInfo.ToAsn1Object().GetDerEncoded();
string serializedPublic = Convert.ToBase64String(serializedPublicBytes);

, но это не такМне нравится ToAsn1Object.Просто добавьте, что это пример, я знаю, что мои имена переменных разные.

        RsaKeyPairGenerator rsaKeyPairGen = new RsaKeyPairGenerator();
        rsaKeyPairGen.Init(new KeyGenerationParameters(new SecureRandom(), 2048));
        AsymmetricCipherKeyPair keyPair = rsaKeyPairGen.GenerateKeyPair();

        RsaKeyParameters PrivateKey = (RsaKeyParameters)keyPair.Private;
        RsaKeyParameters PublicKey = (RsaKeyParameters)keyPair.Public;

Открытый ключ должен быть байтовым, а затем строковым, чтобы сохранить его в базе данных.

1 Ответ

0 голосов
/ 06 мая 2019

Открытый ключ может быть преобразован в формат X.509 / SubjectPublicKeyInfo-ASN.1 / DER с использованием BouncyCastle.Это двоичный формат, из которого можно сгенерировать строку с использованием Base64-кодировки:

byte[] publicKeyDer = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicKey).GetDerEncoded();
String publicKeyDerBase64 = Convert.ToBase64String(publicKeyDer);

Здесь publicKey - открытый ключ, хранящийся в экземпляре RsaKeyParameters.Обратный процесс:

byte[] publicKeyDerRestored = Convert.FromBase64String(publicKeyDerBase64);
RsaKeyParameters publicKeyRestored = (RsaKeyParameters)PublicKeyFactory.CreateKey(publicKeyDerRestored);

Подробные описания форматов X.509 / SubjectPublicKeyInfo- и ASN.1 / DER можно найти здесь и здесь соответственно.

Оба, publicKeyDer (в виде шестнадцатеричной строки) и publicKeyDerBase64, могут отображаться в редакторе ASN.1, например, https://lapo.it/asn1js/

Другой подход заключается всоздайте PEM-формат, используя класс Org.BouncyCastle.OpenSsl.PEMWriter - и Org.BouncyCastle.OpenSsl.PEMReader (не путать с Org.BouncyCastle.Utilities.IO.Pem.PEMWriter / PEMReader):

TextWriter textWriter = new StringWriter();
PemWriter pemWriter = new PemWriter(textWriter);
pemWriter.WriteObject(publicKey);
pemWriter.Writer.Flush();
String publicKeyPEM = textWriter.ToString();

, и наоборот:

TextReader textReader = new StringReader(publicKeyPEM);
PemReader pemReader = new PemReader(textReader);
RsaKeyParameters publicKeyRestored = (RsaKeyParameters)pemReader.ReadObject();

PEM-формат - это, по сути, текстовое представление DER-формата, использующее неявное Base64-кодирование (например, объясненное здесь ) и заголовок (-----BEGIN PUBLIC KEY-----) и нижний колонтитул (-----END PUBLIC KEY-----).).Следовательно, кодированная в Base64 часть идентична (если разрывы строк игнорируются) как для publicKeyDerBase64, так и publicKeyPEM.

...