Posso usar o PublicKey do Assemblies para descriptografar uma corda criptografada com o PrivateKey correspondente?

StackOverflow https://stackoverflow.com/questions/1847357

Pergunta

A assinatura de uma assembléia no .NET envolve um par público/privado. Até onde eu sei, pelo que li .NET usa o algoritmo RSA e a chave privada para assinar a assembléia, verificando -a com a chave pública incorporada.

Eu sei como recuperar a chave pública (Assembly.PublicKey). Fiquei me perguntando, se essa chave poderia ser usada para descriptografar uma sequência curta que contém alguns dados criptografados com a chave privada.

Os documentos que li até agora (por exemplo) parecem sugerir que apenas o contrário é possível: eu teria que usar a chave pública para criptografar e a chave privada para descriptografar - mas eu realmente não quero incluir isso na assembléia, faça I.

Eu acho que ficaria bem, se eu acabasse de assinar a string. Mas como?

Estou um pouco sem como começar isso. Alguém tem um trecho de código?

Além disso, a criptografia / assinatura da pequena string aconteceria idealmente no PHP, pois quero descarregar isso para um servidor da Web e tudo o que temos até agora é o seu site hospedado genérico de PHP / MySQL.

Caso de uso: Estou tentando criar um esquema de licenciamento leve para um software que estamos prestes a lançar para os testadores beta. Como o software provavelmente será freeware, tudo o que realmente queremos alcançar é

  1. Saiba quem tem o software instalado (endereço de e -mail)
  2. Deixe o software expirar após um determinado período, após o qual o usuário terá que obter uma nova licença
    • Isso é tão fácil quanto preencher um formulário e esperar por um email automatizado com a chave para chegar
    • Estamos tentando reduzir a probabilidade de versões antigas voltarem para morder nossa reputação / nos assombrar

Ser capaz de criptografar uma tupla (data de expiração, impressão digital) e descriptografar que na startup seria um módulo de licenciamento fácil: na primeira vez em que o aplicativo é iniciado, o usuário é solicitado para o endereço de email, nome, organização. Esta informação é publicada no servidor da web, juntamente com uma impressão digital MD5 de algumas informações do sistema (NIC, nome do computador, versão principal e menor). O servidor da web responde por email (verifica a validade do endereço de email) com uma versão criptografada da tupla (data de expiração, impressão digital) que é salva no disco. Na startup, isso pode ser descriptografado e comparado com a data atual e a impressão digital regenerada.

EDITAR: OK, então ainda não tenho todas as respostas para minha pergunta. Mas parece que o .NET não facilitará o uso da chave privada para criptografia (se isso for possível, as respostas não concordam com isso).

A rota que seguirei é essa (com base no meu caso de uso):

  • Vou usar a chave privada para assinar a licença.
  • Vou usar a chave pública para verificar se a licença foi assinada pela chave privada
  • Vou postar outra pergunta destinada a PHP Devs sobre como usar as teclas .NET (produzido por sn.exe) para assinar algum texto
  • Não estou realmente preocupado com o usuário ver a licença, pois é um hash de qualquer maneira e calculada a partir de coisas que ele já conhece. Tudo o que eu quero é tornar muito difícil valer a pena incomodar o seu arquiteto de construção típico copiar meu software sem que eu saiba (lembre -se, o software será freeware - tudo o que eu quero é uma trilha em papel de quem ele instalou ... )

Muito obrigado por suas respostas.

Foi útil?

Solução

Não em .Net.

Em muitos algoritmo tradicional de criptografia de chave pública, como o RSA, você pode criptografar e descriptografar os dois lados, normalmente de uma maneira é chamada de "criptografia" e a outra "assinatura", mesmo que você realmente acabe com uma versão criptografada de algo de ambos os lados.

No entanto, no .NET, a implementação da RSA foi prejudicada e, quando a assinatura produzirá apenas digestões da entrada, não as informações completas processadas.

