quality infosolutions encriptar encriptado desencriptar c# cryptography iso des iso8583

infosolutions - login encriptado c#



Generando MAC encriptando datos (2)

  1. El MAC es solo los últimos 8 bytes del cifrado CBC.

  2. Solo debe calcular el MAC sobre parte del mensaje. No creo que ISO 8583 especifique qué partes, por lo que tendrá que mirar las especificaciones que debería haber proporcionado el banco.

Espero que esta pregunta no se cierre porque no es constructiva. He estado golpeando mi cabeza contra la pared para resolver esto y todavía no he llegado a ninguna parte. entonces, esta es mi última esperanza:
La pregunta es básicamente sobre generar el campo MAC de un mensaje ISO 8583-Rev 93.
Tengo algunos volcados de mensajes válidos y estoy tratando de generar el MAC correcto.

  • El algoritmo de cifrado es DES , Mode=CBC , IV = new byte[] {0, 0, 0, 0, 0, 0, 0, 0}
  • La clave de cifrado es: new byte[] { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 }
  • Datos para encriptar es (el mensaje) (208 bytes de largo):

new byte[] { 49, 50, 48, 48, 70, 54, 51, 52, 56, 52, 48, 49, 56, 56, 69, 49, 49, 48, 48, 48, 48, 49, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 22, 54, 50, 56, 48, 50, 51, 49, 49, 49, 48, 48, 48, 48, 54, 52, 50, 51, 49, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 54, 48, 56, 48, 56, 52, 53, 51, 57, 55, 57, 56, 54, 49, 50, 48, 49, 49, 54, 49, 49, 51, 56, 52, 53, 48, 48, 48, 48, 48, 49, 49, 54, 54, 49, 48, 53, 48, 48, 54, 49, 51, 49, 55, 67, 6, 54, 50, 56, 48, 50, 51, 6, 54, 50, 56, 48, 50, 51, 53, 49, 52, 50, 52, 49, 52, 51, 50, 53, 52, 51, 48, 57, 57, 57, 57, 52, 48, 50, 48, 48, 48, 48, 48, 57, 57, 57, 57, 52, 48, 50, 32, 32, 32, 7, 84, 101, 108, 66, 97, 110, 107, 0, 0, 51, 55, 54, 69, 55, 49, 67, 68, 69, 49, 68, 56, 54, 54, 51, 54, 0, 0 };

  • Debería cifrar los datos y (probablemente después de convertir el resultado en hexadecimal) llegar al valor BF327C0CED48F26B válido que se encuentra en el 128º campo del mensaje.

Esto es lo que he intentado (a lo largo de muchas más implementaciones):

var mac = Encrypt(dataToEncrypt); // Convert to hex representation. var hexMac = IsoUtils.ByteArrayToHex(mac); // No BF327C0CED48F26B is in hexMac! something is probably wrong! /// <summary> /// Encrypts the input data. Tried many other ways with the same result. /// </summary> public byte[] Encrypt(byte[] input) { DESCryptoServiceProvider desProvider = new DESCryptoServiceProvider(); desProvider.Padding = PaddingMode.None; desProvider.Mode = CipherMode.CBC; ICryptoTransform cryptoTransform = desProvider.CreateEncryptor(this._key, this._iv); MemoryStream encryptedStream = new MemoryStream(); CryptoStream cryptStream = new CryptoStream(encryptedStream, cryptoTransform, CryptoStreamMode.Write); cryptStream.Write(input, 0, input.Length); cryptStream.FlushFinalBlock(); encryptedStream.Position = 0; byte[] result = new byte[encryptedStream.Length]; encryptedStream.Read(result, 0, (int)encryptedStream.Length); cryptStream.Close(); return result; } /// <summary> /// Gets the hex representation of the byte array. The length is 2xdata.Length /// </summary> public static string ByteArrayToHex(byte[] data) { string result = string.Empty; foreach (byte ascii in data) { var n = (int)ascii; result += n.ToString("X").PadLeft(2, ''0''); } return result; }

En resumen, ¿cómo puedo lograr BF327C0CED48F26B al cifrar la variable dataToEncrypt ?

Realmente apreciaría cualquier ayuda.

ACTUALIZACIÓN : Aquí están los detalles del mensaje en caso de que pueda ser de alguna ayuda:

