¿Cuál es la diferencia entre cifrar y firmar en cifrado asimétrico?

297

¿Cuál es la diferencia entre cifrar algunos datos frente a firmar algunos datos (usando RSA)?

¿Simplemente revierte el papel de las claves público-privadas?

Por ejemplo, quiero usar mi clave privada para generar mensajes, de modo que solo yo pueda ser el remitente. Quiero que mi clave pública se use para leer los mensajes y no me importa quién los lea. Quiero poder encriptar cierta información y usarla como clave de producto para mi software. Solo me importa ser el único que pueda generarlos. Me gustaría incluir mi clave pública en mi software para descifrar / leer la firma de la clave. No me importa quién puede leer los datos en la clave, solo me importa que sea el único verificable que pueda generarlos.

¿Es útil la firma en este escenario?

mmcdole
fuente

Respuestas:

441

Al cifrar, usa su clave pública para escribir un mensaje y ellos usan su clave privada para leerlo.

Al firmar, usa su clave privada para escribir la firma del mensaje, y ellos usan su clave pública para verificar si es realmente suya.

Quiero usar mi clave privada para generar mensajes, de modo que solo yo pueda ser el remitente.

Quiero que mi clave pública se use para leer los mensajes y no me importa quién los lea

Esto es firmar , se hace con su clave privada.

Quiero poder encriptar cierta información y usarla como clave de producto para mi software.

Solo me importa ser el único que pueda generarlos.

Si solo necesita saberlo usted mismo, no necesita jugar con las teclas para hacerlo. Puede generar datos aleatorios y guardarlos en una base de datos.

Pero si desea que las personas sepan que las claves son realmente suyas, debe generar datos aleatorios, mantener una base de datos Y firmarla con su clave.

Me gustaría incluir mi clave pública en mi software para descifrar / leer la firma de la clave.

Probablemente necesitará comprar un certificado para su clave pública de un proveedor comercial como Verisign o Thawte, para que las personas puedan verificar que nadie haya falsificado su software y reemplazado su clave pública por la suya.

Quassnoi
fuente
77
Técnicamente hablando, cuando dice que la clave privada se usa para escribir la firma del mensaje, ¿está diciendo que el hash del mensaje se está cifrando con mi clave privada?
Andy Ibáñez
44
@AndyIbanez: lo que está cifrado (el resumen ) también puede incluir una marca de tiempo y algo de sal al azar, pero sí, eso es lo esencial.
Quassnoi
77
@Quassnoi De hecho, cuando decimos "firmar con la clave privada", significa "no cifrar", sino que significa "descifrar". Firmar el mensaje en términos generales es lo mismo que descifrar con la clave privada y en el receptor cifrar con clave pública, de esta manera el hash se convertirá en el mismo y podría compararse.
Johnny Willer
55
@JohnnyWiller: como @slim menciona a continuación, el núcleo matemático es el mismo para las funciones de cifrado y descifrado. No son funciones separadas, son la misma función f(key, message), de modo quef(private, f(public, message)) === f(public, f(private, message)) === message
Quassnoi
2
@Honey no, no lo es. Generar el par de claves es gratis. El costo implica hacer que los demás crean que la firma es realmente suya. Para hacerlo, tiene su propia clave pública, que anteriormente generó de forma gratuita, firmada por una autoridad que podría o no cobrarle dinero por eso.
Quassnoi
143

En la criptografía RSA, cuando genera un par de claves, es completamente arbitrario cuál elige ser la clave pública y cuál es la clave privada. Si encripta con uno, puede desencriptar con el otro; funciona en ambas direcciones.

Por lo tanto, es bastante simple ver cómo puede cifrar un mensaje con la clave pública del receptor , para que el receptor pueda descifrarlo con su clave privada .

Una firma es una prueba de que el firmante tiene la clave privada que coincide con alguna clave pública. Para hacer esto, sería suficiente cifrar el mensaje con la clave privada de ese remitente e incluir la versión cifrada junto con la versión de texto sin formato. Para verificar el remitente, descifre la versión encriptada y verifique que sea la misma que el texto sin formato.

Por supuesto, esto significa que su mensaje no es secreto. Cualquiera puede descifrarlo, porque la clave pública es bien conocida. Pero cuando lo hacen, han demostrado que el creador del texto cifrado tiene la clave privada correspondiente.

Sin embargo, esto significa duplicar el tamaño de su transmisión: texto sin formato y texto cifrado juntos (suponiendo que desee que las personas que no están interesadas en verificar la firma, lean el mensaje). Por lo tanto, en general, se crea una firma creando un hash del texto sin formato. Es importante que no se puedan crear hashes falsos, por lo que se utilizan algoritmos de hash criptográficos como SHA-2.

