无论输入如何,是否可以保证输出具有一定的长度?
例如,我想传入一个字符串并保证它的加密等价物将包含 45 个字符。无论输入是否是爱丽丝梦游仙境的 1 个字符,这 45 个字符都必须存在。
注意:45显然是一个例子,关键是输出字符的数量应该以某种方式控制(确切的数字,或者被5整除,甚至)
无论输入如何,是否可以保证输出具有一定的长度?
例如,我想传入一个字符串并保证它的加密等价物将包含 45 个字符。无论输入是否是爱丽丝梦游仙境的 1 个字符,这 45 个字符都必须存在。
注意:45显然是一个例子,关键是输出字符的数量应该以某种方式控制(确切的数字,或者被5整除,甚至)
否 - 无法指定固定的结果长度。如果数据足够长,则无法将其加密为固定的短任意长度(这将是惊人的压缩)。有可能设计出hash
这种性质的。但是哈希是不同的(这是一种方式;您不能从哈希中提取原始数据)。
不过,可以通过使用填充来控制长度。
如果您将限制设置为“足够高”,是的,您可以使用填充和流密码轻松地做您想做的事情。
例如,看看分组密码的 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/上询问它),因为很容易忽略一些攻击可能性。