试图了解 RSACryptoServiceProvider 密钥和消息长度关系

Trying to understand RSACryptoServiceProvider key and message length relationship

我试图更好地理解 .Net 中的密码学 类,但我遇到了一个我不太清楚的情况。我正在关注这个 RSACryptoServiceProvider example.

的精简版

我的简化版是这样的:

string plainText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse dapibus.";
var byteConverter = new UnicodeEncoding();

//Works with longer string length
using var rsa = RSA.Create();
byte[] encrypted2 = rsa.Encrypt(byteConverter.GetBytes(plainText), RSAEncryptionPadding.OaepSHA1);

//fails if string's length is too long
using var rsa2 = new RSACryptoServiceProvider();
byte[] encrypted = rsa2.Encrypt(byteConverter.GetBytes(plainText), false);

如果你像这样在 "elit" 处切断字符串:

string plainText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";

然后两者都起作用。

当我使用提供者的重载构造函数并为其提供充足的密钥大小时,如下所示:

using var rsa2 = new RSACryptoServiceProvider(2048); 

然后它可以加密整个字符串的长度。

密钥大小和消息长度之间有什么关系?确定我需要什么大小的密钥的最佳方法是什么以及为什么要使用 RSA。创建方法对字符串的长度没有问题?

RSACryptoServiceProvider 简单地实现 PKCS#1 v2.0 及更高版本中指定的方案(PKCS#1 2.2 是当前版本)。我已经指定了开销和剩余的有效负载 here。它与语言/运行时无关。

虽然 PKCS#1 v1.5 填充的开销较小,但 OAEP 更安全(它具有针对 RSA 的安全证明)并且通常应该使用。 PKCS#1 v1.5 对于总共 61 位的随机组件只有 11 个开销字节。然而,好的做法确实需要双倍的随机分量——开销为 11 + 8 = 19 字节。