2016-12-01 11 views
-3

文字列をロスレスで修正するにはどうすれば固定長で文字にすることができますか?文字列を圧縮してJavaで長さを固定

私の文字列は、次のようになります。MEUCIQCE72XHhVwjnTUc2YAlV0FaCnMIAcDBDXzmyXlQh1hskgIgehf6X74JUajs77qcZrREjErYKMS08kQr9ijpSVqwqOk =

は私の問題を解決するために、既存のJavaの任意のアルゴリズムまたは方法ですか?

ありがとうございました!

編集: データがあります。例:String1、String2、String3、およびString4。 これらの4つの文字列を連結し、DSAで署名する必要があります。私は署名を表示したいが、19文字を超えてはならない!これは可能ですか?

+4

長さを制限したい場合は_lossless_とは何ですか? –

+0

縮小された文字列を展開して元の文字列を得ることができるはずです。だから減速操作はロスレスでなければならないのですか? –

+0

OhhはBase64 Stringではありません。したがって、Base64を短くしてオリジナルを元に戻す別のアルゴリズムが必要です。まあ...これはかなり複雑に思えます。 –

答えて

1

あなたの質問に対する回答者は単に「できません」です。

署名の長さは指定していませんが、320ビットの場合は40 バイトです。

出力が完全にランダムに見えるのは暗号化と署名の性質です。そのため、署名データを表すバイトは、可逆圧縮可能である可能性はほとんどありません。すべてです。

これは、バイナリデータを印刷可能(長さ効率が最大75%)にする上で、Base64が悪くないことはすでに分かっているでしょう。通常、署名は16進数(50%長さ効率)として表示されます。しかしこれは、さらに読むことができるものを表示するには、さらにはが40バイトのバイナリ署名長よりも必要であることを示しています。

あなたが求めたことを達成する方法はありません。

ただし、実際には必要ない場合があります。 代表値を表示してメッセージの完全性と信頼性を検証する方法が必要で、標準アルゴリズムに拘束されていない場合は、署名を取得して安全なハッシュ関数(SHA-256または何でも)。ハッシュ関数の出力は、署名の値の代わりに使用することができ、セキュリティを壊さずにハッシュを任意の長さに切り捨てることができるという利点が追加されました。もちろん、セキュリティは短くても劣化します。

19桁の16進数で76ビットを表すことができ、114ビットは19のBase64桁に適合します。だからもしあなたが114ビットの "署名"で生きることができれば、それは方法かもしれません。

+0

ありがとうございます。あなたは安全な私の一日です!私は114ビットで生きることができます:-) –

3

すべての文字列をロスレスに19文字に変換することはできません。

これは論理的に不可能です。可能であれば、宇宙のすべての情報を連続して19文字に圧縮できます。

可逆圧縮アルゴリズムがあります(旧式のPKZIPは英数字の文字列データでうまくいきます)が、これは必ずしも必要な圧縮を与えるわけではありません。

+2

おそらく、宇宙のすべての情報を42に圧縮することができました。 – Berger

関連する問題