2

我正在尝试将Java中的长字符串(长度为200-500个字符)加密为加密/混淆(任何一个都对我有用)字符串,我稍后可以将其解密回原始的200-500个字符串。问题是我需要加密字符串不超过 32 个字符(我希望加密字符串很好地适合控制台行)。任何人都可以帮我解决这个问题..?如果有的话?我搜索了一段时间,只能找到像 base64 或 AES 这样的输出字符串太长的东西。

4

2 回答 2

4

没有办法对 32 个字符中的每个可能的 200 个字符串进行无损压缩。这简直是​​不可能的。

理解这一点的示例:假设我们只有 ASCII:

200 个字符,这意味着 127^200 个可能的 200 个字符单词

只有 127^32 个可能的长度为 32 的单词。因此,不存在将每个 200 个字符的单词翻译成另一个 32 个字符的单词的方法,如果您希望能够将它包转换为 200 个字符的单词,这将是必要的(没有错误)

数学说,你要求的东西是不可能的。

于 2012-12-28T00:07:03.907 回答
4

有 256^200 个可能的长度为 200 的字符串(假设您使用 8 位扩展 ASCII 字符 0-255)。有 256^32 个可能的大小为 32 的字符串。

这意味着任何将任何 200 个字符的字符串转换为 32 个字符的函数的任何函数,最终都将不可避免地将多个输入字符串转换为相同的输出字符串——因为可能的输出字符串太少了(参见鸽洞原理)。

您可以很容易地想出一个将输入字符串映射到 32 个字符的输出的散列函数,但是由于多个字符串可能映射到相同的输出,因此不可能反转该过程以在给定输出的情况下获取输入字符串。

于 2012-12-28T00:14:24.033 回答