2011-05-19 14 views
5

que tienen un método .NET para hacer cifrado DES en una cadena:Encriptación DES en Java vs .NET - ¿por qué diferente?

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 se ve, 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 vector de inicialización, podrá descifrar en Java algo cifrado en C# . (Pone un overol de Java, desempolva unos 10 años desde la última vez que usó Java, Googles para el cifrado DES en Java ...)

Encontré un enfoque de cifrado DES decente de Java here. 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 qué? ¿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?

+0

Si va a cifrar estos datos porque se necesita seguridad y que requieren el uso de una versión de DES, me gustaría ir con TripleDES que es 168 bits, en lugar de DES estándar que es de 56 bits. El DES estándar es simplemente demasiado fácil de descifrar si tiene datos que deben ser seguros por algún motivo. – FreeAsInBeer

Respuesta

2

¿Ha 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 this question ya que el IV no coincide con el tamaño del bloque del algoritmo. También, vea this question para ejemplos donde el 8 byte IV se usa con éxito.

Un reto adicional en el código .NET es que los valores predeterminados se utilizan para el relleno y el modo de cifrado. No sé qué.NET utilizará para aquellos, aunque las observaciones here indican que el modo de cifrado predeterminado es CBC. No veo ninguna mención de relleno, pero desde el ejemplo de interoperabilidad here, 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.

+0

¡Eres genial! Trunqué la matriz de bytes a 8 bytes, ¡y funciona perfectamente! ¡GRACIAS! –

2

From MSDN:

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

Me parece que simplemente puede 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 de los algoritmo de cifrado DES uso 8 bytes (64 bits, 8 de los cuales son arrojados lejos, dejándole 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 usted necesitará utilizar un algoritmo de TripleDES en Java (varias bibliotecas están disponibles, example, SO Question), para que no tenga que volver a cifrar los datos utilizando el algoritmo de cifrado DES regulares en .NET.

+0

Ummm ... eso es bueno para .NET ... Estoy buscando una solución en Java ... –

+0

@Shaul - Creo que su punto era que se puede cambiar la aplicación .NET para utilizar un byte de 8 IV y luego el enfoque de Java tendrá lo que quiere. – Tim

+0

@Tim - .NET es lo que es; No puedo cambiar eso, y además, ya tenemos datos encriptados que ahora debemos poder descifrar en Java. –

0

¿Has echado un vistazo a la biblioteca 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.

Cuestiones relacionadas