2011-05-19 18 views
6

Tengo un proyecto que estipula las siguientes reglas de encriptación para un bloque de datos de 24 bytes.¿Cómo puedo hacer un MAC ISO 9797-1 con triple DES en C#?

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

El programa dice que la encriptación es incorrecta. ¿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). Me estoy haciendo todo el 24 bytes como salida :(

me escribió 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); 

yo probamos este también:

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

¿Cuál es el tipo de 'des'? –

+1

El tamaño de la clave 3DES es de 112 bits –

+0

@Anders triple des mac completo – logeeks

Respuesta

-1

La cuestión no es, quizás, tan bien redactado como debe ser, y se parece mucho a la tarea. Así que le indicaré algunos enlaces, que quizás no haya visto aún, para que pueda aprender.

Alguien más está haciendo 3DES MAC valor es al TripleDES: Specified key is a known weak key for 'TripleDES' and cannot be used aunque no recomendaría alterar el comportamiento de .NET como algunas de las respuestas allí.

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

1

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

+0

¡Por favor, descríbalo! –

+0

Indique la cita de ese ISO, no puedo describir los detalles sin tener el documento. –

4

ISO 9797-1 MAC El 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); 
+0

¿Alguien puede traducir esto al objetivo c ? – Patrick

Cuestiones relacionadas