根據公司的要求需要對一些數據保密,所以與公司做後臺的開發人員進行對接測試,特此記錄:
在進行加密解密之前我也是網上進行了大量的資料查閱,感覺比較詳細的在此列出,以做參考(由於我這裏與該方法實現有所出入,所以自己另外寫了個方法):
http://blog.csdn.net/eyishion/article/details/51308786
我這邊的需求是這樣的:服務端創建公鑰=>客戶端(用服務端提供的公鑰對用戶名和密碼進行加密生成密文)=>服務端。
直接上代碼:
/** * 使用公鑰對obj進行加密返回密文 * @obj 需要進行加密的字符串 * @publicKeyStr 服務端獲取的公鑰 * */ public static byte[] encodeByPublicKey(String obj, String publicKeyStr) { byte[] result; try { byte[] bytes=new BASE64Decoder().decodeBuffer(publicKeyStr); X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(bytes); KeyFactory factory = KeyFactory.getInstance("RSA"); PublicKey publicKey = factory.generatePublic(x509EncodedKeySpec); Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] encode = obj.getBytes(); result = cipher.doFinal(encode); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } return result; }
在與服務端對接加解密的過程中遇到的幾個問題:
1.服務端以字符串形式傳過來公鑰,在解密的時候需要用base64轉成byte數組:
byte[] bytes=new BASE64Decoder().decodeBuffer(publicKeyStr);
2.服務端與android端加解密的方式不同導致不一致,需要設置客服端的加密方式,
在博客:http://blog.csdn.net/u010670151/article/details/53006232有詳細講解:
Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding");
3.加密完成後的密碼需要轉成字符串的形式傳給服務端,需要使用Base64進行轉換:
String cliperText = (new BASE64Encoder()).encode(result);
java端編譯有自帶的base64,android這邊需要另行下載:BASE64_all.rar