javax.crypto.BadPaddingException: Data must start with zero
进行RSA加密和解密的时候,会出现在这样的错误,找了许多答案,有的说是什么byte[]转换为string的时候需要分隔,有的说是“只能公钥加密,私钥解密”
但是在这里,是因为我在分块解密的时候,把byte数组划的块大小限定为64,所以导致错误的,实际上是128
另外一点值得提出的是,对于公钥加密之后的byte数组,如果转为string,然后再取得string的byte数据时候,会导致私钥解密失败,下面是两个byte数组对比
用公钥加密后:
[91, -12, -105, 43, 51, -92, 124, 10, -36, -33, -39, 103, -12, -95, -78, 102, 98, -32, 79, -1, -45, -25, -126, -63, 120, 51, 11, 18, 40, 111, 50, 15, 119, 123, -88, -26, -124, 85, 98, -127, 80, -11, -52, -77, -124, 115, -122, -39, 23, 60, -104, -52, 8, 88, 92, -57, 48, -85, -26, -58, -9, -83, 109, 89, -57, 20, 99, 80, -95, 81, -86, 27, 80, -47, -27, 71, 87, 27, -87, 24, 123, 8, 98, 78, 10, -31, 9, 31, 93, -40, 82, 101, 33, 42, -114, -87, -4, 14, -26, -83, 38, 52, -87, 66, -29, 1, 68, 99, -112, 67, 6, -6, 28, 8, -12, -68, -73, -121, -10, 74, 2, 19, -43, -101, -115, -91, 37, 76]
私钥解密string的byte数组:
[91, -17, -65, -67, -17, -65, -67, 43, 51, -17, -65, -67, 124, 10, -17, -65, -67, -17, -65, -67, -17, -65, -67, 103, -17, -65, -67, -17, -65, -67, -17, -65, -67, 102, 98, -17, -65, -67, 79, -17, -65, -67, -17, -65, -67, -17, -65, -67, -17, -65, -67, 120, 51, 11, 18, 40, 111, 50, 15, 119, 123, -17, -65, -67, -17, -65, -67, 85, 98, -17, -65, -67, 80, -17, -65, -67, -52, -77, -17, -65, -67, 115, -17, -65, -67, -17, -65, -67, 23, 60, -17, -65, -67, -17, -65, -67, 8, 88, 92, -17, -65, -67, 48, -17, -65, -67, -17, -65, -67, -17, -65, -67, -17, -65, -67, -17, -65, -67, 109, 89, -17, -65, -67, 20, 99, 80, -17, -65, -67, 81, -17, -65, -67, 27, 80, -17, -65, -67, -17, -65, -67, 71, 87, 27, -17, -65, -67, 24, 123, 8, 98, 78, 10, -17, -65, -67, 9, 31, 93, -17, -65, -67, 82, 101, 33, 42, -17, -65, -67, -17, -65, -67, -17, -65, -67, 14, -17, -65, -67, 38, 52, -17, -65, -67, 66, -17, -65, -67, 1, 68, 99, -17, -65, -67, 67, 6, -17, -65, -67, 28, 8, -17, -65, -67, -17, -65, -67, -17, -65, -67, -17, -65, -67, -17, -65, -67, 74, 2, 19, -43, -101, -17, -65, -67, -17, -65, -67, 37, 76]
可以看出,明显的不同
显然,第一个数组中的-12 变成了-17, -65, -67以及-105变成了-17, -65, -67
原因是为什么呢?
有人是这样说的:“byte[]转成String的时候,请用BASE64来转码,否则会因为字符转换问题(不是所有的byte组合都能映射为char),导致内容丢失。”
这也是为什么私钥和密钥要用Base64编码的原因了。
另外附上:
Base64编码的作用:由于某些系统中只能使用ASCII字符。Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法。