<span style="font-family: Arial, Helvetica, sans-serif;">昨天外包安卓的那个人说AES的加解密结果不一样。于是百度搜索发现还真是!</span>

贴上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()一共同拥有三个參数:Cipher.ENCRYPT_MODE,
key, zeroIv,zeroIv就是初始化向量,一个8为字符数组。工作模式、填充模式、初始化向量这三种因素一个都不能少。否则,假设你不指定的话。那么就要程序就要调用默认实现。

知道原因就好办,各种调试測试之后完毕AES在JAVA和安桌互通。

现贴上核心代码:

/** 填充模式 */
private static final String transformation = "AES/CBC/PKCS5Padding";
/**
* 加密
*
* @param content 须要加密的内容
* @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 待解密内容
* @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;
} /**将二进制转换成16进制
* @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进制转换为二进制
* @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;
}

最后我想说一下,花了积分最后还是解决不了互通。我仅仅想说不带这样骗积分的。

最新文章

  1. sqlite3 shell的使用
  2. Mysql之performance Schema
  3. IOS开发UI基础UITextFidle相关属性
  4. CKEditor实现图片上传
  5. iOS 静态库和动态库的区别&amp;静态库的生成
  6. trigger()的event事件对象之坑
  7. HTTP协议3之压缩--转
  8. module require区别
  9. 混合使用Azure LB和ILB访问相同web服务(2)
  10. Tensorflow 神经网络
  11. Ubuntu 问题解决汇总
  12. Vue-自带vue-resource插件实现http请求
  13. 解决Error: ENOENT: no such file or directory, scandir &#39;D:\IdeaWork\code-front-jet\node_modules\.npminstall\node-sass\3.7.0\node-sass\vendor&#39;
  14. Eclipse+Maven整合开发Java项目(二)➣webapp3.0以上的Maven项目
  15. js Map和Set
  16. poj 2481 Cows(树状数组)题解
  17. 201709015工作日记--IntentService使用
  18. Java开发之JDK配置
  19. android中一个评分的控件
  20. 【转】Spring+Mybatis+SpringMVC+Maven+MySql搭建实例

热门文章

  1. 安卓、safari和微信各个浏览器的设计标准
  2. 路飞学城-Python开发-第二章
  3. django 分组统计遇见的问题
  4. 被我忽略许久的set
  5. 封装cookie的获取,设置与查找
  6. BZOJ 2342 [Shoi2011]双倍回文(manacher+堆+set)
  7. python scrapy爬取HBS 汉堡南美航运公司柜号信息
  8. HDU 4366 Successor
  9. 华夏60 战斗机(最短路dijkstra)
  10. readb(), readw(), readl(),writeb(), writew(), writel() 宏函数