RSA工具使用公開金鑰加密之後產生byte[] ,直接解密是沒有問題的,但將byte[]通過Base64.encode(byte[])之後得到的字串重新getBytes()去解密是會出現RSA Data must start with zero的問題的。
解決方案:
/** * 將加密後的位元組數群組轉換為對象 * * @MethodName: bytesToString * @Description: * @param encrytpByte * @return * @throws */public static String bytesToString(byte[] encrytpByte) { String result = ""; for (Byte bytes : encrytpByte) { result += bytes.toString() + " "; } return result; }/** * 公開金鑰加密 * * @MethodName: encrypt * @Description: * @param publicKey * @param obj * @return * @throws */public static byte[] encrypt(RSAPublicKey publicKey, byte[] obj) { if (publicKey != null) { try { Cipher cipher = Cipher.getInstance(KEY_ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, publicKey); return cipher.doFinal(obj); } catch (Exception e) { e.printStackTrace(); } } return null; }/** * 私密金鑰解密 * * @MethodName: decrypt * @Description: * @param privateKey * @param obj * @return * @throws */public static byte[] decrypt(RSAPrivateKey privateKey, byte[] obj) { if (privateKey != null) { try { Cipher cipher = Cipher.getInstance(KEY_ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, privateKey); return cipher.doFinal(obj); } catch (Exception e) { e.printStackTrace(); } } return null; }測試方法:
@Testpublic void testRSA() throws Exception{String publicKey=EhcacheUtil.get(StaticProperty.WMS_OPEN_API_RSA_PUBLIC_KEY).toString();String privateKey=EhcacheUtil.get(StaticProperty.WMS_OPEN_API_RSA_PRIVATE_KEY).toString();String platformCode="1234",tenantCode="10000"; byte [] bytes=SAASTokenManager.generateBytesToken(publicKey, platformCode, tenantCode);System.out.println("RSA bites 加密:"+new String(bytes)); System.out.println("RSA bites 解密:"+new String(RSAUtils.decryptByPrivateKey(bytes, privateKey)));// 將bytes轉換為StringString bytesStr = RSAUtils.bytesToString(bytes);String[] strArr = bytesStr.split(" "); int len = strArr.length; // 轉回bytes byte[] clone = new byte[len]; for (int i = 0; i < len; i++) { clone[i] = Byte.parseByte(strArr[i]); }System.out.println("RSA bites 解密:"+new String(RSAUtils.decryptByPrivateKey(clone, privateKey)));}