java android aes加密解密_AES加密解密在JAVA和ANDROID下互通
昨天外包安卓的那個人說AES的加解密結(jié)果不一樣。于是百度搜索發(fā)現(xiàn)還真是!
貼上AES加密核心:
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
CBC是工作模式,AES一共同擁有電子password本模式(ECB)、加密分組鏈接模式(CBC)、加密反饋模式(CFB)和輸出反饋模式(OFB)四種模式。PKCS5Padding是填充模式,還有其他的填充模式:然后,cipher.init()一共同擁有三個參數(shù):Cipher.ENCRYPT_MODE,
key, zeroIv,zeroIv就是初始化向量,一個8為字符數(shù)組。工作模式、填充模式、初始化向量這三種因素一個都不能少。否則,假設(shè)你不指定的話。那么就要程序就要調(diào)用默認(rèn)實現(xiàn)。
知道原因就好辦,各種調(diào)試測試之后完畢AES在JAVA和安桌互通。
現(xiàn)貼上核心代碼:
/** 填充模式 */
private static final String transformation = "AES/CBC/PKCS5Padding";
/**
* 加密
*
* @param content 須要加密的內(nèi)容
* @param password 加密密碼
* @return
*/
public static String encrypt(String content, String password) {
try {
IvParameterSpec zeroIv = new IvParameterSpec(password.getBytes());
SecretKeySpec key1 = new SecretKeySpec(password.getBytes(),"AES");
Cipher cipher = Cipher.getInstance(transformation);
cipher.init(Cipher.ENCRYPT_MODE, key1, zeroIv);
byte[] encryptedData = cipher.doFinal(content.getBytes());
String encryptResultStr = parseByte2HexStr(encryptedData);
return encryptResultStr;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 解密
*
* @param content 待解密內(nèi)容
* @param password 解密密鑰
* @return
*/
public static String decrypt(String content, String password) {
try {
byte[] decryptFrom = parseHexStr2Byte(content);
IvParameterSpec zeroIv = new IvParameterSpec(password.getBytes());
SecretKeySpec key1 = new SecretKeySpec(password.getBytes(),"AES");
Cipher cipher = Cipher.getInstance(transformation);
cipher.init(Cipher.DECRYPT_MODE, key1, zeroIv);
byte decryptedData[] = cipher.doFinal(decryptFrom);
return new String(decryptedData);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**將二進(jìn)制轉(zhuǎn)換成16進(jìn)制
* @param buf
* @return
*/
public static String parseByte2HexStr(byte buf[]) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < buf.length; i++) {
String hex = Integer.toHexString(buf[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
sb.append(hex.toUpperCase());
}
return sb.toString();
}
/**將16進(jìn)制轉(zhuǎn)換為二進(jìn)制
* @param hexStr
* @return
*/
public static byte[] parseHexStr2Byte(String hexStr) {
if (hexStr.length() < 1)
return null;
byte[] result = new byte[hexStr.length()/2];
for (int i = 0;i< hexStr.length()/2; i++) {
int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
result[i] = (byte) (high * 16 + low);
}
return result;
}最后我想說一下,花了積分最后還是解決不了互通。我僅僅想說不帶這樣騙積分的。
總結(jié)
以上是生活随笔為你收集整理的java android aes加密解密_AES加密解密在JAVA和ANDROID下互通的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机技术如何设计酶,百人学者Natur
- 下一篇: 前端面试技巧和注意事项_前端面试百分之九