Entonces:

  • Para generar una firma, cree un hash a partir del texto sin formato, cifre con su clave privada e inclúyalo junto con el texto sin formato.
  • Para verificar una firma, haga un hash del texto plano, descifre la firma con la clave pública del remitente, verifique que ambos hash sean iguales.
delgado
fuente
8
@headcode solo se aplica a claves asimétricas. Las claves simétricas no vienen en pares.
delgado
3
De hecho, solo se aplica a las claves RSA. Con las claves ECDSA, por ejemplo, puede generar trivialmente la clave pública a partir de la clave privada, y la clave privada es un escalar, mientras que la clave pública es una coordenada.
David Schwartz
55
¿Cómo puede descifrar mensajes con claves PÚBLICAS? ¿No se descifran los mensajes solo con claves privadas?
daremkd
3
5 fuentes que contradicen esta respuesta 1 , 2 , 3 , 4 , 5
sea ​​el
66
No es arbitrario a cuál llamas público y privado. Puede generar la clave pública a partir de la clave privada, pero no puede generar la clave privada a partir de la clave pública. ¿No es eso una gran diferencia?
Greg Schmit
23

Existen dos problemas distintos pero estrechamente relacionados para establecer una comunicación segura

  1. Cifre los datos para que solo las personas autorizadas puedan descifrarlos y leerlos.
  2. Verifique la identidad / autenticación del remitente.

Ambos problemas se pueden resolver de manera elegante utilizando la criptografía de clave pública.

I. Cifrado y descifrado de datos.

Alice quiere enviar un mensaje a Bob que nadie debería poder leer.

  • Alice cifra el mensaje con la clave pública de Bob y lo envía.
  • Bob recibe el mensaje y lo descifra con su clave privada.

Tenga en cuenta que si A quiere enviar un mensaje a B, A necesita usar la clave pública de B (que está disponible públicamente para cualquier persona) y ni la clave pública ni privada de A aparece aquí.

Entonces, si desea enviarme un mensaje, debe conocer y usar la clave pública que le proporciono y solo yo podré descifrar el mensaje ya que soy el único que tiene acceso a la clave privada correspondiente.

II Verificar la identidad del remitente (autenticación)

Alice quiere enviarle un mensaje a Bob nuevamente. El problema de cifrar los datos se resuelve utilizando el método anterior.

Pero, ¿qué pasa si estoy sentada entre Alice y Bob, presentándome como 'Alice' a Bob y enviando mi propio mensaje a Bob en lugar de reenviar el enviado por Alice? Aunque no puedo descifrar y leer el mensaje original enviado por Alice (que requiere acceso a la clave privada de Bob), estoy secuestrando toda la conversación entre ellos.

¿Hay alguna manera de que Bob pueda confirmar que los mensajes que está recibiendo son enviados por Alice?

  • Alice firma el mensaje con su clave privada y lo envía. (En la práctica, lo que se firma es un hash del mensaje, por ejemplo, SHA-256 o SHA-512).
  • Bob lo recibe y lo verifica usando la clave pública de Alice. Dado que la clave pública de Alice verificó con éxito el mensaje, Bob puede concluir que el mensaje ha sido firmado por Alice.
Siva Prakash
fuente
1
Entonces, cuando firmas el mensaje, ¿firmas el mensaje en sí o el mensaje cifrado?
FrostyStraw
21

Sí, piense en firmar datos para darle su propio sello de cera que nadie más tiene. Se hace para lograr integridad y no repudio . El cifrado es para que nadie más pueda ver los datos. Esto se hace para lograr la confidencialidad . Ver wikipedia http://en.wikipedia.org/wiki/Information_security#Key_concepts

Una firma es un hash de su mensaje firmado con su clave privada.

Johnno Nolan
fuente
16

Firmar es generar un "hash" con su clave privada que se puede verificar con su clave pública. El texto se envía en claro.

El cifrado utiliza la clave pública del receptor para cifrar los datos; La decodificación se realiza con su clave privada.

Entonces, el uso de claves no se invierte (de lo contrario, su clave privada ya no sería privada).

Doug Currie
fuente
En el cifrado asimétrico normal, el cifrado se realiza con la clave pública del destinatario, no con su clave privada.
mmcdole
¿Te perdiste que esta pregunta era específicamente acerca de RSA donde se invierte el uso de las claves y donde no compromete la clave privada?
David Schwartz
8

Está describiendo exactamente cómo y por qué se usa la firma en la criptografía de clave pública. Tenga en cuenta que es muy peligroso firmar (o cifrar) los mensajes aritrarios proporcionados por otros; esto permite ataques a los algoritmos que podrían comprometer sus claves.

