如何对明文执行 OAEP 填充

How to perform OAEP padding on plaintext

我正在通过重构来研究RSA密码系统。我知道填充对于密码安全是必不可少的,因此我选择了 PKCS1 OAEP 填充,因为它是填充消息最安全的方法之一。我无法从我的研究中找到执行 OAEP 填充的确切且简单易懂的来源。

>>> message = "Hello World"
>>> message_length = len(message)  # value: 11
>>> hash = sha1("").hexdigest() #  value: "da39a3ee5e6b4b0d3255bfef95601890afd80709"
>>> hash_length = len(hash)  # value: 40
>>> mod_size = (66707621741034658424514206418677753964865266688022969048429208771289785288847727334295743540860932900769628607474618294659295004562698532947535801821428015940719336654123007538255459184765551631213180128939808032261346408111382837800099426844454970753309552867519518744723276317986718923680385211621637413963).bit_length()  # size of public modulus (value: 1023)
>>> mod_size_bytes = -(-mod_size//8)  # size of public modulus in bytes, using ceil division

通过研究我发现上面的数据是执行 PKCS1 OAEP 填充所必需的,但我不知道如何正确使用它。

代码中是否定义了所有必要的变量?如果可以,如何利用这些变量来执行 OAEP 填充?

谢谢!

OAEP 填充算法在 https://www.rfc-editor.org/rfc/rfc3447#section-7.1.1 中进行了描述。

选项:

  • 您选择的哈希似乎是 SHA-1。
  • MGF-1 确实是 MGF 的唯一选择,所以我们也可以假设它是一个。

输入:

  • 您有 RSA 密钥 n 值,但没有 e(尽管如果您将填充与加密分开,则不需要 e)。
  • 你有M(“Hello World”的一些字节编码)
  • 你有 L =(空字符串)。

变量:

  • 您有 k (mod_size_bytes)
  • 您有 mLen (message_length)
  • 您有 lHash(散列)
  • 您缺少 PSseeddbMaskmaskedDBseedMaskmaskedSeedEM

如果您正在编写自己的 OAEP padder,您将实施 7.1.1 第 2 部分。在您的实施中使用与规范相同的名称通常会导致更好的错误检测。