有人能解释如何在OpenSSL命令行中制作TDES MAC吗?
我正在尝试用C为OpenSSL API复制一个正在工作的C#程序的一些功能,并且在复制时遇到了问题。Net MACTripleDES。openssl中的ComputeHash函数。下面是一个伪造数据和密钥的例子:
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
字符串化后,001000000000000000000000000000008000000000000000匹配c#字符串。
cmd>openssl dgst -md5 -mac hmac -macopt hexkey:112233445566778899aabbccddeeff00 bsigin
HMAC-MD5(bsigin)= 7071d693451da3f2608531ee43c1bb8a
该数据太长,并且我期望的数据不是子字符串。sha1等也是如此。我试着分别加密和制作摘要,没有效果。MS没有说明它做什么样的散列,我也找不到如何在openssl中使用TDES设置MAC的文档。
所以我希望这里有人对这两个平台都足够了解,能给我一个像样的提示。
命令行答案:
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是16字节TDES密钥的Lkey或左8字节,Key2是16字节TDMES密钥的Rkey或右8字节。与命令行版本的32字节返回相反,此调用只填充24字节的密码。您仍然需要16..23字节。希望支持声明是直观的。