Как я могу сделать ISO 9797-1 MAC с тройным DES в C #? - PullRequest
6 голосов
/ 19 мая 2011

У меня есть проект, который предусматривает следующие правила шифрования для 24-байтового блока данных.

1) Криптография должна выполняться с использованием алгоритма полного тройного DES MAC, как определено в 9797-1 как MAC алгоритм 3 с выходным преобразованием 3 без усечения и с DES в режиме CBC в качестве блока шифр с ICV, установленным в нули. Последние 8 байтов зашифрованных данных составляют значение, которое нам нужно.

Программа говорит, что выполненное шифрование неверно. Есть ли какие-либо другие вещи, которые мне нужно сделать, чтобы соответствовать вышеупомянутой спецификации?

Данные имеют 24-байтовое значение, и вывод шифрования должен составлять 8 байт, я полагаю (согласно спецификации). Я получаю все 24 байта в качестве вывода: (

Я написал следующий код для достижения указанной спецификации:

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);

Я тоже это попробовал:

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

Ответы [ 3 ]

4 голосов
/ 09 июня 2011

ISO 9797-1 Алгоритм MAC 3 состоит из использования первого ключа DES для выполнения MAC CBC, а затем только для последнего блока выполняет полную операцию 3-DES.

Попробуйте это:

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);
1 голос
/ 08 июня 2011

Для режима CBC-MAC вы должны зашифровать все сообщение в режиме CBC с нулевым вектором инициализации (IV) и взять только последние 8 байтов (для DES) выходных данных. Кроме того, поскольку вам нужно использовать DES, он должен иметь 64-битный ключ, а не 128. Если вы можете процитировать ISO (не можете найти бесплатную копию), я могу описать, что вы должны сделать, более подробно.

0 голосов
/ 08 июня 2011

Вопрос, возможно, сформулирован не так хорошо, как следовало бы, и очень похож на домашнюю работу. Поэтому я укажу вам на некоторые ссылки, которые вы, возможно, еще не видели, чтобы вы могли учиться.

Кто-то еще использует значения 3DES MAC в TripleDES: указанный ключ является известным слабым ключом для TripleDES и не может использоваться , хотя я бы не рекомендовал изменять поведение .NET, как некоторые ответы есть.

Если все, что вам нужно, это просто использовать 3DES, проверьте это: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/b9239824-e8a1-4955-9193-d9f6993703f3/

...