如何对明文执行 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
(散列)
- 您缺少
PS
、seed
、dbMask
、maskedDB
、seedMask
、maskedSeed
和 EM
如果您正在编写自己的 OAEP padder,您将实施 7.1.1 第 2 部分。在您的实施中使用与规范相同的名称通常会导致更好的错误检测。
我正在通过重构来研究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
(散列) - 您缺少
PS
、seed
、dbMask
、maskedDB
、seedMask
、maskedSeed
和EM
如果您正在编写自己的 OAEP padder,您将实施 7.1.1 第 2 部分。在您的实施中使用与规范相同的名称通常会导致更好的错误检测。