TransWikia.com

Как импортировать закрытый ключ RSA openssl pem в X509Certificate2?

Stack Overflow на русском Asked on December 23, 2021

Не могу импортировать закрытый ключ, в сети куча примеров но в чем проблема понять не могу. Подскажите как подготовить данные для импорта? Возможно лучше с генерировать его на стороне vb.net и экспортировать?
Я генерирую сертификат на стороне сервера linux

openssl genrsa -out rsa_1024_priv.pem 1024

Потом пытаюсь прочитать его в vb.net

Imports System.Security.Cryptography.X509Certificates
Dim x509 As X509Certificate2 = New X509Certificate2()
x509.CreateFromCertFile(".\cert.pem")

Или так

Dim x509 As X509Certificate2 = New X509Certificate2()
Dim strPrivateKey As String = strPrivateKey.Replace("-----BEGIN RSA PRIVATE KEY-----", "").Replace("-----END RSA PRIVATE KEY-----", "")
Dim certBytes As Byte() = System.Text.Encoding.ASCII.GetBytes(strPrivateKey)
Dim certBytes As Byte() = Convert.FromBase64String(strPrivateKey)
x509.Import(certBytes, "", X509KeyStorageFlags.MachineKeySet Or X509KeyStorageFlags.PersistKeySet)

Но ошибка всегда одна

System.Security.Cryptography.CryptographicException: “Требуемый объект
не найден.”

Сам сертификат в pem формате

—–BEGIN RSA PRIVATE KEY—– MIICXgIBAAKBgQDryWHPjATe45FA+0v3KMyDO7NNcpZXZmEvt1uk0eroJip7+tk/
Wzp9EdybvVQVQhjzKs4j+dc7sUNC9btXrh8kuWS0WJKTWSGTs+YIpovGMugnhmYV
9nowdEQj7ssVDwY9xKButsqtt24ei2gLp301U/2AZM7tsColTn4aR9OpxQIDAQAB
AoGBALfq7ZCm92WkvLijTC4OdPgoqUPQDdU+1rARpjp6Q3Gx05HBqZPx5T2JoTsa
A2xRkoSa7xDA4VJ+gqjIZMmP2FmdlBs2B996Vac9T42M6axWfSbFMZDRiVW0xmt1
iShyAFIE/DG/PQr7yQMh+gF8xPJT5HYnvBt8NZkFDUF6vcxBAkEA/KbokfSat49h
DI90ajn1MP7CgW+6pFttxmx3hNGKpbYXGaiToYLSAqDiECKLsObhme7TYrwlQ7M6
CPdTIODJXwJBAO7pQoz92n41zj3whnjHJ00ujm6vk3kXHL/PVtxKUSVnNPvSzeKl
yzyDhshdwqxwbq9JW3WuxUHVHr0fOTXbC1sCQGHZqt1MZNeO2kFpFedGRyYQpPhI
c3rQRjXBMJDqLs57NXskhPjal8eY07T4DC4ZXWqmyovE3pHXyjRKxZFIPfUCQQDC
YdMd9+Tvz0NQrgQa/J6Dc5+7eusYGK/xd/cKIQVI02IOigOtpotnXvQozfB4cLn9
sEfTxjEEUSxDX8YihWgFAkEA1b8ni7616SU5sc6BtGXIPxiEW4CslT+Zd6bTOxqG
l3i4Q6PPiiVU7A7eBl23ttgtrRJwlGFjsXf5wCync7172w==
—–END RSA PRIVATE KEY—–

Еще я слышал что X509Certificate2 может импортировать только закрытый ключ, хотя мне хватило бы только открытого для RSA шифрования. Мне не нужна подпись в данном случае.

Есть разные способы это якобы сделать

https://www.codeproject.com/Articles/210576/RSA-Private-Key-Import-from-PEM-Format-in-Csharp

Как по RSA зашифровать строку используя при этом ключ из сертификата? RSA, C#, *.CER

https://stackoverflow.com/questions/6735793/c-sharp-rsacryptoserviceprovider-toxmlstring-fromxmlstring

https://stackoverflow.com/questions/38121004/set-modulus-rsa-parameter-from-string-public-key

2 Answers

И сразу php код для расшифровки, с версии (PHP 4 >= 4.0.6, PHP 5, PHP 7)

sudo apt-get install php-cli

https://stackoverflow.com/questions/20919529/how-to-provide-the-private-key-for-openssl-private-decrypt

https://stackoverflow.com/questions/4484246/encrypt-and-decrypt-text-with-rsa-in-php

