Discuss / Java / 这个地方将byte[]保存到文件中时 ,我这边测试下来 需要 使用 Base64 编码成 string

这个地方将byte[]保存到文件中时 ,我这边测试下来 需要 使用 Base64 编码成 string

Topic source

小诺91331

#1 Created at ... [Delete] [Delete and Lock User]

RSA的公钥和私钥都可以通过getEncoded()方法获得以byte[]表示的二进制数据,并根据需要保存到文件中。要从byte[]数组恢复公钥或私钥,可以这么写:

你好,请教个问题,这个地方将byte[]保存到文件中时 ,我这边测试下来 需要 使用 Base64 编码成 string

String pkStr = Base64.getEncoder().encodeToString(pk.getEncoded());


byte[] rPublicData =Base64.getDecoder().decode(pkStr) ;
X509EncodedKeySpec pkSpec = new X509EncodedKeySpec(rPublicData);
PublicKey rePubKey = kf.generatePublic(pkSpec);

为啥不能直接使用 new String 这种方式 转成String 

String pkStr2 = new String(pk.getEncoded(),StandardCharsets.UTF_8);

byte[] rPublicData2 = pkStr2.getBytes(StandardCharsets.UTF_8) ; 
X509EncodedKeySpec pkSpec2 = new X509EncodedKeySpec(rPublicData2 );
PublicKey rePubKey2 = kf.generatePublic(pkSpec2);
//报错 .InvalidKeyException: IOException: DerInputStream.getLength(): lengthTag=111, too big.


小诺91331

#2 Created at ... [Delete] [Delete and Lock User]

看起来 通过第一种方式 获取到的  rPublicData 长度为 162

第二种方式 rPublicData2 长度289

X509EncodedKeySpec pkSpec2 = new X509EncodedKeySpec(rPublicData2 );
这个构造函数对 参数大小有限制,而通base64 编码后,再解码 得到的byte 数据大小 变小了,
老师可以再帮解释下,谢谢!

小诺91331

#3 Created at ... [Delete] [Delete and Lock User]

再次复习了下 Base64 编码那节,

 Base64编码的目的是把二进制数据变成文本格式

使用new String(..)对于不可见字符处理可能会出错。

但是使用 Base64 编码后,都转成可见字符串了

廖雪峰

#4 Created at ... [Delete] [Delete and Lock User]

你需要复习byte[] /  String / OutputStream / Writer


  • 1

Reply