密码生成URL安全密文而无需编码

时间:2012-03-26 07:52:10

标签: encryption cryptography

我想加密小的序列化数据结构(~256字节),这样我就可以安全地传递它们(特别是在URL中)。我目前的方法是使用对称分组密码,然后基于64编码,然后URL编码密文。这产生了一个编码的密文(不出所料)比原始数据结构长得多。这些编码密码的长度是一个可用性问题;理想情况下,我希望密文与输入文本的长度大致相同。

是否存在可以配置为将输出字节值限制在URL安全范围内的块密码?我认为如果有的话会涉及到安全权衡。

3 个答案:

答案 0 :(得分:2)

对于给定密钥K,密码必须为每个明文产生不同的密文。如果您的消息空间是256字节,则密码必须能够生成至少256 ^ 256个不同的消息。这将需要至少256个字节,并且输出字母表大小的任何减少都需要更长的消息。

正如您所见,您可以在之后进行一些编码以避免某些输出符号,但代价是增加长度。此外,如果编码是加密算法的一部分,您将支付相同的费用。这就是为什么这不是任何加密算法的特征。

正如其他人所提到的,唯一真正的答案是减少要加密的数据的大小,以便您需要编码更少的数据。 (或者不将数据放在url中,例如将数据存储在数据库中并在URL中放入唯一的id)。所以压缩>加密>编码

答案 1 :(得分:1)

URL编码不会显着扩展base64编码的字符串,因为64个字符中的62个不需要修改。但是,您可以使用modified base64 encoding做得更好。此编码使用' - '和'_'字符代替'+'和'/'字符,以提高效率。

密码本身不会导致任何重大数据扩展。它会将数据填充为块长度的倍数,但在您的情况下这是无关紧要的。您可以尝试在加密前压缩输入。 256字节并不多,但你可能会看到一些改进。

答案 2 :(得分:1)

如果您的数据结构长度为256个字节,则使用8个字节的块密码对其进行加密,最多可增加8个字节(取决于具体的输入长度)。

因此,在应用base64之前,最多有264个字节,这些字节由base64编码增加,最多为352个字节。

因此,您可以看到最大的开销是由base64编码创建的。有一些稍微更有效的编码可用,如base91 - 但它们非常罕见。

如果尺寸很重要,我建议在加密前压缩数据。