Michael Borgwardt
fuente
1
¿Los navegadores web no cifran datos arbitrarios al usar SSL?
Ian Warburton
2
@IanWarburton: Pero no usan cifrado asimétrico para eso. Las transferencias de datos reales utilizan cifrado simétrico con una clave de sesión generada aleatoriamente.
Michael Borgwardt
1
@IanWarburton: no, porque ninguno de los dos sería elegido por un atacante. El peligro radica en cifrar o firmar algo directamente suministrado por un atacante, ya que puede crearse de manera muy deliberada para revelar información sobre su clave privada, o incluso crear firmas que parecen válidas para algo que no pretendía firmar. Un desglose detallado de cómo funciona el último caso para RSA está aquí: crypto.stackexchange.com/questions/35644/…
Michael Borgwardt
2
@IanWarburton: es por eso que RSA requiere relleno, por lo que nunca encripta solo un mensaje elegido: en.wikipedia.org/wiki/… , pero son realmente las operaciones que involucran la clave privada (como la firma) las que son especialmente vulnerables a la entrada elegida.
Michael Borgwardt
1
@IanWarburton No soy un experto en criptografía, pero por lo que entiendo, eso no debería causar ningún problema.
Michael Borgwardt
8

La firma indica que realmente eres la fuente o el aval del objeto firmado. Sin embargo, todos pueden leer el objeto.

Cifrar significa que solo aquellos con la clave privada correspondiente pueden leerlo, pero sin firmar no hay garantía de que esté detrás del objeto cifrado.

rjamestaylor
fuente
Si mi clave púbica descifra el mensaje, solo yo podría haberlo enviado. (Suponiendo que mi clave privada no esté comprometida)
Dojo
5

¿Cuál es la diferencia entre cifrar algunos datos frente a firmar algunos datos (usando RSA)?

El cifrado preserva la confidencialidad del mensaje ("algunos datos"), mientras que la firma proporciona no repudio: es decir, solo la entidad que lo firmó podría haberlo firmado. También hay diferencias funcionales; sigue leyendo.

¿Simplemente revierte el papel de las claves público-privadas?

Absolutamente no. El uso de las mismas claves privadas para firmar y descifrar (o, del mismo modo, las mismas claves públicas para verificación y cifrado ) está mal visto, ya que no debe mezclar propósitos. Esto no es tanto un problema matemático (RSA aún debe ser seguro), sino un problema con la administración de claves , donde, por ejemplo, la clave de firma debe tener una vida más corta y contener más protección antes de usarse.

Para el mismo mensaje, debe usar la clave privada del remitente para firmar y la clave pública de confianza del receptor para el cifrado. Por lo general, se utiliza firmar y luego cifrar; de lo contrario, un adversario podría reemplazar la firma por la suya. Del mismo modo, debe usar la clave privada del receptor para el descifrado y la clave pública confiable del remitente para la verificación.

Además, debe comprender que la generación de firmas no utiliza "cifrado con la clave privada". Aunque todas las operaciones de RSA se basan en la exponenciación modular, el esquema de relleno es completamente diferente para la generación de firmas. Además, la clave pública tiene propiedades completamente diferentes a la clave privada RSA en todos los usos prácticos de RSA.

Por ejemplo, quiero usar mi clave privada para generar mensajes, de modo que solo yo pueda ser el remitente.

Esa es una propiedad de no repudio, que se puede lograr mediante la firma.

Quiero que mi clave pública se use para leer los mensajes y no me importa quién los lea.

La clave pública debe considerarse conocida por todos. Si desea que todos lean los mensajes, simplemente no los cifre.

La firma generalmente no influirá en el contenido del mensaje. El mensaje se considera separado de las firmas. Oficialmente, tales firmas se conocen como "firmas con apéndice", donde el apéndice es el mensaje. Es un nombre un poco extraño ya que el mensaje se considera más importante que la firma sobre él, pero sí. Solo algunas firmas ofrecen recuperación de mensajes (parcial); ya no se usan mucho y generalmente se consideran obsoletos.

Tenga en cuenta que los protocolos de firma como CMS pueden implementar un formato contenedor que incluye tanto el mensaje como la firma. En ese caso, primero debería obtener el mensaje, aún sin cifrar, del contenedor, al igual que descomprimir un archivo de un archivo .zip simple. Por lo tanto, el mensaje puede estar oculto a la vista y no puede usarse directamente en ese caso.

Quiero poder encriptar cierta información y usarla como clave de producto para mi software. Solo me importa ser el único que pueda generarlos.

El cifrado se utiliza para lograr la confidencialidad. En el pasado, la generación de firmas RSA a menudo se consideraba como "cifrado con la clave privada". Sin embargo, las operaciones son bastante diferentes como se explicó anteriormente, y los estándares posteriores intentan desesperadamente separar el cifrado y la generación de firmas.

Me gustaría incluir mi clave pública en mi software para descifrar / leer la firma de la clave. No me importa quién puede leer los datos en la clave, solo me importa que sea el único verificable que pueda generarlos.

