我們項目的需求是IOS前臺進行數(shù)據(jù)加密,java后臺進行數(shù)據(jù)解密,采用對稱加密算法。權衡利弊后選用AES加密算法。在實現(xiàn)的過程中發(fā)現(xiàn)IOS加密的數(shù)據(jù)java端解密不了,翻閱資料發(fā)現(xiàn)是IOS端ASE的填充算法采用PKCS7Padding,而我在java端采用的填充算法是PKCS5Padding或者NONE,繼續(xù)查閱資料終于找到JAVA端可用的基于PACS7Padding的加解密算法,自己改造了一下發(fā)布如下:
- package com.ys.dk.common.util;
-
- import java.security.Security;
- import javax.crypto.Cipher;
- import javax.crypto.SecretKey;
- import javax.crypto.spec.SecretKeySpec;
- import org.bouncycastle.util.encoders.Base64;
-
- public class AESUtil {
- /**
- * 密鑰算法 java6支持56位密鑰,bouncycastle支持64位
- * */
- public static final String KEY_ALGORITHM = "AES";
- public static final String CIPHER_ALGORITHM = "AES/ECB/PKCS7Padding";
- //key長度為[128bit(16byte),192bit(24byte),256bit(32byte)]中的一個
- public static final String KEY = "1234567890123456";
- public static final SecretKey secretKey = new SecretKeySpec(KEY.getBytes(), KEY_ALGORITHM);
- static {
- Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
- }
-
- /**
- * 加密數(shù)據(jù)
- * @param str
- * @return String 加密后的數(shù)據(jù)
- * */
- public static String encrypt(String str) throws Exception {
- Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
- // 初始化,設置為加密模式
- cipher.init(Cipher.ENCRYPT_MODE, secretKey);
- // 執(zhí)行操作
- byte[] data = cipher.doFinal(str.getBytes());
- data = Base64.encode(data);
- return new String(data,"UTF-8");
- }
-
- /**
- * 解密數(shù)據(jù)
- *
- * @param str
- * @return String 解密后的數(shù)據(jù)
- * */
- public static String decrypt(String str) throws Exception {
- byte[] data = Base64.decode(str);
- Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
- // 初始化,設置為解密模式
- cipher.init(Cipher.DECRYPT_MODE, secretKey);
- // 執(zhí)行操作
- return new String(cipher.doFinal(data),"UTF-8");
- }
-
- public static void main(String[] args) throws Exception {
- String str = "你好";
- System.out.println("原始串:"+str);
- String enc = AESUtil.encrypt(str);
- // enc= "llQCl2Zii01ora9J3PJxNA==";
- System.out.println("加密后:"+enc);
- String dec = AESUtil.decrypt(enc);
- System.out.println("解密后:"+dec);
- }
-
-
- }
注意兩點:
1, 加解密用到了bouncycastle的jar,附件里面有下載
2,用附件中的local_policy.jar,US_export_policy.jar覆蓋JDK安裝路徑的\jre\lib\security(例如我的目錄結構為C:\Program Files\Java\jdk1.6.0_43\jre\lib\security,別弄錯目錄了)目錄下的兩個jar
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請
點擊舉報。