Странные символы BouncyCastle в подписанной строке

Я пытаюсь подписать строку, используя библиотеку BouncyCastle. Мой код работает, но результирующая строка полна странных символов, и мое чутье подсказывает, что с ней что-то не так. Мой код выглядит так

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");

И результирующая строка (signedString) выглядит (ужасно) так:

������jc.������c�1�#�ٶ����E8����a��f8���t�~W�{%��\Z#�� it��ҽ;�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��No-��1J�B]�

Приватный.pem был создан с помощью этой команды

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

Любая помощь или подсказка будут очень признательны.

РЕШЕНО

Что я сделал, так это закодировал массив байтов в Base64, используя эту строку

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

и вуала!


person cgajardo    schedule 24.09.2015    source источник
comment
Это прекрасно. Возможно, вы хотите закодировать массив байтов перед печатью.   -  person Artjom B.    schedule 24.09.2015
comment
Вы имеете в виду что-то отличное от: new String(signedArray, UTF-8)?   -  person cgajardo    schedule 24.09.2015


Ответы (1)


Ваша подпись представляет собой byte[], а не строку. Попытка рассматривать массив байтов как строку дает вам то, что вы нашли. Либо сохраните и сохраните подпись в виде массива байтов, либо преобразуйте массив байтов в формат, совместимый со строками, например Base64. Java 8 содержит класс Base64, который сделает преобразование за вас. Если вы используете Base64, не забудьте преобразовать обратно в байты перед проверкой подписи.

person rossum    schedule 24.09.2015