压缩字符串以使用java

时间:2016-12-01 10:24:27

标签: java compression

如何将字符串无损缩小为 19 字符的修复长度?

我的字符串如下所示: MEUCIQCE72XHhVwjnTUc2YAlV0FaCnMIAcDBDXzmyXlQh1hskgIgehf6X74JUajs77qcZrREjErYKMS08kQr9ijpSVqwqOk =

是否存在java中的任何算法或方法来解决我的问题?

提前感谢您的帮助!

修改 我有一些数据。例如:String1,String2,String3和String4。 现在我必须连接这四个字符串并用DSA签名。我想显示签名但不得超过19个字符!这可能吗?

2 个答案:

答案 0 :(得分:3)

您无法将每个字符串无损转换为19个字符。

这在逻辑上是不可能的:如果可以,那么宇宙中的所有信息都可以在连续的步骤中压缩到19个字符。

有可用的无损压缩算法(老式的PKZIP适用于字母数字字符串数据),但这并不一定能为您提供所需的压缩。

答案 1 :(得分:1)

你问题的灵感只是"你不能"。

您尚未指定签名的长度,但如果它是320位,则

加密和签名的本质是输出看起来完全随机。这就是为什么表示签名数据的字节不太可能无损压缩 at

也就是说,您可能已经发现Base64在打印二进制数据方面并不差(长度效率高达75%)。通常,签名显示为十六进制(50%长度有效)。然而,这表明您甚至需要更多而不是40字节的二进制签名长度才能显示清晰易读的内容。

所以,没有办法完成你的要求。

但是,您可能实际上并不需要它。如果您只需要一种方法来显示任何代表值以验证消息的完整性和真实性,并且不受任何标准算法的约束,您只需获取签名并将其提供给安全哈希功能(SHA-256或其他)。然后可以使用散列函数的输出而不是签名的值,其附加好处是您可以简单地将散列截断为任何所需长度而不破坏其安全性;当然,安全性会因较短的长度而降低。

在19个十六进制数字中,您可以表示76位,114位适合19个Base64数字。所以,如果你可以使用"签名"只有114位可能是一种方式。