Qual é a diferença entre criptografar e entrar na criptografia assimétrica?

297

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?

mmcdole
fonte

Respostas:

441

Ao criptografar, você usa a chave pública para escrever uma mensagem e eles usam a chave privada para lê-la.

Ao assinar, você usa sua chave privada para escrever a assinatura da mensagem e eles usam sua chave pública para verificar se é realmente sua.

Quero usar minha chave privada para gerar mensagens, para que somente 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ê

Isso é assinatura , é feito com sua chave privada.

Quero poder criptografar determinadas informações e usá-las como uma chave do produto para o meu software.

Só me importo de ser o único que pode gerá-los.

Se você só precisa saber, não precisa mexer nas chaves para fazer isso. Você pode apenas gerar dados aleatórios e mantê-los em um banco de dados.

Mas se você deseja que as pessoas saibam que as chaves são realmente suas, você precisa gerar dados aleatórios, manter um banco de dados e assinar com sua chave.

Gostaria de incluir minha chave pública no meu software para descriptografar / ler a assinatura da chave.

Você provavelmente precisará adquirir um certificado para sua chave pública de um provedor comercial como a Verisign ou Thawte, para que as pessoas possam verificar se ninguém forjou seu software e substituiu sua chave pública pela dele.

Quassnoi
fonte
7
Tecnicamente falando, quando você diz que a chave privada é usada para escrever a assinatura da mensagem, está dizendo que o hash da mensagem está sendo criptografado com minha chave privada?
Andy Ibanez
4
@ AndyIbanez: o que é criptografado (o resumo ) também pode incluir carimbo de data e hora e um pouco de sal aleatório, mas sim, essa é a essência.
Quassnoi
7
@Quassnoi De fato, quando dizemos 'assinar com a chave privada', significa não 'criptografar', mas sim 'descriptografar'. Assinar a mensagem, grosso modo, é o mesmo que descriptografar com a chave privada e, no receptor, criptografar com chave pública, dessa forma o hash se tornará o mesmo e poderá ser comparado.
Johnny Willer
5
@ JohnnyWiller: como o @slim mencionado abaixo, o núcleo matemático é o mesmo para as funções de criptografia e descriptografia. Eles são funções não separados, eles são a mesma função f(key, message), de modo quef(private, f(public, message)) === f(public, f(private, message)) === message
Quassnoi
2
@ Mel não, não é. A geração do par de chaves é gratuita. O custo está envolvido em fazer os outros acreditarem que a assinatura é realmente sua. Para fazer isso, você tem sua própria chave pública, que você gerou anteriormente de graça, assinada por uma autoridade que pode ou não cobrar-lhe dinheiro por isso.
Quassnoi 26/07/19
143

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:

  • Para gerar uma assinatura, faça um hash a partir do texto sem formatação, criptografe-o com sua chave privada e inclua-o ao lado do texto sem formatação.
  • Para verificar uma assinatura, faça um hash a partir do texto sem formatação, decodifique a assinatura com a chave pública do remetente, verifique se os dois hashes são iguais.
esbelto
fonte
8
@headcode se aplica apenas a chaves assimétricas. Chaves simétricas não vêm em pares.
magro
3
De fato, isso se aplica apenas às chaves RSA. Com chaves ECDSA, por exemplo, você pode gerar trivialmente a chave pública a partir da chave privada, e a chave privada é um escalar enquanto a chave pública é uma coordenada.
David Schwartz
5
Como você pode descriptografar mensagens com chaves PUBLIC? As mensagens não são descriptografadas apenas com chaves privadas?
30516 daremkd
3
5 fontes que contradizem essa resposta 1 , 2 , 3 , 4 , 5
wha7ever
6
Não é arbitrário qual deles você chama de público e privado. Você pode gerar a chave pública a partir da chave privada, mas não pode gerar a chave privada a partir da chave pública. Isso não é uma grande diferença?
22418 Greg Schmit #
23

Existem dois problemas distintos, mas intimamente relacionados, no estabelecimento de uma comunicação segura

  1. Criptografe os dados para que somente pessoas autorizadas possam descriptografar e lê-los.
  2. Verifique a identidade / autenticação do remetente.

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.

  • Alice criptografa a mensagem com a chave pública de Bob e a envia.
  • Bob recebe a mensagem e a descriptografa usando sua chave privada.