Sí, esto se llama establecer confianza en la clave pública. Sin embargo, proteger el código de su programa es muy diferente de proteger los mensajes. Puede realizar la firma del código, pero luego necesitaría algo para verificar la firma fuera de su código . Hay sistemas operativos que ofrecen esto.

Hay Microsoft Authenticode por ejemplo. Las tiendas de aplicaciones como la tienda de aplicaciones iStore y Android pueden o no usar la firma de código, pero ofrecen cierta seguridad de que su aplicación no está clonada o al menos no está clonada dentro de la tienda. La criptografía no siempre es la solución después de todo.

Mantener su código de ser clonado / alterado en absoluto es mucho más difícil, y que estaría sólidamente en territorio DRM si vas de esa manera.

¿Es útil la firma en este escenario?

Si, absolutamente. Sin duda, puede ayudar asegurarse de que los mensajes solo fueron firmados por usted, si existe confianza en la clave pública. Si puede ser útil para autenticar el código de su aplicación / clave pública integrada, depende completamente del entorno en el que espera ejecutar el código.

Maarten Bodewes
fuente
"En el pasado, la generación de firmas RSA a menudo se consideraba como" cifrado con la clave privada ". Sin embargo, las operaciones son bastante diferentes como se explicó anteriormente, y los estándares posteriores intentan desesperadamente separar la generación de cifrado y firma". - Esto no está claro para mí. Cualquiera de KeyPair puede ser el pk o sk y lo que uno encripta el otro puede descifrar. Si estamos de acuerdo con eso, ¿cómo podemos argumentar que la firma y el cifrado son distintos de alguna manera significativa? Ambos cifran y luego solo pueden descifrarse con la otra clave. He visto referencias a las funciones de firma, ¿está relacionado?
Morgan
La única diferencia que conozco en la función de firma es el hash del mensaje antes del cifrado.
Morgan
4

En su escenario, no cifra en el significado del cifrado asimétrico; Prefiero llamarlo "codificar".

Entonces codifica sus datos en alguna representación binaria, luego firma con su clave privada. Si no puede verificar la firma a través de su clave pública, sabe que los datos firmados no se generan con su clave privada. ("verificación" significa que los datos sin firmar no son significativos)

devio
fuente
2

Funcionalmente, utiliza el cifrado de clave pública / privada para asegurarse de que solo el receptor pueda leer su mensaje. El mensaje se cifra utilizando la clave pública del receptor y se descifra con la clave privada del receptor.

La firma que puede usar para informar al receptor que creó el mensaje y que no ha cambiado durante la transferencia. La firma del mensaje se realiza con su propia clave privada. El receptor puede usar su clave pública para verificar que el mensaje no haya sido manipulado.

En cuanto al algoritmo utilizado: eso implica una función unidireccional, ver por ejemplo wikipedia . Uno de los primeros algoritmos utiliza números primos grandes, pero desde entonces se han inventado más funciones unidireccionales.

Busque 'Bob', 'Alice' y 'Mallory' para encontrar artículos de introducción en Internet.

Gerbrand
fuente
¿Puedes comentar sobre mi caso de uso? Quiero usar una clave privada para cifrar y una clave pública para permitir que cualquiera y todos puedan descifrar.
mmcdole
1
No es cierto que todo el cifrado asimétrico se base en números primos, es solo el ejemplo más conocido (RSA); Existen otros métodos, como la criptografía de curva elíptica.
Michael Borgwardt
"El mensaje se encripta y luego se encripta utilizando la clave pública del receptor". Esa oración simplemente no tiene ningún sentido, o al menos necesita más explicaciones. "encriptado y luego encriptado" ???
Maarten Bodewes
¡Te olvidaste de Trent! :)
Dojo
1

Respondiendo a esta pregunta en el contenido que la intención de los interrogadores era utilizar la solución para la licencia de software, los requisitos son:

  1. Ningún tercero puede producir una clave de licencia al descompilar la aplicación
  2. El contenido de la clave de software no necesita ser seguro
  3. La clave de software no es legible por humanos

Una firma digital resolverá este problema, ya que los datos sin procesar que hacen que la clave se pueda firmar con una clave privada, lo que hace que no sea legible para el ser humano, pero podría decodificarse si se realiza la ingeniería inversa. Pero la clave privada es segura, lo que significa que nadie podrá hacer licencias para su software (que es el punto).

Recuerde que no puede evitar que una persona experta elimine los bloqueos de software de su producto. Entonces, si tienen que hackear cada versión que se lanza. Pero realmente no desea que puedan generar nuevas claves para su producto que puedan compartirse para todas las versiones.

Python La documentación de PyNaCl tiene un ejemplo de 'Firma digital' que se adaptará al propósito. http://pynacl.readthedocs.org/en/latest/signing/

y de causa NaCl proyecto a ejemplos C

Oden
fuente