3

我正在使用它进行加密:http: //msdn.microsoft.com/en-us/library/system.security.cryptography.rijndaelmanaged.aspx

有没有办法可以预测加密文本的样​​子?我正在将加密的输出转换为文本,以便可以将其存储在数据库中。

我只想确保数据库列的大小足够大。

我将文本输入限制为 20 个字符。

4

4 回答 4

10

您使用的是 SQL Server 2005 或更高版本吗?如果是这样,您可以只使用VARCHAR(MAX)NVARCHAR(MAX)作为列类型。

如果你想更精确一点...

最大块大小为RijndaelManaged256 位(32 字节)。

您的最大输入大小为 20 个字符,因此即使我们假设每个字符 4 个字节的最坏情况,也只会达到 80 个字节,然后将在加密过程中最多填充 96 个字节。

如果在加密输出上使用 Base64 编码,将从 96 个加密字节创建 128 个字符。如果您使用十六进制编码,那么将从 96 个加密字节中创建 192 个字符(如果您在十六进制字符串前面加上“0x”前缀,可能还会加上几个额外的字符)。在任何一种情况下,200 个字符的列宽都应该为您提供足够的空间。

(注意:这些只是我头脑中的计算。我还没有证实它们实际上是正确的!)

于 2009-09-29T13:22:07.877 回答
3

对于在网上找不到任何信息的未知加密算法,我会编写一个小测试程序,对一组最大长度的随机字符串进行加密,在输出中找到最长的长度,然后根据出现的可能性乘以一个安全系数输入的长度是变化的,以及测试程序的结果有多准确。

不过,一般来说,您可能会处于 1.5x - 2x 输入长度范围内。

于 2009-09-29T13:26:39.067 回答
2

对于这个特定的算法,密文的长度将是,

   ((length+16)/16)*16 

这是为了满足块大小和填充要求。

我建议您还向密文添加一个随机 IV,以便再占用 16 个字节。

但是,如果要将其作为 char 放入数据库中,则必须对其进行编码。这将增加更多。

对于 base64,将其乘以 4/3。对于十六进制,加倍。

于 2009-09-29T13:35:34.557 回答
0

加密永远不会增加超出所需最小填充的数据大小。

如果它确实“扩展”了数据,那么它可能不是一个很好的加密算法。

于 2009-09-29T13:32:05.507 回答