RSA加密(RSACryptoServiceProvider)的加密数据大小

3

我需要在我正在工作的一个项目中使用一些加密机制。我正在探索RSA加密并编写了一些示例程序来学习。

我知道RSA加密的块大小为16个字节。所以我将字符串“12345678”作为输入提供给下面的函数:

public static string Encrypt (string input) {
    var byteConverter = new UnicodeEncoding ();
RSACryptoServiceProvider cruptoEngine = new RSACryptoServiceProvider(); byte[] output = cruptoEngine.Encrypt (byteConverter.GetBytes (input), false); return BytesToString (output); //BytesToString()将字节转换为十六进制字符串 }

现在,我得到的加密字符串是128个字节(256个十六进制字符)。这个字符串对我来说太大了。我有点希望如果我提供16个字节的明文数据,我会得到16个字节的加密数据。我做错了什么吗?这是否是应该发生的?我能否缩短加密数据的长度?

1个回答

13

您的观点是错误的。RSA不是块密码,因此您无法真正谈论它的块大小。

RSA加密的输出将与RSA模数具有相同的长度。您在代码中没有指定任何RSA密钥,因此运行时将(据我所记)使用默认密钥。该密钥显然具有1024位模数,这解释了输出长度。

您可能需要考虑使用AES加密。出于许多原因,通常应仅使用RSA加密密钥,然后使用AES或类似的对称密码算法来加密实际文本。

AES是块密码,块大小为16字节,因此(取决于您使用的填充方式以及您如何传输初始化向量)会将16个字节的明文数据加密为16个字节的加密数据。


似乎这并不完全正确。我在RSA中使用了4096大小。然而,加密调用的结果是550字节(而模数大约为512字节)... 这导致解密时出现异常... 我不知道该怎么办。 - Alexander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接