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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top