【问题标题】:How does the C# RSACryptoServiceProvider Encrypt() method work?C# RSACryptoServiceProvider Encrypt() 方法是如何工作的?
【发布时间】:2012-01-20 11:16:58
【问题描述】:

我很好奇,因为 RSA 不是分组密码,但 Encrypt() 方法可以对任意数量的数据进行加密。

它是否使用 AES+RSA 混合加密?还是它只是简单地(错误地)使用 RSA 作为分组密码?

【问题讨论】:

  • 它在哪里说加密方法可以获取任意数量的数据?当然不在文档中。

标签: c# encryption cryptography rsa


【解决方案1】:

然而 Encrypt() 方法可以对任意数量的数据进行加密

根据MSDN不能

rgb 参数的最大长度
模数大小 -2 -2*hLen,其中 hLen 是哈希的大小。

它甚至有一个CryptographicException,上面写着“rgb 参数的长度大于最大允许长度。”。

【讨论】:

  • 检查“(rsa.KeySize / 8) - (sha1computedHashSize * 2 + 2)”时,我得到 1024/8 - (20*2 + 2) 即 86(使用 OAEP 填充)。
【解决方案2】:

它是否使用 AES+RSA 混合加密?

它没有。如果这是您正在寻找的内容,那么您必须自己完成或查看我关于该主题的旧 blog 条目。

或者它只是简单地使用 RSA(错误地)作为分组密码?

它没有。它将对提供的byte[] 应用填充(PKCS#1 1.5 或 OAEP)并对其进行加密。因此是否有长度限制(正如其他人已经指出的那样)。

这是它的样子(来自 Mono 的 BCL 源代码)。

public byte[] Encrypt (byte[] rgb, bool fOAEP) 
{
    // choose between OAEP or PKCS#1 v.1.5 padding
    AsymmetricKeyExchangeFormatter fmt = null;
    if (fOAEP)
        fmt = new RSAOAEPKeyExchangeFormatter (rsa);
    else
        fmt = new RSAPKCS1KeyExchangeFormatter (rsa);

    return fmt.CreateKeyExchange (rgb);
}

【讨论】:

    猜你喜欢
    • 2013-03-25
    • 2013-10-25
    • 1970-01-01
    • 2013-03-11
    • 2019-05-20
    • 2012-04-21
    • 2016-07-26
    • 2018-06-26
    • 1970-01-01
    相关资源
    最近更新 更多