Bouncy Castle, RSA: преобразование ключей в формат String

Я использую RSA (Bouncy Castle API) в своем проекте С#. Я создал пару ключей с помощью этого метода:

RsaKeyPairGenerator r = new RsaKeyPairGenerator();
r.Init(new KeyGenerationParameters(new SecureRandom(), 1024));
AsymmetricCipherKeyPair keys = r.GenerateKeyPair();

AsymmetricKeyParameter private_key = keys.Private;
AsymmetricKeyParameter public_key = keys.Public;

Теперь я хочу сохранить их в txt файле, но проблема в том, что я не могу преобразовать их в строковый формат. Я прочитал в другом сообщении, что ключи должны быть сериализованы с помощью:

PrivateKeyInfo k = PrivateKeyInfoFactory.CreatePrivateKeyInfo(private_key);
byte[] serializedKey = k.ToAsn1Object().GetDerEncoded();

Правильно ли это? Если да, что мне делать после этого? Просто преобразуйте их из байта [] в String?

Ответ 1

Вы также можете использовать PemWriter для хранения их в формате PEM:

TextWriter textWriter = new StringWriter();
PemWriter pemWriter = new PemWriter(textWriter);
pemWriter.WriteObject(keys.Private);
pemWriter.Writer.Flush();

string privateKey = textWriter.ToString();

Теперь privateKey содержит что-то вроде этого:

-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDFhB3xI1AzSMsKvt7rZ7gp2o/vd49zON89iL1ENvKkph7oFXa2
ew/hjzbAV33lHnFFlA/vA5SDCbggRyU1/SmjfuPJFEzFbgcPLuO1Sw6z+bWXiIFp
QNCOTIw11c0fbwk+kB2y4E1OkLv5f9atlNlekb4wBn8bMbFYtu6LGWjkFQIDAQAB
AoGANPoMteLM3hSGMSmkzOsS4Fb5CDe/SB5W8kA805ERX8wWuhUXtDYpukwZWVme
MNgLdagS5f7F1KfEtROgDW0Lv4/T/FWAbpgh8O2CPKYDY4ZXl8tmRH9dtYn/824l
veLxdgNjHwo5OMvuTSDMjC3tbg2UA3kmV4VAm5QotlRinUECQQDo4zvI5e81zWnS
kNrUARX80t432MOZyr0RvAaVJfBNQpJl0H0xp5LKP74hvPVO9WdJvJ0M4Z4QrmGO
bm2Hsfz5AkEA2R469YXxgPLDg/LvUQqfrl8Ji9+rip7eQP7iS/dt66NMS31/HymT
+HscEZ3qGlnQuyyyRR2rGQdhdjU42HNy/QJBAKbPTF1DxSmGbovyUauU84jaCW17
B++6dd6kDRr7x7mvO2lOAr50RwIy0h8cV6EsycTZIqy9VhigryP0GOQfKxECQA8T
uVZpab7hnNAh45qGGVabhOcwrhHfPGHZEU/jK7/sRBUN7vD0CzF7IxTaGXKhAAyv
auW/zKzdRVhXE858HeUCQQCGaaAg8GwM0qIS0nHRTLldu4hIGjKn7Sk0Z46Plfwr
oqPCtuP4ehX85EIhqCcoFnG6Ttr6AxSgNMZvErVxDBiD
-----END RSA PRIVATE KEY-----

Ответ 2

Ну, я не знаю о RSA-специфической стороне, но как только у вас будет непрозрачная двоичная строка (т.е. она может содержать любые произвольные данные), лучшим вариантом для преобразования текста является Convert.ToBase64String(byte[]), который можно изменить с помощью Convert.FromBase64String(string).

Не используйте Encoding.GetString(byte[]) и Encoding.GetBytes(string) для этого - двоичные данные не являются текстом в конкретной кодировке и не должны рассматриваться как таковые. Вы почти потеряете данные, если попробуете это.

Ответ 4

Если вы конвертируете сертификат bouncycastle в сертификат .net. Функция для этого - в bouncycastle lib (я верю в класс DotNetUtilities). RSACryptoServiceProvider имеет функцию:

ToXmlString(bool includePrivateKey). 

Что дает вам представление x сертификата, если вы хотите, чтобы закрытый ключ содержал все компоненты, сериализованные в base64 отдельно, экспоненту, модулю и d (частный экспонент).