Qual é a diferença entre criptografar alguns dados e assinar alguns dados (usando o RSA)?
Simplesmente reverte o papel das chaves público-privadas?
Por exemplo, quero usar minha chave privada para gerar mensagens, para que apenas eu possa ser o remetente. Quero que minha chave pública seja usada para ler as mensagens e não me importo com quem as lê. Quero poder criptografar determinadas informações e usá-las como uma chave de produto para o meu software. Só me importo de ser o único que pode gerá-los. Gostaria de incluir minha chave pública no meu software para descriptografar / ler a assinatura da chave. Eu não ligo para quem pode ler os dados na chave, apenas ligo para ser o único que pode ser verificado.
A assinatura é útil nesse cenário?
fonte
f(key, message)
, de modo quef(private, f(public, message)) === f(public, f(private, message)) === message
Na criptografia RSA, quando você gera um par de chaves, é completamente arbitrário qual você escolhe ser a chave pública e qual é a chave privada. Se você criptografar com um, poderá descriptografar com o outro - ele funciona nas duas direções.
Portanto, é bastante simples ver como você pode criptografar uma mensagem com a chave pública do destinatário , para que o destinatário possa descriptografá-la com sua chave privada .
Uma assinatura é a prova de que o assinante possui a chave privada que corresponde a alguma chave pública. Para fazer isso, seria suficiente criptografar a mensagem com a chave privada do remetente e incluir a versão criptografada ao lado da versão em texto sem formatação. Para verificar o remetente, descriptografe a versão criptografada e verifique se é a mesma do texto sem formatação.
Obviamente, isso significa que sua mensagem não é secreta. Qualquer um pode descriptografá-lo, porque a chave pública é bem conhecida. Mas quando o fazem, provam que o criador do texto cifrado tem a chave privada correspondente.
No entanto, isso significa dobrar o tamanho da sua transmissão - texto simples e texto cifrado juntos (supondo que você queira que pessoas que não estão interessadas em verificar a assinatura, leiam a mensagem). Então, em vez disso, normalmente uma assinatura é criada criando um hash do texto sem formatação. É importante que hashes falsos não possam ser criados; portanto, algoritmos de hash criptográficos como o SHA-2 são usados.
Assim:
fonte
Existem dois problemas distintos, mas intimamente relacionados, no estabelecimento de uma comunicação segura
Esses dois problemas podem ser resolvidos de maneira elegante usando a criptografia de chave pública.
I. Criptografia e descriptografia de dados
Alice quer enviar uma mensagem para Bob que ninguém deve ler.
Portanto, se você quiser enviar uma mensagem para mim, deve conhecer e usar minha chave pública que eu forneço a você, e somente poderei descriptografar a mensagem, pois sou a única pessoa que tem acesso à chave privada correspondente.
II Verifique a identidade do remetente (autenticação)
Alice quer enviar uma mensagem para Bob novamente. O problema de criptografar os dados é resolvido usando o método acima.
Mas e se eu estiver sentado entre Alice e Bob, me apresentando como 'Alice' para Bob e enviando minha própria mensagem a Bob, em vez de encaminhar a mensagem enviada por Alice. Mesmo que eu não possa descriptografar e ler a mensagem original enviada por Alice (que requer acesso à chave privada de Bob), estou sequestrando toda a conversa entre eles.
Existe uma maneira de Bob confirmar que as mensagens que ele está recebendo são realmente enviadas por Alice?
fonte
Sim, pense em assinar dados como um selo de cera que ninguém mais possui. Isso é feito para obter integridade e não repúdio . A criptografia é para que ninguém mais possa ver os dados. Isso é feito para obter confidencialidade . Consulte a wikipedia http://en.wikipedia.org/wiki/Information_security#Key_concepts
Uma assinatura é um hash da sua mensagem assinada usando sua chave privada.
fonte
A assinatura está produzindo um "hash" com sua chave privada que pode ser verificada com sua chave pública. O texto é enviado de forma clara.
A criptografia usa a chave pública do receptor para criptografar os dados; a decodificação é feita com sua chave privada.
Portanto, o uso de chaves não é revertido (caso contrário, sua chave privada não seria mais privada!).
fonte
Você está descrevendo exatamente como e por que a assinatura é usada na criptografia de chave pública. Observe que é muito perigoso assinar (ou criptografar) mensagens arbitrárias fornecidas por outras pessoas - isso permite ataques aos algoritmos que podem comprometer suas chaves.
fonte
A assinatura indica que você realmente é a fonte ou o comprovante do objeto assinado. Todos podem ler o objeto, no entanto.
Criptografar significa que apenas aqueles com a chave privada correspondente podem lê-la, mas sem assinar, não há garantia de que você está por trás do objeto criptografado.
fonte
A criptografia preserva a confidencialidade da mensagem ("alguns dados"), enquanto a assinatura fornece não-repúdio: ou seja, apenas a entidade que a assinou poderia ter assinado. Também existem diferenças funcionais; Leia.
Absolutamente não. O uso das mesmas chaves privadas para assinatura e descriptografia (ou, da mesma forma, as mesmas chaves públicas para verificação e criptografia ) é desaprovado, pois você não deve misturar finalidades. Isso não é um problema matemático (o RSA ainda deve estar seguro), mas um problema com o gerenciamento de chaves , onde, por exemplo, a chave de assinatura deve ter uma vida útil mais curta e conter mais proteção antes de ser usada.
Para a mesma mensagem, você deve usar a chave privada do remetente para assinar e a chave pública confiável do destinatário para criptografia. Geralmente, assinar e criptografar é usado, caso contrário, um adversário pode substituir a assinatura pela sua. Da mesma forma, você deve usar a chave privada do destinatário para descriptografia e a chave pública confiável do remetente para verificação.
Além disso, você deve entender que a geração de assinaturas não usa "criptografia com a chave privada". Embora todas as operações da RSA sejam baseadas na exponenciação modular, o esquema de preenchimento é totalmente diferente para a geração de assinaturas. Além disso, a chave pública possui propriedades totalmente diferentes da chave privada RSA em todos os usos práticos do RSA.
Essa é uma propriedade de não repúdio, que pode ser alcançada com a assinatura.
A chave pública deve ser considerada conhecida por todos. Se você deseja que todos leiam as mensagens, simplesmente não as criptografa.
A assinatura geralmente não influencia o conteúdo da mensagem. A mensagem é considerada separada das assinaturas. Oficialmente, essas assinaturas são conhecidas como "assinaturas com apêndice", onde o apêndice é a mensagem. É um nome um pouco estranho, pois a mensagem é considerada mais importante que a assinatura, mas sim. Apenas poucas assinaturas oferecem recuperação (parcial) de mensagens; eles não são mais usados e geralmente são considerados obsoletos.
Observe que protocolos de assinatura como o CMS podem implantar um formato de contêiner que inclua a mensagem e a assinatura. Nesse caso, você precisará primeiro obter a mensagem - ainda não criptografada - do contêiner, como descompactar um arquivo de um arquivo .zip simples. Portanto, a mensagem pode ficar oculta e não pode ser usada diretamente nesse caso.
A criptografia é usada para obter confidencialidade. No passado, a geração de assinaturas RSA era frequentemente considerada como "criptografia com a chave privada". No entanto, as operações são bem diferentes, conforme explicado acima, e os padrões posteriores tentam desesperadamente separar a criptografia e a geração de assinaturas.
Sim, isso se chama estabelecer confiança na chave pública. No entanto, proteger o código do programa é muito diferente de proteger as mensagens. Você pode executar a assinatura do código, mas precisará de algo para verificar a assinatura fora do seu código . Existem sistemas operacionais que oferecem isso.
Há o Microsoft Authenticode, por exemplo. As lojas de aplicativos, como a iStore e a loja de aplicativos Android, podem ou não usar a assinatura de código, mas oferecem alguma garantia de que seu aplicativo não está clonado ou, pelo menos, não clonado dentro da loja. Afinal, a criptografia nem sempre é a solução.
Mantendo o seu código seja clonado / alterados em tudo é muito mais difícil, e você estaria solidamente em território DRM se você ir por esse caminho.
Sim absolutamente. Certamente pode ajudar a garantir que as mensagens foram assinadas apenas por você, se houver confiança na chave pública. Se puder ser útil para autenticar o código do aplicativo / chave pública integrada, depende inteiramente do ambiente em que você espera executar o código.
fonte
No seu cenário, você não criptografa no significado de criptografia assimétrica; Eu prefiro chamá-lo de "codificar".
Então, você codifica seus dados em alguma representação binária e assina com sua chave privada. Se você não pode verificar a assinatura através da sua chave pública, você sabe que os dados assinados não são gerados com sua chave privada. ("verificação" significa que os dados não assinados não têm significado)
fonte
Funcionalmente, você usa a criptografia de chave pública / privada para garantir que apenas o destinatário possa ler sua mensagem. A mensagem é criptografada usando a chave pública do destinatário e descriptografada usando a chave privada do destinatário.
A assinatura pode ser usada para informar ao destinatário que você criou a mensagem e ela não foi alterada durante a transferência. A assinatura da mensagem é feita usando sua própria chave privada. O receptor pode usar sua chave pública para verificar se a mensagem não foi adulterada.
Quanto ao algoritmo usado: isso envolve uma função unidirecional, por exemplo, wikipedia . Um dos primeiros algoritmos usa números primos grandes, mas mais funções unidirecionais foram inventadas desde então.
Procure por 'Bob', 'Alice' e 'Mallory' para encontrar artigos de introdução na internet.
fonte
Respondendo a essa pergunta no conteúdo que os questionadores pretendiam usar a solução para licenciamento de software, os requisitos são:
Uma Assinatura Digital resolverá esse problema, pois os dados não processados que compõem a chave podem ser assinados com uma chave privada, o que a torna não legível por humanos, mas que pode ser decodificada se tiver engenharia reversa. Mas a chave privada é segura, o que significa que ninguém poderá fazer licenças para o seu software (que é o ponto).
Lembre-se de que você não pode impedir que uma pessoa qualificada remova os bloqueios de software do seu produto. Portanto, se eles tiverem que invadir cada versão lançada. Mas você realmente não deseja que eles possam gerar novas chaves para o seu produto que possam ser compartilhadas para todas as versões.
Python A documentação do PyNaCl possui um exemplo de 'Assinatura digital', que atenderá o objetivo. http://pynacl.readthedocs.org/en/latest/signing/
e de causa NaCl projeto para exemplos C
fonte