Como importar PKCS # 8 RSA PrivateKey (criado por OpenSSL) em C #
-
19-09-2019 - |
Pergunta
Eu estou tentando encontrar uma maneira de ler um PrivateKey criado usando OpenSSL PKCS # 8 RSA em C # sem uso da biblioteca externa.
Alguém sabe como posso fazer isso?
Solução
A maneira mais fácil de fazer isto com uma biblioteca externa, está usando a (livre) componente chave Chillkat público / privado : usando esse, importando a chave pode ser feito usando apenas algumas linhas de código e se você estiver disposto a pagar os US $ 149 ou assim para o resto da biblioteca, ele vai fazer lidar com conceitos gerais de criptografia muito mais fácil também.
E, ao contrário do normal Microsoft .NET Framework, o projeto Mono faz parecem ter um PKCS8 implementação para o qual o fonte completo C # está disponível. Isso pode ser adequado como um ponto de partida no caso de você absolutamente não pode contar com bibliotecas externas, assumindo a licença (LGPL 2.0) associado com o código funciona Mono para você ...
Finalmente, o PKCS # 8 formato não é muito difícil de analisar, e as RSA / DSA chave par objetos são como por PKCS # 11 e relativamente fácil de converter para um .NET X509Certificate uma vez que você descobrir onde todos os bits ir - eu realmente fiz isso em VB.NET um tempo atrás, mas, infelizmente, não sou capaz de compartilhar esse código.
Outras dicas
Obrigado por sua resposta.
O meu script para criar chave RSA eu usei OpenSSL Whit:
(Linux Script)
openssl genrsa -out ${NAME}_openssl.key 2048
openssl pkcs8 -topk8 -in ${NAME}_openssl.key -nocrypt > ${NAME}.key
openssl req -new -x509 -key ${NAME}.key -out ${NAME}.crt -outform DER
Em C #, precisamos PrivateKey em formato XML. Eu costumava este analisador para fazer isso.
Para descriptografar de desafiar precisamos usar:
byte[] challange = server.getChallenge();
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider();
rsaProvider.FromXmlString(Demo.Properties.Resources.XmlPrivateKey);
byte[] plaintext = rsaProvider.Decrypt(challange, false);
Para criptografar Whit certificado de servidor, precisamos usar:
RSACryptoServiceProvider rsaProvider = x509.PublicKey.Key as RSACryptoServiceProvider;
byte[] answer = RsaProvider.Encrypt(plaintext, false);
Obrigado por JavaScience Consulting