Страницы

Поиск по вопросам

вторник, 16 июля 2019 г.

Ошибка в реализации алгоритма шифрования

Добрый день.
Имеется сообщение, которое требуется зашифровать, и ключ, длинной 16 байт (состоит из 2-ух ключей по 8 байт). Я реализую алгоритм расчета МАС (ISO 8583) Алгоритм 3, Method padding 2 (подробнее здесь)
Код:
//test+ byte[] test_key = {0x31, 0x36, 0x75, 0xCA, 0x93, 0xFE, 0xE3, 0x51, 0x4E, 0x4A, 0x2D, 0x59, 0x2F, 0xA3, 0xE4, 0xA7}; byte[] test_msg = {0x39, 0x39, 0x30, 0x30, 0x30, 0x30, 0x30, 0x35, 0x31, 0x33, 0x31, 0x33, 0x32, 0x38, 0x31, 0x36, 0x30, 0x30, 0x30, 0x30, 0x30, 0x36, 0x38, 0x31, 0x31, 0x30, 0x30, 0x31, 0x30, 0x36, 0x35, 0x34, 0x32, 0x39, 0x39, 0x36, 0x42, 0x38, 0x39, 0x33, 0x30, 0x35, 0x33, 0x34, 0x37, 0x38, 0x31, 0x30, 0x30, 0x35, 0x34, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x31, 0x02}; eIFD = test_msg; Kmac = test_key; //test-
byte[] key1 = new byte[8]; Array.Copy(Kmac, 0, key1, 0, 8); byte[] key2 = new byte[8]; Array.Copy(Kmac, 8, key2, 0, 8);
DES des1 = DES.Create(); des1.BlockSize = 64; des1.Key = key1; des1.Mode = CipherMode.CBC; des1.Padding = PaddingMode.None; des1.IV = new byte[8];
DES des2 = DES.Create(); des2.BlockSize = 64; des2.Key = key2; des2.Mode = CipherMode.CBC; des2.Padding = PaddingMode.None; des2.IV = new byte[8];
// Padd the data with Padding Method 2 (Bit Padding) System.IO.MemoryStream out_Renamed = new System.IO.MemoryStream(); out_Renamed.Write(eIFD, 0, eIFD.Length); out_Renamed.WriteByte((byte)(0x80)); while(out_Renamed.Length % 8 != 0) { out_Renamed.WriteByte((byte)0x00); } byte[] eIfd_padded = out_Renamed.ToArray(); int N_bytes = eIfd_padded.Length / 8; // Number of Bytes
byte[] d1 = new byte[8]; byte[] dN = new byte[8]; byte[] hN = new byte[8]; byte[] intN = new byte[8];
// MAC Algorithm 3 // Initial Transformation 1 Array.Copy(eIfd_padded, 0, d1, 0, 8); hN = des1.CreateEncryptor().TransformFinalBlock(d1, 0, 8);
byte[] k = {0}; // Split the blocks // Iteration on the rest of blocks for(int j = 1; j < N_bytes; j++) { Array.Copy(eIfd_padded, (8 * j), dN, 0, 8); // XOR for(int i = 0; i < 8; i++) intN[i] = (byte)(hN[i] ^ dN[i]);
// Encrypt hN = des1.CreateEncryptor().TransformFinalBlock(intN, 0, 8); }
// Output Transformation 3 byte[] hNdecrypt = des2.CreateDecryptor().TransformFinalBlock(hN, 0, 8); byte[] mIfd = des1.CreateEncryptor().TransformFinalBlock(hNdecrypt, 0, 8);
//Get check Sum CC return mIfd;
Вроде бы все по алгоритму, но где-то тут ошибка. результат должен быть такой:
BitConverter.ToString(mIfd).Replace("-",".") = "EC.CC.0C.9A.8F.EC.8A.B2"
Сейчас получается на выходе:
BitConverter.ToString(mIfd).Replace("-",".") = "A5.23.6F.EB.60.85.80.EA"
Помогите найти ошибку в алгоритме!


Ответ

В общем, результат оказался следующим: Ключ шифрования(МАС-ключ) у меня был не верный, + его еще надо было расшифровать Мастер-ключом, и только потом его использовать. Извините за беспокойство, но там еще где-то ошибка :(.

Комментариев нет:

Отправить комментарий