2009-12-31 9 views
10

Al usar el algoritmo blowfish de la biblioteca openssl, se puede cifrar y descifrar cualquier dato.¿Cómo comprobar si el descifrado fue exitoso?

Además, cualquier dato puede encriptarse (descifrarse) con cualquier tecla \ iv. No hay forma en openssl de saber si el descifrado fue exitoso o no. Es solo una transformación matemática.

Entonces, ¿qué debo hacer para asegurarme de que el cifrado fue exitoso: que algunos datos se descifraron con la misma clave/iv que se cifró?

¿Debo agregar algunos bytes MAGIC al frente de los datos que deben verificarse después del descifrado?

+0

Los bytes mágicos ayudarían. Mucho mejor es agregar un hash seguro a los datos encriptados como se describe debajo por los naivistas. –

Respuesta

8

Puede agregar una suma de comprobación (por ejemplo, MD5 del contenido original) al final del archivo. Después de descifrarlo, los últimos 16 bytes deben volver a ser iguales a md5 (contenido-16 bytes)

+3

suma de comprobación! = MD5 – jldupont

+0

MD5 se puede utilizar como una función de suma de comprobación, ya que tiene una relación relativamente baja de colisiones.Por supuesto, no es una función típica de suma de comprobación, pero es fácil de calcular y es bastante rápida (sé que CRC es más rápido ;-) – naivists

+0

@naivists: el punto es que una "suma de comprobación" es una bestia diferente de un "algoritmo hash" . – jldupont

1

De las muchas soluciones posibles, tal vez considere usar un CRC.

+0

Según el artículo de Wikipedia, "un CRC de n bits, aplicado a un bloque de datos de longitud arbitraria, detectará cualquier ráfaga de error única que no supere n bits". Esto significa que debería usar CRC con la misma longitud que mi mensaje cifrado. Porque, por lo que entiendo, el "error" en el mensaje descifrado con clave incorrecta probablemente tendrá la longitud máxima (duración del mensaje). Esto no parece eficiente en la memoria. –

+0

no, por ejemplo, un CRC de 32 bits detectará cualquier error de un solo bit ** explosión ** no más de 32 bits ** independiente ** de la longitud del mensaje cifrado. En otras palabras, es muy eficiente en la memoria. Espero que esto ayude. – jldupont

+0

Espera, espera, espera :-) Si el mensaje fue descifrado con la clave incorrecta, la longitud del error será la misma que la longitud del mensaje, ¿verdad? Porque muy probablemente todo estará mal. ¿Derecha? ¿Significa que no se detectará el error en el mensaje de más de 32 bits? Perdón por, tal vez, preguntas estúpidas. –

0

Creo que el método de suma de comprobación al final de los datos es el mejor, sin embargo, necesita descifrar todo el contenido hasta el fin.

desde este punto de vista, los bytes mágicos al principio serían una ventaja, porque puede decidir si el descifrado tuvo éxito en el primer bloque. sin embargo, se podría argumentar que mediante la inspección de su código fuente, un atacante tiene una posible ventaja (escenario de texto claro parcialmente conocido).

así que lo que hice (finalmente dentro de un software productivo) fue usar la clave misma para el primer bloque (en lugar de utilizar bytes mágicos constantes o predecibles). esto se traduce en los siguientes conocimientos adicionales para un atacante:

key = decrypt(ciphertext, key) 

no he encontrado una prueba de que esto sería un indicio útil para un atacante si se utiliza, por ejemplo, AES. tal vez alguien sabe más sobre esto.

0

Los bytes mágicos, las sumas de comprobación y la clave de encriptación cifrada hacen que los ataques de fuerza bruta sean mucho más fáciles ya que el atacante solo necesita recorrer las 2256 posibilidades donde puede ejecutar el mensaje mediante descifrado y buscar esa magia o suma de comprobación o clave dentro de los datos descifrados Es mucho más difícil para él romperlo si no tiene nada que buscar, lo que significa que puede romperlo y nunca darse cuenta.

Cuestiones relacionadas