Karakter aneh BouncyCastle di String yang ditandatangani

Saya mencoba menandatangani string menggunakan perpustakaan BouncyCastle. Kode saya berfungsi, tetapi string yang dihasilkan penuh dengan karakter aneh dan naluri saya mengatakan ada yang salah dengan kode tersebut. Kode saya terlihat seperti ini

Security.addProvider(new BouncyCastleProvider());
FileReader fileReader = new FileReader(new File("certs/private.pem"));
PEMReader r = new PEMReader(fileReader);
PrivateKey privateKey = (PrivateKey) r.readObject();
r.close()
String toSign = "hello world";
Signature signature = Signature.getInstance("SHA1withRSA","BC");
signature.initSign(privateKey);
signature.update(toSign.getBytes("UTF-8"));
byte[] signedArray = signature.sign();
String signedString = new String(signedArray, "UTF-8");

Dan string yang dihasilkan (signedString) terlihat (sangat buruk) seperti ini:

�����jc.������c�1�#�ٶ����E8����a��f8���t�~W�{%��\Z#�� itu����;�n��k�n{U>&�d�_���&�?�N��g� z\�k�g���e~�S4��ƎG�g ��U�:��s>i�%YL�n3�����Y��9����T���}�Usb���&�����eշѾUr�Y�ڝ[ j�h~mu\3U��j���c�U�ac����t��Tidak-��1J�B]�

Private.pem dibuat dengan perintah ini

openssl req -new -x509 -days 3652 -nodes -out private.crt -keyout private.pem. 

Bantuan atau petunjuk apa pun akan sangat dihargai.

SELESAI

Apa yang saya lakukan adalah menyandikan array de byte ke Base64 menggunakan baris ini

byte[] encodedArray = org.bouncycastle.util.encoders.Base64.encode(signedArray); 

dan voala!


person cgajardo    schedule 24.09.2015    source sumber
comment
Ini baik-baik saja. Mungkin Anda ingin menyandikan array byte sebelum mencetak.   -  person Artjom B.    schedule 24.09.2015
comment
Maksud Anda, sesuatu yang berbeda dari: new String(signedArray, UTF-8) ?   -  person cgajardo    schedule 24.09.2015
comment
kemungkinan duplikat enkripsi Java : metode manakah yang dapat memberi saya pesan hasil tanpa karakter aneh?   -  person Artjom B.    schedule 24.09.2015


Jawaban (1)


Tanda tangan Anda adalah byte[], bukan string. Mencoba memperlakukan array byte sebagai string memberi Anda apa yang Anda temukan. Pertahankan dan simpan tanda tangan sebagai array byte, atau konversikan array byte ke format yang kompatibel dengan string, seperti Base64. Java 8 berisi kelas Base64 yang akan melakukan konversi untuk Anda. Jika Anda menggunakan Base64, ingatlah untuk mengonversi kembali ke byte sebelum memeriksa tanda tangan.

person rossum    schedule 24.09.2015