Командная строка Openssl для Triple DES HMAC, например C# MACTripleDES
Может ли кто-нибудь объяснить, как сделать TDES MAC в командной строке OpenSSL?
Я пытаюсь дублировать некоторые функции работающей программы C# на C для API OpenSSL, и у меня возникают проблемы с дублированием функции.Net MACTripleDES.ComputeHash в openssl. Вот пример с поддельными данными и ключом:
using (MACTripleDES hmac = new MACTripleDES(Utilities.HexStringToByteArray("112233445566778899aabbccddeeff00")))
{
// Compute the hash of the input file.
byte[] hashValue = hmac.ComputeHash(Utilities.HexStringToByteArray("001000000000000000000000000000008000000000000000"));
string signature = Utilities.ByteArrayToHexString(hashValue);
PrintToFeedback("Bogus Signature = " + signature);
}
Результатом будет "Поддельная подпись = A056D11063084B3E". Моя новая программа на C должна предоставлять такой же хэш этих данных, чтобы взаимодействовать со своей более широкой средой. Но способ сделать это в openSSL ускользает от меня. Это показывает, что данные openssl начинаются так же, как данные C#:
cmd>od -tx1 bsigin
0000000 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000020 80 00 00 00 00 00 00 00
stringified, 001000000000000000000000000000008000000000000000 СОВПАДАЕТ со строкой C#.
cmd>openssl dgst -md5 -mac hmac -macopt hexkey:112233445566778899aabbccddeeff00 bsigin
HMAC-MD5(bsigin)= 7071d693451da3f2608531ee43c1bb8a
Эти данные слишком длинные, и мои ожидаемые данные не являются подстрокой. То же самое для -sha1 и т. Д. Я пробовал зашифровать и сделать дайджест отдельно, безуспешно. MS не говорит, какой хэш делает, и я не могу найти документацию о том, как настроить MAC с TDES в openssl.
Так что я надеюсь, что кто-то здесь знает достаточно об обеих платформах, чтобы дать мне достойный намек.
1 ответ
Ответ командной строки:
cmd>openssl enc -des-ede-cbc -K 112233445566778899aabbccddeeff00 -iv 0000000000000000 -in bsigin -out bsigout
cmd>od -tx1 bsigout
0000000 7c de 93 c6 5f b4 03 21 aa c0 89 b8 ae f3 da 5d
0000020 a0 56 d1 10 63 08 4b 3e 4c 03 41 d6 dd 9e e4 32
^^^^^^^^^^^^^^^^^^^^^^^
То есть форма командной строки возвращает 32 байта, а байты 16..23 содержат hmac.
Ответ API:
DES_key_schedule SchKey1,SchKey2;
DES_cblock iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
DES_set_key((C_Block *)Key1, &SchKey1);
DES_set_key((C_Block *)Key2, &SchKey2);
DES_ede3_cbc_encrypt( (unsigned char*)input_data, (unsigned char*)cipher, inputLength, &SchKey1, &SchKey2, &SchKey1, &iv, DES_ENCRYPT);
Где Key1 - это Lkey или 8 левых байтов 16-байтового ключа TDES, а Key2 - это Rkey или 8 правых байтов 16-байтового ключа TDES. Этот вызов заполняет только 24 байта шифра, в отличие от 32-байтового возврата версии командной строки. Вы по-прежнему берете байты 16..23. Надеюсь, подтверждающие заявления интуитивно понятны.