【问题标题】:How to generate a small encrypted output (around 16 Bytes) from 250 characters and a 16 byte key?如何从 250 个字符和 16 个字节的密钥生成一个小的加密输出(大约 16 个字节)?
【发布时间】:2018-05-07 11:19:36
【问题描述】:

是否有任何算法或方法可以使用 10-16 字节的密钥加密 250 个字符并且加密字符串的大小仍然小于 16 个字符?我尝试使用 AES 128/256 + DEFLATE,但最终的加密字符串相对于预期的字符串长度来说相当大。

谢谢!

【问题讨论】:

  • 不,没有算法可以将随机数据缩小 20 倍。那将违反信息论定律。
  • “预期字符串长度”是什么意思?你所期待的究竟是什么?

标签: encryption hash aes deflate


【解决方案1】:

你描述的算法是keyed hash。截断的 Hmac/sha256 符合规范,即您只使用生成的哈希的前 16 个字节。 但当然,这是不可逆转的。

【讨论】:

    【解决方案2】:

    技术上你可以做到,但这取决于你对“字符”的定义。

    例如,您可能认为Noël 是四个字符。但对于 Unicode,它实际上是五个 代码点

    • N + o + e + ¨ + l (这里你使用 U+0308 结合分音符)

    组合变音符号很有趣;你可以继续使用变音符号。因此,尽管您仍然有四个 “字符”,但您还有各种额外的代码点 -

    • Noe˿̴̵̶̷̸̡̢̧̨̛̖̗̘̙̜̝̞̟̠̣̤̥̦̩̪̫̬̭̮̯̰̳̹̺̻̼͇͈͉͍͎̄̅̆̇̈̉̊̋̌̍̏̐̑̒̓̔̽̾̿̓̈͆͊͋͌̕̚͏͓͔͕͖͙͚͐͑͒͗͛ͣͤͥͦͧͨͩͪͫͬͭͮͯ͘͜͟͢͝͞͠͡l

    上面的文字是四个“字符”,但是是114个代码点

    添加变音符号可为每个字符提供更多信息。

    接下来是 Unicode 有一个大字母表。如果你把你的字母表扩展到其他平面,你可以编码很多信息。它类似于 base-64,但使用 base-195088。

    有关将大量信息塞进几个“字符”的更多信息,请参阅此 stackexchange 代码挑战:

    这是基于 Stackoverflow Twitter 编码挑战:

    这完全取决于您是 16 个字符还是 16 个字节。

    【讨论】:

    • 在我的浏览器中看起来很有趣。
    【解决方案3】:

    首先,您需要在加密之前尝试压缩。如果“AES 128/256 + DEFLATE”意味着在压缩之前加密,那么您将永远不会得到任何压缩,因为加密数据对于压缩器来说实际上是随机的。

    其次,即使您这样做了,您通常也不会期望仅对 250 个字符进行太多压缩。压缩器需要更多的数据来寻找模式。

    第三,除了高度冗余的数据之外,您不会得到 16 倍的压缩系数,即使您有很多数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-13
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 2019-11-03
      • 2017-06-16
      • 1970-01-01
      相关资源
      最近更新 更多