c# - .NET 密码学中 MACTripleDES 和 HMAC 的区别
问题描述
正如标题所说,我并不真正理解键控哈希算法的两种实现之间的区别(或者,准确地说,是MACTripleDES
和 的实现HMAC
)。
都可以ComputeHash()
和HashCore()
。我看到的唯一区别是,MACTripleDES
您可以指定要使用哪种类型的哈希函数,并且:
HashCore()
HMAC:
将写入对象的数据路由到用于计算哈希值的默认 HMAC 哈希算法。
HashCore()
MACTripleDES:
将写入对象的数据路由到 TripleDES 加密器以计算消息验证码 (MAC)
根据我对 MAC 的了解,您可以使用键控哈希算法来消化消息以生成 MAC。因此,在 中MACTripleDES
,您使用某种散列算法对消息进行散列,然后使用 TripleDES 对其进行加密以生成 MAC,而在HMAC
您只是直接对原始消息使用一些键控散列算法?
解决方案
MACTripleDES
不使用哈希函数来计算 MAC。它使用TripleDES
哪种加密算法。
HMAC
是一个abstract
类,意味着您不能实例化该类本身。你必须从中获得。
HMAC
从内部调用派生的类HashCore
。HashCore
被覆盖以对每个派生类执行特定的哈希函数:
- 用于 HMACMD5 的MD5
- RIPEMD-160用于 HMACRIPEMD160
- HMACSHA1的 SHA-1
- HMACSHA256的 SHA-256
- HMACSHA384的 SHA-386
- HMACSHA512的 SHA-512
MACTripleDES
,派生自KeyedHashAlgorithm
,也有一个HashCore
方法,但它与 中的方法不同HMAC
。此HashCore
方法被定义为专门用于TripleDES
计算 MAC。因此,您不能“指定要使用哪种类型的哈希函数”。
由于TripleDES
不是散列函数,它不应该也不应该从HMAC
.
附录:
根据现已撤回的 FIPS 113 文件:
3 DAC 的产生
数据验证算法 (DAA) 使用 FIPS PUB 46 中指定的数据加密标准 (DES) 加密算法。DES 算法使用加密密钥将 64 位输入向量转换(或加密)为 64 位输出向量。令 D 为任何 64 位输入向量并假设已选择一个键。使用加密操作将 DES 应用于 D 时,作为 DES 算法的输出的 64 位向量 O 表示如下。
O = e(D)
要验证的数据(例如,记录、文件、消息或程序)被分组为连续的 64 位块:D1、D2、.... Dn。如果数据位数不是 64 的倍数,则最终输入块将是部分数据块,左对齐。附加零以形成完整的 64 位块。DAC 的计算由以下等式给出,其中 + 表示两个向量的异或。
01 = e(D1)
02 = e(D2 + 01)
03 = e(D3 + 02)
开 = e(Dn + 0n-1)DAC 从 On 中选择。实现 DAA 的设备应能够选择 On 的最左边 M 位作为 DAC,其中 16 < M < 64 且 M 是 8 的倍数。附录 1 中给出了 DAC 生成的框图,示例如下附录 2 中给出。初始化向量 (IV) = 0 的密码块链接模式 (CBC) 和 IV = D1 且数据等于 D2、D3、...、Dn 的 64 位密码反馈模式(参见 FIPS PUB 81) 两者都产生所需的 DAC 计算
如您所见,它是使用 CBC 模式加密的数据(以 64 位块形式)。MAC 是最后一个被截断为 24 到 56 位(含)的加密数据块。
尽管 FIPS 113DES
将算法指定为同样适用于TripleDES
.
注意:因为DES
和TripleDES
被认为是不安全的,所以MACTripleDES
. 这就是 FIPS 113 被撤销的原因。
推荐阅读
- python - 如何在 pandas 单元格计算中正确使用 apply 和 lambda
- ios - UICollectionView 中的画外音 - 缺少一些翻译
- flutter - 计算Flutter中先前位置和当前位置之间的距离
- swiftui - 在 SwiftUI 开始渲染 ContentView 之前,我们如何从 Views 中独立运行一些逻辑?
- php - 是否可以在 rabbitmq 消费者中收听代码库更改?
- android - 我应该如何在没有 Android 应用验证的情况下设置 OAuth 同意屏幕?
- python-3.x - HTML 模板确实存在(base.html),Pycharm 解释器无法从我的应用名称 = 'app' 导入视图
- dataframe - 如何打印所有不包含字符串的列名
- linux - 在睡眠中循环并重试该过程
- python - 对关键域中的列表进行排序