Observe que, se A quiser enviar uma mensagem para B, A precisará usar a chave pública de B (disponível publicamente para qualquer pessoa) e nem a chave pública nem privada de A será exibida aqui.

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?

  • Alice assina a mensagem com sua chave privada e a envia. (Na prática, o que é assinado é um hash da mensagem, por exemplo, SHA-256 ou SHA-512.)
  • Bob recebe e verifica usando a chave pública de Alice. Como a chave pública de Alice verificou a mensagem com êxito, Bob pode concluir que a mensagem foi assinada por Alice.
Siva Prakash
fonte
1
Então, quando você assina a mensagem, assina a própria mensagem ou a mensagem criptografada?
FrostyStraw 9/11
21

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.

Johnno Nolan
fonte
16

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!).

Doug Currie
fonte
Na criptografia assimétrica normal, a criptografia é feita com a chave pública do destinatário, não com a sua chave privada.
mmcdole
Você perdeu que essa pergunta era especificamente sobre RSA, onde o uso das chaves é revertido e onde não compromete a chave privada.
David Schwartz
8

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.

Michael Borgwardt
fonte
1
Os navegadores da Web não criptografam dados arbitrários ao usar SSL?
22819 Ian Warburton
2
@IanWarburton: Mas eles não usam criptografia assimétrica para isso. As transferências de dados reais usam criptografia simétrica com uma chave de sessão gerada aleatoriamente.
Michael Borgwardt
1
@IanWarburton: não, porque nenhum deles seria escolhido por um atacante. O perigo está em criptografar ou assinar algo fornecido diretamente por um invasor, porque isso pode ser deliberadamente criado para revelar informações sobre sua chave privada ou até criar assinaturas que parecem válidas para algo que você não pretendia assinar. Uma análise detalhada de como o último caso funciona para RSA está aqui: crypto.stackexchange.com/questions/35644/...
Michael Borgwardt
2
@IanWarburton: é por isso que o RSA exige preenchimento, para que você nunca criptografe apenas uma mensagem escolhida: en.wikipedia.org/wiki/… - mas são realmente as operações que envolvem a chave privada (como assinatura) que são especialmente vulneráveis ​​à entrada escolhida.
Michael Borgwardt
1
@IanWarburton Não sou especialista em criptografia, mas pelo que entendi, isso não deve causar problemas.
Michael Borgwardt
8

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.

rjamestaylor
fonte
Se a mensagem for descriptografada pela minha chave pubiana, apenas eu poderia enviá-la. (Supondo que minha chave privada não seja comprometida)
Dojo
5

Qual é a diferença entre criptografar alguns dados e assinar alguns dados (usando o RSA)?

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.

Simplesmente reverte o papel das chaves público-privadas?

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.

Por exemplo, quero usar minha chave privada para gerar mensagens, para que apenas eu possa ser o remetente.

Essa é uma propriedade de não repúdio, que pode ser alcançada com a assinatura.

Quero que minha chave pública seja usada para ler as mensagens e não me importo com quem as lê.

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.

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.

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.

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.

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.

A assinatura é útil nesse cenário?

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.

Maarten Bodewes
fonte
"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." - isso não está claro para mim. O KeyPair pode ser o pk ou sk e o que um criptografa o outro pode descriptografar. Se concordarmos com isso, como podemos argumentar que a assinatura e a criptografia são distintas de alguma maneira significativa? Criptografar e, em seguida, só pode ser descriptografado com a outra chave. Eu já vi referências a funções de assinatura, isso está relacionado?
Morgan
A única diferença que conheço na função de assinatura é o hash da mensagem antes da criptografia.
Morgan
4

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)

devio
fonte
2

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.

Gerbrand
fonte
Você pode comentar sobre o meu caso de uso? Quero usar uma chave privada para criptografar e uma chave pública para permitir que todos e todos descriptografem.
mmcdole
1
Não é verdade que toda a criptografia assimétrica se baseia em números primos, é apenas o exemplo mais conhecido (RSA); existem outros métodos, como criptografia de curva elíptica.
Michael Borgwardt
"A mensagem é criptografada e depois criptografada usando a chave pública do destinatário." Essa frase simplesmente não faz sentido, ou pelo menos precisa de mais explicações. "criptografado e depois criptografado" ???
Maarten Bodewes
Você esqueceu Trent! :)
Dojo
1

Respondendo a essa pergunta no conteúdo que os questionadores pretendiam usar a solução para licenciamento de software, os requisitos são:

  1. Nenhum terceiro pode produzir uma chave de licença ao descompilar o aplicativo
  2. O conteúdo da chave do software não precisa ser seguro
  3. A chave do software não é legível por humanos

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

oden
fonte