1

現在、java.security.signatureを使用して署名を作成すると、文字列が返されます。文字列をnotepad++にコピーしたときにのみ表示される特殊文字があるため、この文字列を使用できないようです。これらの特殊文字を削除すると、プログラムで文字列の残りを使用できます。

メモ帳では、ACK GS STX SI SUB ETBBSVTという単語が付いたブラックボックスのように見えます。

私は彼らが何であるかを本当に理解していないので、彼らに乗る方法を言うのは難しいです。

これらの文字や類似している可能性のある文字を削除するために実行できる関数はありますか?

投稿で提供されているbase64クラスを使用すると、署名に戻ることができません

System.out.println(signature);
String base64 = Base64.encodeBytes(sig);
System.out.println(base64);
String sig2 = new String (Base64.decode(base64));
System.out.println(sig2);

出力を与えます

”zÌý¥y]žd”xKmËY³ÕN´Ìå}ÏBÊNÈ›`Αrp~jÖüñ0…Rõ…•éh?ÞÀ_û_¥ÂçªsÂk{6H7œÉ/”âtTK±Ï…Ã/Ùê²
lHrM/aV5XZ5klHhLbctZs9VOtMzlfc9Cyk7Im2DOkXJwfmoG1vzxMIVS9YWV6Wg/HQLewF/7X6XC56pzwmt7DzZIN5zJL5TidFRLsc+Fwy/Z6rIaNA2uVlCh3XYkWcu882tKt2RySSkn1heWhG0IeNNfopAvbmHDlgszaWaXYzY=
[B@15356d5
4

3 に答える 3

5

どのように署名を「作成」していますか?このメソッドを使用するとsign、文字列ではなくバイト配列が返されます。これは、一部のテキストのバイナリ表現ではなく、任意のバイナリデータです。これを使用する必要があります。文字列に変換する必要がある場合は、データの破損を防ぐためにbase64変換を使用する必要があります。

于 2009-07-17T20:03:27.160 に答える
5

暗号化署名は文字列ではなくバイトを生成するため、奇妙な文字があります。したがって、印刷可能な表現が必要な場合は、Base64でエンコードする必要があります(Javaのパブリックドメインの実装は次のとおりです)。

暗号化署名から非印刷文字を削除すると、検証に使用できなくなるため、使用できなくなります。

アップデート:

[B @ 15356d5

これは、バイト配列で呼び出されたtoStringの結果です。「[」は配列を意味し、「B」はバイトを意味し、「15356d5」は配列のアドレスです。デコードから取得した配列を[Signature.verify](http://java.sun.com/j2se/1.4.2/docs/api/java/security/Signature.html#verify(byte [ ]))

何かのようなもの:

Signature sig = new Signature("dsa");
sig.initVerify(key);
sig.verify(Base64.decode(base64)); // <-- bytes go here
于 2009-07-17T20:04:34.367 に答える
0

私があなたの問題を正しく理解しているなら、おそらくchar 9(タブ)、char 10(改行)、char 13(リターン)を除いて、32未満のコードの文字を取り除く必要があります。

編集:このような暗号出力を処理することはあなたが通常望んでいることではないので、私は他の人に同意します。

于 2009-07-17T20:04:52.617 に答える