AES输出,它是否小于输入?

时间:2009-06-28 15:06:05

标签: c# encryption

我想加密字符串并将其嵌入到URL中,因此我想确保加密输出不大于输入。

AES是否可行?

6 个答案:

答案 0 :(得分:14)

创建任何总是会创建比输入更小的输出的算法是不可能的,但可以将任何输出反转回输入。如果你允许“不大于输入”那么基本上你只是在谈论同构算法,它们总是与输入相同的大小。这是由于pigeonhole principle

除此之外,加密通常还有一点填充(例如“最接近的8个字节,向上舍入” - 在AES中,即 16 字节)。哦,最重要的是你有文本和二进制之间的转换问题。加密算法通常以二进制方式工作,但URL以文本形式存在。即使您采用ASCII,也可能最终得到的加密二进制值不是ASCII。在文本中表示任意二进制数据的最简单方法是使用base64。还有其他替代方案非常繁琐,但一般的“将文本转换为二进制,加密,将二进制转换为文本”模式是最简单的。

答案 1 :(得分:2)

简单的答案是否定的。 任何对称加密算法(包括AES)将产生至少相同但通常稍大的输出。正如Jon Skeet指出的那样,通常是因为填充或对齐 当然你可以使用zlib压缩你的字符串并加密,但你需要在解密后解压缩 免责声明 - 使用zlib压缩字符串不会保证它会变得更小

答案 2 :(得分:1)

重要的不是你使用的密码,而是你使用的encryption mode。例如,CTR模式没有长度扩展,但每个加密都需要一个新的计数器起始点。其他模式如OFB,CFB(或具有密文窃取的CBC)也不需要填充到密码的块长度的倍数,但是它们需要IV。从你的问题中不清楚是否存在一些可用伪随机导出IV的信息,如果这些模式中的任何一种适当的话。还不清楚您是否需要身份验证,或者您是否需要语义安全性>即如果你加密相同的字符串两次并且你得到两次相同的密文,这是一个问题吗?

答案 3 :(得分:0)

如果我们在讨论symetric encription以从加密字符串中获取原始加密字符串,那么这是不可能的。我认为除非你使用哈希值(SHA1,SHA256 ......),否则你永远不会获得比原始文本小的加密字符串。哈希的问题在于它们不是检索原始字符串的解决方案,因为它们是单向加密算法。

答案 4 :(得分:0)

使用AES时,输出数据将向上舍入为具有特定长度(例如,长度可分为16的长度)。

如果您想将秘密数据传输到其他网站,HTTP帖子可能比将数据嵌入到URL中更好。

答案 5 :(得分:0)

另外还有一点需要澄清:

对称加密算法不仅产生至少与输入一样大的输出,对非对称加密也是如此。

“非对称加密”和“加密哈希”是两回事。

非对称加密(例如RSA)意味着给定输出(即密文),如果你有正确的密钥,你可以获取输入(即明文),这只是解密需要与用于加密的密钥不同的 密钥。对于非对称加密,适用相同的“鸽子原则”论点。

加密哈希(例如SHA-1)意味着给定输出(即哈希)你不能获得输入,你甚至找不到哈希的不同输入相同的值(假设散列是安全的)。对于加密哈希,哈希可以比输入短。 (事实上​​,无论输入的长度如何,哈希都是相同的大小。


还有一件事:在任何安全加密系统中,密文将比明文更长。这是因为任何给定的明文可以加密到多个可能的密文(例如使用不同的IV)。如果不是这种情况,则密码会泄漏信息,因为如果两个相同的明文被加密,它们将加密到相同的密文,并且然后对手会知道明文是一样的。

相关问题