我需要在我正在处理的项目中使用一些加密机制。我正在探索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 () converts the bytes to hex string }
现在我获得的加密字符串是128个字节(256个十六进制字符)。这个字符串对我来说太大了。如果我提供16字节的普通数据,我有点希望得到16字节的加密数据。难道我做错了什么?这是应该发生的吗?我可以以某种方式缩短加密数据吗?
答案 0 :(得分:12)
你错了。 RSA不是分组密码,因此您无法真正谈论它的块大小。
RSA加密的输出与RSA模数的长度相同。您没有在代码中指出任何RSA密钥,因此运行时(据我记忆)使用默认密钥。该密钥显然具有1024位模数,这解释了输出长度。
您可能希望查看AES加密。出于多种原因,您通常只应使用RSA加密密钥,然后使用AES或类似的对称密码算法来加密您的实际文本。
AES是块大小为16字节的块密码,因此(取决于您使用的填充以及传输初始化向量的方式)将16字节的普通数据加密为16字节的加密数据。