Создайте файл .pem для шифрования RSA с открытым ключом C # .net

Я хочу создать .pem файл для открытого ключа, сгенерированного этим методом

public static Tuple<string, string> CreateKeyPair()
{
    CspParameters cspParams = 
        new CspParameters { 
            ProviderType = 1 /* PROV_RSA_FULL */ 
        };

    RSACryptoServiceProvider rsaProvider = 
        new RSACryptoServiceProvider(1024, cspParams);

    string publicKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(false));
    string privateKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(true));

    return new Tuple<string, string>(privateKey, publicKey);
}

Поскольку я создавал этот ключ для мобильного приложения, и они не могут его прочитать, они запросили файл .pem вместо открытого ключа в виде строки

Пожалуйста посоветуй,


person Yasser-Farag    schedule 10.10.2013    source источник


Ответы (2)


Во-первых, так называемый файл .pem на самом деле не является фиксированной спецификацией или форматом. Несколько различных типов различных форматов файлов обычно описываются как файлы «PEM». Когда проекту SSLeay (теперь OpenSSL) потребовалось создать выходной файл в кодировке base64, содержащий ключевую информацию, они позаимствовали концепции форматирования из старых RFC с расширенной конфиденциальностью 1421 -1424, и они добавили расширение .pem в конец этих файлов. Но такой файл может содержать открытые ключи, частные ключи, запросы сертификатов, сертификаты, списки сертификатов и так далее. Все разные. Так что, если все, что вам говорят, это создать .pem файл, вам придется угадывать, что действительно нужно.

Самый простой способ записать такие файлы - использовать библиотеку Bouncycastle C #. Пакет Org.BouncyCastle.OpenSsl содержит ряд утилит, включая класс PemWriter, который должен вам помочь.

person President James K. Polk    schedule 10.10.2013
comment
Спасибо за повтор, - person Yasser-Farag; 13.10.2013
comment
Не используйте Org.BouncyCastle.OpenSsl, потому что в нем нет примеров и очень плохая документация для C #! Я работал с той же проблемой, и эта библиотека мне очень помогает: https://github.com/jrnker/CSharp-easy-RSA-PEM. В нем есть хорошие примеры, и вы можете решить свою проблему, используя только одну строку (вместо реализации некоторых интерфейсов из BouncyCastle)! - person V. Panchenko; 09.06.2017
comment
@ В.Панченко: Спасибо за комментарий. Пожалуйста, подумайте о том, чтобы написать ответ на этот вопрос, используя в качестве примера однострочник. - person President James K. Polk; 09.06.2017
comment
CSharp-easy-RSA-PEM имеет лицензию GPL3, поэтому вы не можете использовать его, если ваш проект тоже не является GPL. BouncyCastle - это Массачусетский технологический институт. - person l3dx; 26.03.2019

Недавно мне нужно сохранить PublicKey и PrivateKey, созданные в моем приложении C #, в файл, и я буду работать с ним позже. Я использую для этого такую ​​библиотеку, как CSharp-easy-RSA-PEM.

Это очень простое и быстрое решение, поэтому я буду рекомендовать эту библиотеку другим ребятам.

Я использую следующий код, чтобы получить PublicKey как string (и сохранить его в pem файл в формате Base64):

string publicKeyStr = Crypto.ExportPublicKeyToX509PEM(_cryptoServiceProvider);

он возвращает что-то вроде этого:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCxnBvS8cdsnAev2sRDRYWxznm1
QxZzaypfNXLvK7CDGk8TR7K+Pzsa+tpJfoyN/Z4B6xdlpsERo2Cu6AzolvrDLx5w
ZoI0kgdfaBMbUkdOB1m97zFYjKWoPeTskFzWZ3GHcQ3EXT0NJXXFXAskY45vEpbc
5qFgEhcPy3BMqHRibwIDAQAB
-----END PUBLIC KEY-----

И я использую следующий код, чтобы получить PrivateKey как string:

string privateKeyStr = Crypto.ExportPrivateKeyToRSAPEM(_cryptoServiceProvider);

он возвращает что-то вроде этого:

-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQCxnBvS8cdsnAev2sRDRYWxznm1QxZzaypfNXLvK7CDGk8TR7K+
Pzsa+tpJfoyN/Z4B6xdlpsERo2Cu6AzolvrDLx5wZoI0kgdfaBMbUkdOB1m97zFY
jKWoPeTskFzWZ3GHcQ3EXT0NJXXFXAskY45vEpbc5qFgEhcPy3BMqHRibwIDAQAB
AoGAAdwpqm7fxh0S3jOYpJULeQ45gL11dGX7Pp4CWHYzq1vQ14SDtFxYfnLWwGLz
499zvSoSHP1pvjPgz6lxy9Rw8dUxCgvh8VQydMQzaug2XD1tkmtcSWInwFKBAfQ7
rceleyD0aK8JHJiuzM1p+yIJ/ImGK0Zk2U/svqrdJrNR4EkCQQDo3d5iWcjd3OLD
38k1GALEuN17KNpJqLvJcIEJl0pcHtOiNnyy2MR/XUghDpuxwhrhudB/TvX4tuI0
MUeVo5fjAkEAw0D6m9jkwE5uuEYN/l/84rbQ79p2I7r5Sk6zbMyBOvgl6CDlJyxY
434DDm6XW7c55ALrnlratEW5HPiPxuHZBQJANnE4vtGy7nvn4Fd/mRQmAYwe695f
On1iefP9lxpx3huu6uvGN6IKPqS2alQZ/nMdCc0Be+IgC6fmNsGWtNtsdQJAJvB4
ikgxJqD9t8ZQ2CAwgM5Q0OTSlsGdIdKcOeB3DVmbxbV5vdw8RfJFjcVEbkgWRYDH
mKcp4rXc+wgfNFyqOQJATZ1I5ER8AZAn5JMMH9zK+6oFvhLUgKyWO18W+dbcFrBd
AzlTB+HHYEIyTmaDtXWAwgBvJNIHk4BbM1meCH4QnA==
-----END RSA PRIVATE KEY-----

Тогда вы можете использовать

RSACryptoServiceProvider publicX509key = Crypto.DecodeX509PublicKey(publicKeyStr);
RSACryptoServiceProvider privateRSAkey = Crypto.DecodeRsaPrivateKey(privateKeyStr);

для восстановления сохраненных ключей до RSACryptoServiceProvider.

Итак, если кому-то нужно решить подобную проблему, вы можете просто загрузить эту библиотеку, перейдите к Solution Explorer -> (Right click on your project) -> Add -> Reference -> Overview в своем Visual Studio, чтобы добавить эту библиотеку в свой проект, и добавьте using CSharp_easy_RSA_PEM; там, где она вам нужна :)

person V. Panchenko    schedule 09.06.2017
comment
Похоже на хорошее решение. - person President James K. Polk; 12.06.2017
comment
Я бы дал ему положительную оценку, если бы у него была либеральная лицензия, но, увы, это GPL. - person Jared Thirsk; 04.10.2019