android RSA公鑰加密 公鑰解密,解決亂碼問題
阿新 • • 發佈:2019-01-02
/** * <p> * 公鑰解密 * </p> * * @param encryptedData 已加密資料 * @param publicKey 公鑰 (無需base64編碼,靠,網上的程式碼為毛說要base64編碼,坑啊哥哥們)* @return (已解決解密亂碼問題) * @throws Exception */ public static byte[] decryptByPublicKey(byte[] encryptedData,String publicKey ) throws Exception {X509EncodedKeySpec x509KeySpec = newX509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); Key publicK = keyFactory.generatePublic(x509KeySpec); Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.DECRYPT_MODE, publicK); int inputLen = encryptedData.length; ByteArrayOutputStream out = newByteArrayOutputStream(); int offSet = 0; byte[] cache; int i = 0; // 對資料分段解密 while (inputLen - offSet > 0) { if (inputLen - offSet > MAX_DECRYPT_BLOCK) { cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK); } else { cache = cipher.doFinal(encryptedData,offSet, inputLen - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * MAX_DECRYPT_BLOCK; } byte[] decryptedData = out.toByteArray(); out.close(); return decryptedData; }
/** * <p> * 公鑰加密 * </p> * * @param data 源資料 * @param * @return * @throws Exception */ public static byte[] encryptByPublicKey(byte[] data,String publicKey) throws Exception { byte[] keyBytes = Base64.decode(publicKey, Base64.DEFAULT); X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); Key publicK = keyFactory.generatePublic(x509KeySpec); // 對資料加密 Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding"); cipher.init(Cipher.ENCRYPT_MODE, publicK); int inputLen = data.length; ByteArrayOutputStream out = new ByteArrayOutputStream(); int offSet = 0; byte[] cache; int i = 0; // 對資料分段加密 while (inputLen - offSet > 0) { if (inputLen - offSet > MAX_ENCRYPT_BLOCK) { cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK); } else { cache = cipher.doFinal(data, offSet, inputLen - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * MAX_ENCRYPT_BLOCK; } byte[] encryptedData = out.toByteArray(); out.close(); return encryptedData; }
注:本方法中base64為util包下
android.util.Base64;
另外:方法中公鑰 為"ASDFG"這種 ,網上有好多公鑰前後有---BIGIN END—— 這種,在本文中並不適用。
本人菜鳥,不知道問什麼,求告知