【发布时间】:2020-07-30 04:29:20
【问题描述】:
谁能解释如何在 OpenSSL 命令行中制作 TDES MAC?
我正在尝试在 C 中为 OpenSSL API 复制工作 C# 程序的某些功能,但在 openssl 中复制 .Net MACTripleDES.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);
}
结果是“Bogus 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 的文档。
所以我希望这里有人对这两个平台有足够的了解,能给我一个体面的提示。
【问题讨论】:
-
原来 MS 确实展示了它的工作:github.com/microsoft/referencesource/tree/master/mscorlib/…
-
如果我使用 -des-ede-cbc 加密,我会得到 32 字节的结果。字节 16..23 保存所需的“签名”,即匹配 MS ComputeHash。但是这里的很多文章都说这很糟糕,我不应该滚动自己的加密代码。这个用大字写的:stackoverflow.com/questions/25932550/…
标签: c# openssl tripledes system.security message-authentication-code