是否在 System.Security.Cryptography.RSA.Encrypt 方法中使用 RSAEncryptionPadding.OaepSHA256 假设了 MGF1 填充?

Is MGF1 padding assumed in System.Security.Cryptography.RSA.Encrypt method with RSAEncryptionPadding.OaepSHA256?

我需要使用 OaepSHA256 和 MGF1 填充使用 RSA public 密钥加密普通字节。所以我认为我可以编写以下代码(使用 .net Framework 4.7):

var encryptionCert = new X509Certificate2(certBytes);
using (var rsaPublicKey = encryptionCert.GetRSAPublicKey()) // Get an instance of RSA derived class
    {
        var encryptedKeyBytes = rsaPublicKey.Encrypt(plainBytes, RSAEncryptionPadding.OaepSHA256);  
}

我不知道 MGF1 填充和最佳非对称加密填充 (OAEP) 是否相关。

这是我的问题:

  1. 在 .net 框架中,上述代码是否自动考虑 MGF1 填充(除了提供的 OAEP)?
  2. 如果没有,那么我有什么选择来实现我的目标(除了去充气城堡图书馆)?

OAEP是padding scheme,需要2个不同性质的hash函数来运算。一个散列函数应该将任意大小的输入映射到固定大小的输出。这种散列函数众所周知,SHA-256MD5等都是这种类型。规范允许不同的函数用于 OAEP 填充,例如 SHA-256、SHA-1 等。

另一个哈希函数应该将任意大小的输入映射到任意大小的输出。这样的散列函数称为“掩码生成函数”(MGF)。相关的RFC只定义了一个这样的函数,MGF1:

One mask generation function is given here: MGF1, which is based on a hash function.
...

Future versions of this document may define other mask generation functions.

因为只有一个定义的掩码生成函数,.NET api 不允许您选择它(没有选择),当您将 RSA 与 OAEP 一起使用时,总是使用它 (MGF1)填充。但是,可以使用散列参数化 MGF1。例如看到 MGF1ParameterSpec class in Java SE. It seems the .NET API 总是使用特定的哈希函数,不清楚它是 SHA-1 还是 SHA-256。