tripledescryptoserviceprovider example encrypt decryption decrypt crypto code and algoritmo c# hash cryptography des 3des

example - ¿Cómo puedo hacer un MAC ISO 9797-1 con triple DES en C#?



system security cryptography encrypt decrypt (3)

ISO 9797-1 MAC Algoritmo 3 consiste en utilizar la primera clave DES para realizar un CBC MAC y luego solo para el último bloque realizar una operación completa de 3-DES.

Prueba esto:

byte[] keybytes = ParseHex(key); byte[] key1 = new byte[8]; Array.Copy(keybytes, 0, key1, 0, 8); byte[] key2 = new byte[8]; Array.Copy(keybytes, 8, key2, 0, 8); DES des1 = DES.Create(); des1.Key = key1; des1.Mode = CipherMode.CBC; des1.Padding = PaddingMode.None; des1.IV = new byte[8]; DES des2 = DES.Create(); des2.Key = key2; des2.Mode = CipherMode.CBC; des2.Padding = PaddingMode.None; des2.IV = new byte[8]; // MAC Algorithm 3 byte[] intermediate = des1.CreateEncryptor().TransformFinalBlock(data, 0, data.Length); // Output Transformation 3 byte[] intermediate2 = des2.CreateDecryptor().TransformFinalBlock(intermediate, intermediate.Length - 8, 8); byte[] result = des1.CreateEncryptor().TransformFinalBlock(intermediate2, 0, 8);

Tengo un proyecto que estipula las siguientes reglas de encriptación para un bloque de datos de 24 bytes.

1) La criptografía debe hacerse utilizando el algoritmo triple DES MAC completo como se define en 9797-1 como el algoritmo MAC 3 con la transformación de salida 3 sin truncamiento y con DES en modo CBC como cifrado de bloque con ICV establecido en ceros. Los últimos 8 bytes de datos cifrados constituyen el valor que necesitamos.

El programa dice que la encriptación está mal. ¿Hay alguna otra cosa que deba hacer para que coincida con la especificación anterior?

La información es un valor de 24 bytes y la salida del cifrado debería ser de 8 bytes, supongo (según la especificación). Obtengo los 24 bytes completos como salida :(

Escribí el siguiente código para lograr dicha especificación:

des.KeySize = 128; des.Key = ParseHex(key); des.Mode = CipherMode.CBC; des.Padding = PaddingMode.None; ICryptoTransform ic = des.CreateEncryptor(); CryptoOutput = ic.TransformFinalBlock(CryptoOutput, 0, 24);

Intenté esto también:

MACTripleDES des = new MACTripleDES(ParseHex(key)); byte[] CDCryptp = des.ComputeHash(CryptoOutput);


La pregunta quizás no está tan bien redactada como debería ser, y se parece mucho a la tarea. Así que le indicaré algunos enlaces, que quizás aún no haya visto, para que pueda aprender.

Otra persona está haciendo los valores de MAC 3DES en TripleDES: la clave especificada es una clave débil conocida para ''TripleDES'' y no se puede usar, aunque no recomendaría alterar el comportamiento de .NET como algunas de las respuestas allí.

Si todo lo que necesita es simplemente usar 3DES, consulte esto: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/b9239824-e8a1-4955-9193-d9f6993703f3/


Para el modo CBC-MAC, debe encriptar todo el mensaje en modo CBC con cero vector de inicialización (IV) y tomar solo los últimos 8 bytes (para DES) de la salida. Además, dado que necesita usar DES, debe tener una clave de 64 bits, no 128. Si puede citar el ISO (no puede encontrar la copia gratuita), puedo describir lo que debe hacer en más detalles.