如何控制加密String的长度?

时间:2012-12-06 05:07:45

标签: java encryption

无论输入如何,是否可以保证输出具有一定的长度?

例如,我想传入一个字符串并保证其'加密等效字符将包含45个字符。无论输入是爱丽丝梦游仙境的1个字符,这些45个字符都必须在那里。

注意:45显然是一个例子,关键是应该以某种方式控制输出字符的数量(确切的数字,或者可以被5整除,或者甚至可以)

2 个答案:

答案 0 :(得分:3)

否 - 无法指定固定的结果长度。如果数据足够长,那么它就不能加密到固定的短任意长度(这将是惊人的压缩)。有可能设计出这种性质的hash。但哈希是不同的(它是一种方式;你不能从哈希中提取原始数据)。

但是,可以通过使用填充来控制长度。

答案 1 :(得分:2)

如果您将限制设置为“足够高”,是的,您可以使用填充和流密码轻松地执行您想要的操作。

例如,看一下块密码的CTR(计数器)操作模式:http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29

在CTR模式下使用AES-128,如果您使用随机IV并将其插入密文的开头,您就会知道密文的大小正好是16字节+纯文本的大小。因此,如果您将密文长度修改为100字节,则可以加密最多84字节的纯文本。你必须填写较短的纯文本。例如,如果要加密ASCII文本,可以使用字节0x00作为字符串结尾的标记(就像C中的“以空字符结尾的字符串”),然后用随机垃圾填充直到你得到84字节。

您可以使用许多其他常见的填充方案:http://en.wikipedia.org/wiki/Padding_(cryptography)

我只考虑了另一种可能性:您可以使用某种经过身份验证的加密,例如Galois / Counter Mode(GCM)。您将随机IV与密文连接起来,并使用随机字节将其填充到所需大小。然后,为了解密,你只需要尝试密文的每个子字符串:如果你得到了正确的子字符串,解密算法将输出纯文本;否则,它将输出“错误”。请注意,使用此方法,您可能会对您的方案引入一些计时攻击,如果普通文本的大小变化很大,您可能还会进行大量的计算来解密密文。

在任何情况下,请确保您的方案由密码学专家审核(例如,在您设计方案后,在https://crypto.stackexchange.com/询问),因为很容易忽略一些攻击可能性