------------------------------------------------------------------------ Data For Encryption ------------------------------------------------------------------------ HEX NORMAL 31 32 30 30 46 36 33 34 38 34 30 31 38 38 45 31 1200F634840188E1 31 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 1000010000000000 30 30 30 30 16 36 32 38 30 32 33 31 31 31 30 30 000062802311100 30 30 36 34 32 33 31 30 30 30 30 30 30 30 30 30 0064231000000000 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 30 30 30 30 31 31 36 30 38 30 38 34 35 33 39 37 0000116080845397 39 38 36 31 32 30 31 31 36 31 31 33 38 34 35 30 9861201161138450 30 30 30 30 31 31 36 36 31 30 35 30 30 36 31 33 0000116610500613 31 37 43 60 36 32 38 30 32 33 60 36 32 38 30 32 17C62802362802 33 35 31 34 32 34 31 34 33 32 35 34 33 30 39 39 3514241432543099 39 39 34 30 32 30 30 30 30 30 39 39 39 39 34 30 9940200000999940 32 20 20 20 70 54 65 6C 42 61 6E 6B 00 00 33 37 2 TelBank 37 36 45 37 31 43 44 45 31 44 38 36 36 33 36 00 00 6E71CDE1D86636 ------------------------------------------------------------------------ Message ready to be sent ------------------------------------------------------------------------ HEX NORMAL 30 32 32 34 31 32 30 30 46 36 33 34 38 34 30 31 02241200F6348401 38 38 45 31 31 30 30 30 30 31 30 30 30 30 30 30 88E1100001000000 30 30 30 30 30 30 30 31 16 36 32 38 30 32 33 31 000000016280231 31 31 30 30 30 30 36 34 32 33 31 30 30 30 30 30 1100006423100000 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 30 30 30 30 30 30 30 30 31 31 36 30 38 30 38 34 0000000011608084 35 33 39 37 39 38 36 31 32 30 31 31 36 31 31 33 5397986120116113 38 34 35 30 30 30 30 30 31 31 36 36 31 30 35 30 8450000011661050 30 36 31 33 31 37 43 60 36 32 38 30 32 33 60 36 061317C6280236 32 38 30 32 33 35 31 34 32 34 31 34 33 32 35 34 2802351424143254 33 30 39 39 39 39 34 30 32 30 30 30 30 30 39 39 3099994020000099 39 39 34 30 32 20 20 20 70 54 65 6C 42 61 6E 6B 99402 TelBank 00 00 33 37 36 45 37 31 43 44 45 31 44 38 36 36 376E71CDE1D866 33 36 00 00 42 46 33 32 37 43 30 43 45 44 34 38 36 BF327C0CED48 46 32 36 42 00 00 00 00 F26B ------------------------------------------------------------------------ Fields ------------------------------------------------------------------------ [LLVar n ..19 0016] 002 [6280231110000642] [Fixed n 6 0006] 003 [310000] [Fixed n 12 0012] 004 [000000000000] [Fixed n 12 0012] 006 [000000000000] [Fixed n 10 0010] 007 [0116080845] [Fixed n 6 0006] 011 [397986] [Fixed n 12 0012] 012 [120116113845] [Fixed n 4 0004] 014 [0000] [Fixed n 4 0004] 017 [0116] [Fixed an 12 0012] 022 [61050061317C] [LLVar n ..11 0006] 032 [628023] [LLVar n ..11 0006] 033 [628023] [Fixed an 12 0012] 037 [514241432543] [Fixed an 8 0008] 041 [09999402] [Fixed ans 15 0015] 042 [000009999402 ] [LLVar ans ..40 0007] 043 [TelBank] [LLLVar ans ..999 0000] 048 [] [Fixed an 16 0016] 052 [376E71CDE1D86636] [LLLVar ans ..999 0000] 072 [] [Fixed an 16 0016] 128 [BF327C0CED48F26B]

Actualización 2: Bueno, esos idiotas se olvidó de mencionar en sus documentos que el campo 128 debería llenarse con 0 y luego enviarse para cifrado. ¡Encontré esto por intento y error!


CBC Mac, si eso es lo que están haciendo, normalmente se realiza a lo largo || mensaje donde || es concatenación Entonces simplemente necesita llamar a desEncrypt (length || message, key, cbcmode) o algo análogo