Открытый ключ может быть преобразован в формат 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
.