Parece que há algum desacordo sobre o que pode e não pode ser feito com o RSA, então deixe -me editar minha resposta para ser mais específica.

Estou falando de matemática da RSA, não de nenhuma implementação específica da RSA.

A RSA Math permite que você codifique informações das duas chaves (privadas ou públicas), e os dados codificados só podem ser decodificados com as outras duas teclas.

Normalmente, você codifica com uma chave pública, criptografando as informações e decodifica -a com a chave privada, descriptografando as informações. Ou você pega um hash das informações, a codifica com a chave privada, assinando o hash e decodifica o hash com a chave pública, a fim de comparar e verificar a assinatura.

As implementações típicas não permitem fazer uma codificação completa de dados de privado para público, apenas por hash dos dados, mas a matemática por trás da RSA permite totalmente isso.

Outras dicas

Você não pode descriptografar usando a chave pública. Dessa forma, todo o ponto de "público" seria perdido.

(No entanto, você pode assinar algo usando a chave privada e verificar a assinatura usando a chave pública. É para isso que a estrutura usa as chaves - a montagem é assinada e a chave pública é usada para verificar a assinatura. )

Isso pode ser feito usando o SigneDXML http://msdn.microsoft.com/en-us/library/ms229745.aspx. Em um nível mais baixo, você pode usar o RSAPKCS1SignaturEdEformatter e o RSAPKCS1SignatureFormatter. Esses trabalhos criptografaram um hash dos dados comparando os dados com o hash (descriptografado) da outra extremidade. Acredito que o hash é usado porque a criptografia de chave privada só pode lidar com dados pequenos. Não tenho certeza sobre a reutilização da chave pública da montagem, se estiver causando problemas, basta usar um par de chaves separado.

Palavra de aviso, confira isso, pois essas classes podem resultar em 20 segundos HANGUPS! http://www.pcreview.co.uk/forums/thread-3428177.php

Essa abordagem é vulnerável ao código de verificação de assinatura que está sendo adulterado com o uso de reflexil, mas isso é outra questão.

Eu escrevi o seguinte, mas relendo, acho que você já conseguiu o seguinte: você não está realmente tentando criptografar ou ocultar dados do usuário, você quer impedi -los de criar ou adulterar a licença. Você está certo de que um algoritmo de criptografia de chave privada pública pode ser usada para isso. Isso é conhecido como Assinatura usando uma chave privada (geração de licença do servidor). E verificação da assinatura usando uma chave pública (verificação da licença no aplicativo). Menciono essa terminologia, pois ajudará na pesquisa.

Nas chaves públicas da RSA, são usadas para criptografia, as chaves privadas são usadas para descriptografia. Você não pode usar uma chave pública para descriptografar nada ...

Na RSA, a única diferença real entre uma chave pública e uma chave privada é qual você mantém em segredo.

Assim, você pode usar uma chave pública como chave de criptografia e descriptografar com a chave privada ou usar a chave privada como chave de criptografia e descriptografar com a chave pública.

Criptografar com a chave privada é usado para assinaturas digitais (qualquer pessoa pode decodificar com a chave pública).

Mas como @Lasse V. Karlsen apontou, o .NET pode tornar mais difícil do que deveria ser ...

Eu acho que ambas as orientações são possíveis criptografadas com o público e descriptografaram com privado e criptografar com chave privada. A segunda é a maneira como a assinatura digital funciona.

Aviso! Essa resposta está errada, mas vou deixar aqui a menos porque a série de comentários anexados estão, penso em interesse suficiente para outras pessoas para manter a resposta. Ok, isso me faz parecer um idiota, mas isso não é novidade para mim;) vote como você deseja.

Uma chave pública pode ser usada para:-

  • Criptografar algo que só pode ser descriptografado com a chave privada
  • Autenticar algo assinado com a chave privada

Não pode ser usado para descriptografar algo para criptografar por uma chave privada. Por esse motivo, o sistema de chave pública/privada é referida como um sistema assimétrico.

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