我正在使用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()?
如果你看看Optimal Asymmetric Encryption Padding(OAEP.pdf)设计,你会发现它需要两个具有不同属性的散列函数G
和H
。
G和H通常是由协议修复的一些加密散列函数。
这两个是两个不同属性所必需的;
RSA加密基于RSA trapdoor置换:一种易于在一个方向上执行的转换,但在另一个方向上是不可行的,除非您知道“魔术”值(私钥)。将陷门功能转换为加密方案并不容易。首先,加密是非确定性的至关重要:否则,如果有人猜出消息可能是什么,他们就可以通过执行加密(使用公钥)来检查他们的猜测并与密文进行比较想打破。为避免这种情况,加密方案总是包含一些称为随机数的随机部分。
RSA陷门操作采用具有固定大小的输入,由键确定。基本上,使用n位密钥,您需要一个(n-1)位输入字符串。因此,要加密某些内容,您需要从原始邮件构建所需长度的字符串。组装有效负载以加密和nonce并以某种方式格式化它们的操作称为填充。 RSA加密有两种标准填充机制:PKCS#1v1.5和OAEP。
包含随机的随机数是必要的,但不足以使RSA加密安全。 RSA根源的数学运算具有一些“好”的数学性质。在许多现实世界的情况下,想要解密密文的攻击者可以submit modified ciphertexts for decryption,即使这些密文被拒绝为无效,他们被拒绝的确切方式(错误消息,时间......)也足以重建明文。这是PKCS#1v1.5填充的问题,它容易受到诸如Bleichenbacher's attack和Manger's attack之类的oracle攻击,其中攻击者生成修改后的密文并获得有关其有效性的信息,最终允许重建明文。
OAEP旨在使攻击者无法生成有用的密文。简而言之,它通过使用伪随机字符串屏蔽(使用xor)有效负载来工作。生成这个伪随机字符串的标准方法是使用一个名为MGF1的结构,它从种子开始并重复哈希。这种掩蔽打破了RSA取幂操作引起的数学关系:修改密文会导致在揭露后完全不相关的明文。这样,如果攻击者尝试提交修改后的密文,他们就会得到解密错误,这些错误不能提供重建明文的任何有用信息。
OAEP涉及第二个散列函数,以在加密中包含标签。标签包含在掩码计算中,尝试使用错误的标签进行解密会导致解密错误(以不显示正确标签的方式)。掩码计算使用标签的哈希值。实际上,很少使用此功能,标签默认为空字符串。此外,在实践中,每个人对标签和掩码生成使用相同的散列算法,但是一些库允许指定不同的散列。