$privateKey = <<<EOD
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAyHO18JX5Sy/52OnK/7EHS6WioqEJTQcZUTDVWHrCjIQKe1wy
k387QfBvS52euj1pi5OksXzkYyh1SAzfUB2MCLoOKSPKNYFxfFU7Pvvxioa4GwMT
I/qausUF5gaxhfcwpXKIBONvgvEHj3Vl3n/9cWhC3lNEt1Q++LVGJCs1QAf26h7c
EmF+1GerMr3SEUdIro6bH2ycON6NLxosNLyuegLhK/sn9kCdPCFivf0JF7a4BlHF
xMPGMETHeqKJ+6N1k8xs/T4n6lXS4tO2XPrMEKrIRyOagyG1jn96jUWbvoBF1XTp
+sEyENAfgtIIyT84vTsql78EzDUSjHPHFdQaQQIDAQABAoIBAB7oQIBlD3g5YIPC
oKtGJ4LRej8rJ1z6IDw1lF+9Jew2m8sjjyTQ9FkZcn+tQQEkYPbFgBph0HE9lr/S
REh9Fc9uqKpNO2t+lvn9xlHS1Q5v8Ukw8y2UAXGU2XD7TToDwDtyamiejN4avfiv
uFJTV8e5tL3FBw5hbgg5IySGiQJjMbpMW3ulwu/ZC4yXHik4eJ/1YNSqti1+TOnn
cSz4R1A5wH+2uORCByrU/gwpZtFvi/XG0aynkK4jcGEGoq6i5UxwCYvaU5Sykntq
4+GKLx6Odht/GuXcdLI/7oEnpYlgqh8ftBTpjHP2bj2X6mn92imxsAt0Hm+ZstIG
wvzuh7ECgYEA/F4yCsjB0hwRv1V31C9LQ7ZN09qAFOtc+p+uqxPlrhg0l3tQ17nO
yNDbnb6bGUyJtJAdRNiIWyBBv/XUCZKwadmRZMDB/cORlIIq2scXAhTZI0wCWHMu
cY2W/DCFRG0NqtSCaSh7+5bjDDhUjgXzrP2V3AXGAqrGCDk+EtD96SUCgYEAy1Y9
fIuWVkPZst9CBUWObbCITTV7VxZEE5s97TFSHhYHuhxNx0F2ev5bj0+am/4wcuxR
WPwCVQ4IYxbh0EF9Xv3qHaVybOfouFXvE3YejBLvJEkNSO29ix+fVdNi98H55tVt
i5Kdiw2zw8RXu1D0v2qG/R4qt2cF18pqs9iSR+0CgYA/O8bkJttRrxDPVTX6J4N/
St2DWLtBApxAe+RDH3AsSApdbluaQgdLD/IHO2wXUbMrV/TNfEfmNVXkKE9huqyT
SR2CFj5FPExs3pSoTrw4HEsv6eqoiOu5LhYHyIyL0ZtcE3U9rhQqvOrU9ARTtbAR
x1RWVegAYRPPmbAw/MayNQKBgFDCHseRdRMr/ZGyZDlNx+S+4VOw8xzChiU3WiAT
n6a9XzJGvYlu8Yyl611+40wjZ8CtJR3vcUmwuhoI44TgDdglhs9hf5HLhb14u+yB
1F4TwxEpRnJ5ofdYhuMCguMeEo/gopJ1l8a7mXMeTy3hWGOR/q0XRyXyb/qltT1a
vbZ9AoGBAJCG5KrpmnOy3jgiNtTxlR9tWqN8KpUiLgJ6UE3ny5flP++tq7F0aNRf
4FSckVc1SrLiT5+zQ7eW39a1E7vIOFdO6/vfjwyLuFtIRBGz02ABe+N1r8528ZWf
ylqpdU8SayZsfpadO0C2fbOHMvBXZK75fCJcbK9bxYgplIdXvELK
-----END RSA PRIVATE KEY-----
EOD;

$res = openssl_get_privatekey($privateKey);
//var_dump($res);
$data = "KbcVCQAvp0rDUllCVuURuGl0yV0taIrBAo1Qj+QqUz4mdQ6eALvD/M+LyqD5iY/blJV7s1yE2I+9D9S0Y9MfL1VwqTwHEUS5rZOuBqO7nrfg6TL2BcCoCrtCBppBJF3NaZJB6+GW9Y6YoSfh/IVEE4XMcYOjUakxsGI1Z7scP5EsB3e5AXpF48WXq8JMzVYEaRFCP+U5J9i/eB1mSA0YkcXZukPfezquoVK7tBLAE5JCEsFH2XWZSW+SmLvkA21Z6YZviXJIeLy1ixuX1Rfu1G3chEoU6tiOJ7cLV0hbrPn7mvgxX0+5x+eEIhRpWcrQL1cN0Dg3yCK9BVvoAAZKBw==";

if (openssl_private_decrypt(base64_decode($data), $decrypted, $res))
    $data = $decrypted;
else
    $data = '';
var_dump($data);

Answered by Alex S on December 23, 2021

Перепробовав кучу вариантов, нашел один для шифрования, оказывается меня обманули насчет приватного ключа, достаточно публичного сертификата. И метод x509.CreateFromCertFile(".public.cer") не работает!

http://www.claudiobernasconi.ch/2016/04/17/creating-a-self-signed-x509-certificate-using-openssl-on-windows/

Создаю сертификат

openssl genrsa 2048 > private.key

openssl req -new -x509 -nodes -sha1 -days 1000 -key private.key > public.cer

openssl pkcs12 -export -in public.cer -inkey private.key -out cert_key.p12

Шифрую.

Dim x509 As X509Certificate2 = New X509Certificate2("public.cer", "")
Dim rsa As RSACryptoServiceProvider = x509.PublicKey.Key
bytCipherText = Convert.FromBase64String(strCipherText)
bytPlainText = rsa.Encrypt(bytCipherText, False)

Теперь буду пробовать расшифровать данные на php с закрытым ключем, метод

bytPlainText = rsa.Decrypt(bytPlainText, False)

не выполняется, нет ключа как и положено.

Для проверки

https://docs.microsoft.com/ru-ru/dotnet/api/system.security.cryptography.rsacryptoserviceprovider.decrypt?view=netframework-4.7.2

Dim x509 As X509Certificate2 = New X509Certificate2(".\cert_key.p12", "")
Dim rsa As RSACryptoServiceProvider = x509.PrivateKey
bytPlainText = rsa.Encrypt(bytCipherText, False)
bytPlainText = rsa.Decrypt(bytPlainText, False)

Answered by Alex S on December 23, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP