vernam sustitucion por murcielago metodo mensaje hill desencriptar cifrado atbash c# java encryption cryptography

c# - sustitucion - desencriptar un mensaje en java



Cifrado DES en Java vs.NET: ¿por qué es diferente? (3)

Tengo un método .NET para hacer el cifrado DES en una cadena:

public static string EncryptTripleDES(string value, byte[] encryptionKey, byte[] initializationVector) { if (!value.IsNullOrEmpty()) { TripleDESCryptoServiceProvider cryptoProvider = new TripleDESCryptoServiceProvider(); MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, cryptoProvider.CreateEncryptor(encryptionKey, initializationVector), CryptoStreamMode.Write); StreamWriter sw = new StreamWriter(cs); sw.Write(value); sw.Flush(); cs.FlushFinalBlock(); ms.Flush(); //convert back to a string return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length); } else { return ""; } }

Como puede ver, el algoritmo toma 2 parámetros: una "clave de cifrado" y un "vector de inicialización".

Ahora necesito escribir una función de cifrado / descifrado DES en Java, paralela a esta función, de modo que si proporciona la misma clave de cifrado y el mismo vector de inicialización, podrá descifrar en Java algo cifrado en C #. (Pone el mono de Java, elimina el polvo unos 10 años desde la última vez que usó Java, Googles para el cifrado DES en Java ...)

Encontré aquí un enfoque de cifrado DES decente. Pero, vaya, resulta que este algoritmo insiste en un vector de inicialización de exactamente 8 bytes; ¡el código .NET usa un vector de inicio de 24 bytes!

¿Ahora que? ¿Por qué Java insiste en un vector de inicio de 8 bytes? ¿Y cómo puedo descifrar algo que fue encriptado usando un vector de inicio de 24 bytes?


¿Has echado un vistazo a la biblioteca de Bouncy Castle para Java? No puedo decir por su (muy escasa) documentación y muestras, pero parece ser una biblioteca ampliamente utilizada, así que espero que sea tan flexible. Vale la pena echar un vistazo al menos si aún no lo has hecho.


¿Has intentado utilizar los primeros 8 bytes del vector de inicialización de 24 bytes en el código de Java? Todo lo que veo al buscar y mirar el código fuente indica que solo se usarán los primeros 8 bytes, ya que Triple DES tiene un tamaño de bloque de 8 bytes. Estoy realmente sorprendido de que el código .NET no genere una excepción como la mencionada en esta pregunta ya que el IV no coincide con el tamaño de bloque del algoritmo. Además, vea esta pregunta para ejemplos donde el byte IV de 8 bytes se usa con éxito.

Un desafío adicional en el código .NET es que los valores predeterminados se utilizan para el relleno y el modo de cifrado. No sé lo que .NET usará para eso, aunque las observaciones aquí indican que el modo de cifrado predeterminado es CBC. No veo ninguna mención de relleno, pero desde el ejemplo de interoperabilidad aquí , parece que CBC y PKCS5Padding funcionarán. Sin embargo, dudaría en confiar en los valores predeterminados para la interoperabilidad, ya que pueden ser problemáticos.

Procedente de un fondo Java, no estoy seguro de qué está pasando en el código C # utilizando un IV de 24 bytes, pero el IV de 8 bytes impuesto por Java parece ser correcto para mí. Siempre estoy interesado en demostrar que estoy equivocado y aprender algo nuevo. Bouncycastle como lo menciona @Tim también impone esta misma restricción y parece que .NET también lo hace.


Desde MSDN :

La propiedad IV se establece automáticamente en un nuevo valor aleatorio cada vez que crea una nueva instancia de una de las clases SymmetricAlgorithm o cuando llama manualmente al método GenerateIV. El tamaño de la propiedad IV debe ser el mismo que la propiedad BlockSize.

Por lo tanto, me parece que puede simplemente cambiar la propiedad BlockSize, y luego puede configurar el IV al tamaño que necesite.

EDITAR

Por lo que he reunido en mi investigación, parece que todas las implementaciones del algoritmo de cifrado DES usan 8 bytes (64 bits, 8 de los cuales se descartan, dejándote con 56 bytes). TripleDES (3DES) permite una clave de 24 bytes (o 192 bits, 24 de los cuales se descartan, dejándote 168 bits).

Parece que necesitará usar un algoritmo TripleDES en Java (hay varias bibliotecas disponibles, por ejemplo , Pregunta SO ), o tendrá que volver a cifrar sus datos utilizando el algoritmo de cifrado DES normal en .NET.