AES在Android、JAVA端正常加密解密
来源:互联网 发布:河南郑州淘宝加盟被骗 编辑:程序博客网 时间:2024/06/03 14:23
public class AESUtil {static final public byte[] KEY_VI = { 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8};public static final String bm = "UTF-8"; public static String encrypt(String dataPassword, String cleartext)throws Exception {IvParameterSpec zeroIv = new IvParameterSpec(KEY_VI);SecretKeySpec key = new SecretKeySpec(dataPassword.getBytes(), "AES");Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);byte[] encryptedData = cipher.doFinal(cleartext.getBytes(bm));return new String (parseByte2HexStr(encryptedData));}public static String decrypt(String dataPassword, String encrypted)throws Exception {byte[] byteMi = parseHexStr2Byte(encrypted);IvParameterSpec zeroIv = new IvParameterSpec(KEY_VI);SecretKeySpec key = new SecretKeySpec(dataPassword.getBytes(), "AES");Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, key, zeroIv);byte[] decryptedData = cipher.doFinal(byteMi);return new String(decryptedData,bm);}/** * 将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;}/** * 将二进制转换成16进制 * * @param buf * @return */public static String parseByte2HexStr(byte buf[]) {StringBuilder sb = new StringBuilder();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();}}
使用上面的方法android和Java端都可以可以正常加密解密。但是密钥必须是16,24或者32位。因为:
AES supports 128, 192 and 256 bit keys, so the number of bytes needs to be 16, 24, or 32. Note that the latter two may not be available in all circumstances (as the comment in the "kgen.init(128)" line mentions).
当密钥不是16,24,32位的时候就需要我们来做处理了
public class AESUtil {static final public byte[] KEY_VI = { 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8 };public static final String bm = "UTF-8";public static String encrypt(String dataPassword, String cleartext) throws Exception {// 对密钥进行处理-SKeyGenerator kgen = KeyGenerator.getInstance("AES");SecureRandom secureRandom;// for AndroidsecureRandom = SecureRandom.getInstance("SHA1PRNG", "Crypto");// for Java// secureRandom = SecureRandom.getInstance("SHA1PRNG");secureRandom.setSeed(dataPassword.getBytes("UTF-8"));kgen.init(128, secureRandom);SecretKey secretKey = kgen.generateKey();byte[] enCodeFormat = secretKey.getEncoded();// 对密钥进行处理-EIvParameterSpec zeroIv = new IvParameterSpec(KEY_VI);SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);byte[] encryptedData = cipher.doFinal(cleartext.getBytes(bm));return new String(parseByte2HexStr(encryptedData));}public static String decrypt(String dataPassword, String encrypted) throws Exception {// 对密钥进行处理-SKeyGenerator kgen = KeyGenerator.getInstance("AES");SecureRandom secureRandom;// for AndroidsecureRandom = SecureRandom.getInstance("SHA1PRNG", "Crypto");// for Java// secureRandom = SecureRandom.getInstance("SHA1PRNG");secureRandom.setSeed(dataPassword.getBytes("UTF-8"));kgen.init(128, secureRandom);SecretKey secretKey = kgen.generateKey();byte[] enCodeFormat = secretKey.getEncoded();// 对密钥进行处理-Ebyte[] byteMi = parseHexStr2Byte(encrypted);IvParameterSpec zeroIv = new IvParameterSpec(KEY_VI);SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, key, zeroIv);byte[] decryptedData = cipher.doFinal(byteMi);return new String(decryptedData, bm);}/** * 将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;}/** * 将二进制转换成16进制 * * @param buf * @return */public static String parseByte2HexStr(byte buf[]) {StringBuilder sb = new StringBuilder();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();}}
1 0
- AES在Android、JAVA端正常加密解密
- AES在Android、JAVA端正常加密解密
- AES在Android、JAVA端正常加密解密
- AES在Android、JAVA端正常加密解密
- AES加密解密在JAVA和ANDROID下互通
- Android初学------java AES 加密 解密
- Android AES 加密,解密
- Android AES加密解密
- Android AES加密解密
- Android AES加密解密
- Android AES加密 解密
- Android AES加密解密
- Android AES 加密、解密
- Android--AES加密解密
- 加密解密。(aes, java)
- java,AES加密,解密
- java AES加密解密
- java AES加密解密
- 【PAT】1014. Waiting in Line (30)
- 海量数据挖掘MMDS week5: 计算广告Computational Advertising
- 特征选择方法之信息增益
- 为什么要在JAVA,C++等集合中引入迭代器
- Memcached有个stats命令
- AES在Android、JAVA端正常加密解密
- Conclusion SIFT描述子提取步骤
- 嗅探的实现与防范
- unicode和ascII
- 第六周数据结构实践——数制转换(栈)【项目4 - 数制转换】
- Linux系统的内存分配
- jQuery fileupload 一次上传多个文件
- UIView与CALayer的区别,很详细
- OO设计模式五大原则