Добрый день.
Имеется сообщение, которое требуется зашифровать, и ключ, длинной 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"
Помогите найти ошибку в алгоритме!
Ответ
В общем, результат оказался следующим: Ключ шифрования(МАС-ключ) у меня был не верный, + его еще надо было расшифровать Мастер-ключом, и только потом его использовать. Извините за беспокойство, но там еще где-то ошибка :(.
Комментариев нет:
Отправить комментарий