哈希算法在非对称密码填充中的使用

时间:2019-03-14 09:26:29

标签: python cryptography encryption-asymmetric

我正在使用Python密码库,并执行非对称加密。

我指的是this example

>>> message = b"encrypted data"
>>> ciphertext = public_key.encrypt(
...     message,
...     padding.OAEP(
...         mgf=padding.MGF1(algorithm=hashes.SHA256()),
...         algorithm=hashes.SHA256(),
...         label=None
...     )
... )

我了解填充的作用。但是,我与为什么使用SHA256()无关?

2 个答案:

答案 0 :(得分:1)

如果查看Optimal Asymmetric Encryption PaddingOAEP.pdf)设计,您会发现它需要两个具有不同属性的哈希函数GH

  G和H通常是协议固定的一些加密哈希函数。

这两个是两个不同属性所必需的;

  1. H哈希函数将输入缩减为固定大小的输出。
  2. G是Mask generation function (MGF),它使用哈希函数将输入扩展为所需大小的输出。是在rfc8017
  3. 中定义的

答案 1 :(得分:1)

RSA加密基于RSA trapdoor排列:一种转换很容易在一个方向上执行,但在另一个方向上却不可行,除非您知道“魔术”值(私钥)。将活板门功能转换为加密方案并不容易。首先,至关重要的是,加密是不确定的:否则,如果某人可以猜测消息是什么,他们将能够通过执行加密(使用公共密钥)来检查自己的猜测。 ),并与他们想要破解的密文进行比较。为了避免这种情况,加密方案始终包含一些随机部分,称为 nonce

RSA陷阱门操作接受具有固定大小的输入,该大小由密钥确定。基本上,使用 n 位键,您需要一个( n -1)位输入字符串。因此,要加密某些内容,您需要从原始消息中构建所需长度的字符串。组装有效负载以加密和随机数并以某种方式对其进行格式化的操作称为 padding 。 RSA加密有两种标准的填充机制:PKCS#1v1.5和OAEP。

包括随机随机数是必要的,但不足以确保RSA加密的安全性。 RSA根源上的数学运算具有一些“不错”的数学特性。在许多实际情况下,想要解密密文的攻击者可以submit modified ciphertexts for decryption,并且即使这些密文被拒绝为无效,确切地如何拒绝它们(错误消息,计时等)也足以重建明文。这是PKCS#1v1.5填充的问题,它容易受到诸如Bleichenbacher's attackManger's attack之类的oracle攻击,在这些攻击中,攻击者会生成修改后的密文并获取有关其有效性的信息,从而最终可以重建明文。

OAEP旨在使攻击者无法生成有用的密文。简而言之,它通过使用伪随机字符串屏蔽(用异或)有效负载来工作。生成此伪随机字符串的标准方法是使用称为MGF1的构造,该构造从种子开始并重复对其进行哈希处理。这种屏蔽打破了由RSA幂运算引起的数学关系:修改密文会导致纯文本在取消屏蔽后完全不相关。这样,如果攻击者尝试提交修改的密文,它们只会得到解密错误,而解密错误不会提供任何有用的信息来重建明文。

OAEP涉及第二个哈希函数,在加密中包括 label 。标签包含在掩码计算中的方式是,尝试使用错误的标签进行解密会导致解密错误(以不会显示正确标签的方式)。掩码计算使用标签的哈希值。实际上,此功能很少使用,标签默认为空字符串。此外,在实践中,每个人都使用相同的哈希算法来生成标签和掩码,但是有些库允许指定不同的哈希。