【问题标题】:How to ensure the encrypted length are same as the given string如何确保加密长度与给定字符串相同
【发布时间】:2015-08-11 18:43:03
【问题描述】:

嗨,是否可以用我想要的特定长度加密字符串?例如:我想将此字符串 BI000001 加密为十六进制值 A3D5F2ARD3(random) 将其固定为 10 长度。所以当用户输入这个值A3D5F2ARD3时,系统会根据这个值解密得到BI000001的值。

在java中可以做到这一点吗?

我尝试了很多方法,但所有加密长度都太长了。

【问题讨论】:

  • 为什么加密数据与未加密数据的长度相同很重要?
  • 十六进制值比您的纯文本短(假设二进制编码)。所以不,那是不可能的。
  • 在 10 个字符/字节的限制下,需要什么样的密文编码?你的明文有多长,你允许哪些字符集?
  • 任何集合中的信息密度都有限制。压缩算法旨在在合理范围内最大化该密度。加密算法不是。通常,一组加密的数据将包含与带有填充的纯文本一样多的字节。如果您希望密文小于纯文本,请在加密前压缩纯文本。压缩到一个小的固定长度是不可能的。你可以散列到一个固定的小长度,但散列是不可逆的。
  • 看来您需要保留格式的加密。有些算法是专利的,所以要小心你的实现。如果您没有那么安全意识,您可以使用像 Vigènere 这样的经典密码,并使用足够大的字母表。

标签: java encryption


【解决方案1】:

我不知道任何提供此功能的 JDK 内置 Java 加密方法。再说一次,我不是加密专家,但我想这样的自定义功能不会内置在 JDK 中。 也许这个讨论也有用:https://crypto.stackexchange.com/questions/6098/is-there-a-length-preserving-encryption-scheme

为什么要保留字符串的大小?也许你的问题有另一种解决方案。

【讨论】:

  • Java 缺少此功能,因为对于几乎任何远大于 10 的集合,几乎不可能实现长度为 10 的无损压缩。确实存在特殊情况。一个很长的“1”字符串可以压缩成一个“1”和一个表示重复的数字。但是对于更复杂的集合,在不丢失信息的情况下压缩(加密或不加密)到长度 10 可能是不可能的。
  • 好吧 OP 不是要求压缩,而是加密。当然,如果目标是将任意字符串映射到相同大小的十六进制字符串,这是不可能的
  • 嗯,如果不能使用加密算法的话。我可以知道执行格式保留加密的任何其他方法吗?我的字符串有一个固定长度为 10.. 我只需要将它们“编码”为字母数字并且可以“解码”
【解决方案2】:

通常您会使用block cipher(例如 AES)来加密数据。分组密码(顾名思义)在固定大小的数据块中工作,例如 AES 在 128 位块中工作。如果分组密码遇到小于块大小的输入pads it,这可能是您看到密文大于明文的原因。

如果您想保留长度,请考虑this question 中提到的格式保留加密。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多