BouncyCastle签名字符串中的奇怪字符

时间:2015-09-24 15:49:47

标签: java openssl cryptography 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.c1#وٴE8af8t〜W {%\ž #itҽ; NKN {U>&安培; D_&安培;伍   ž\ KGE〜S4ƎGgU:S取代; I%YLn3Y9T }的Usb急症շѾUrYڝ[JH〜亩\ 3UjcUactNo-1J B]

private.pem是使用此命令生成的

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

非常感谢任何帮助或提示。

解决

我所做的是使用此行将de byte array编码为Base64

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

和voalá!

1 个答案:

答案 0 :(得分:2)

您的签名是byte[],它不是字符串。尝试将字节数组视为字符串可以为您提供所找到的内容。保留签名并将其存储为字节数组,或者将字节数组转换为字符串兼容格式,例如Base64。 Java 8包含Base64类,它将为您进行转换。如果你确实使用Base64,那么记得在检查签名之前转换回字节。