package cn.com.smartpay.app.http;

import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

/**
* @author carlos carlosk@163.com
* @version 创建时间:2012-5-17 上午9:48:35 类说明
*/

public class AESUtils {
public static final String TAG = "AESUtils";

public static String encrypt(String seed, String clearText) {
// Log.d(TAG, "加密前的seed=" + seed + ",内容为:" + clearText);
byte[] result = null;
try {
byte[] rawkey = getRawKey(seed.getBytes());
result = encrypt(rawkey, clearText.getBytes());
} catch (Exception e) {
e.printStackTrace();
}
String content = toHex(result);
// Log.d(TAG, "加密后的内容为:" + content);
return content;

}

public static String decrypt(String seed, String encrypted) {
// Log.d(TAG, "解密前的seed=" + seed + ",内容为:" + encrypted);
byte[] rawKey;
try {
rawKey = getRawKey(seed.getBytes());
byte[] enc = toByte(encrypted);
byte[] result = decrypt(rawKey, enc);
String coentn = new String(result);
// Log.d(TAG, "解密后的内容为:" + coentn);
return coentn;
} catch (Exception e) {
e.printStackTrace();
return null;
}

}

private static byte[] getRawKey(byte[] seed) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
sr.setSeed(seed);
kgen.init(128, sr);
SecretKey sKey = kgen.generateKey();
byte[] raw = sKey.getEncoded();

return raw;
}


private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
// Cipher cipher = Cipher.getInstance("AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(
new byte[cipher.getBlockSize()]));
byte[] encrypted = cipher.doFinal(clear);
return encrypted;
}

private static byte[] decrypt(byte[] raw, byte[] encrypted)
throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
// Cipher cipher = Cipher.getInstance("AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(
new byte[cipher.getBlockSize()]));
byte[] decrypted = cipher.doFinal(encrypted);
return decrypted;
}

public static String toHex(String txt) {
return toHex(txt.getBytes());
}

public static String fromHex(String hex) {
return new String(toByte(hex));
}

public static byte[] toByte(String hexString) {
int len = hexString.length() / 2;
byte[] result = new byte[len];
for (int i = 0; i < len; i++)
result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2),
16).byteValue();
return result;
}

public static String toHex(byte[] buf) {
if (buf == null)
return "";
StringBuffer result = new StringBuffer(2 * buf.length);
for (int i = 0; i < buf.length; i++) {
appendHex(result, buf[i]);
}
return result.toString();
}

private static void appendHex(StringBuffer sb, byte b) {
final String HEX = "0123456789ABCDEF";
sb.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0x0f));
}
}

更多相关文章

  1. Android设置系统时间
  2. Android 启动时间优化
  3. Android 自定义时间选择器
  4. Android Activity生命周期具体内容概述
  5. 详细的北京安卓培训班课程内容介绍
  6. android 使用contentobserver监听数据库内容变化
  7. Android读取assets目录下文件数据内容
  8. Android程序架构基本内容概述
  9. androidの读取短信内容

随机推荐

  1. LeetCode go
  2. 轮播图、懒加载
  3. 【jQuery基础入门】jQuery中常用Dom操作
  4. 能跑的不如会跑的,浅谈JAVA职业路线发展
  5. 流程控制之while循环
  6. 元组类型内置方法
  7. 流程控制之if判断
  8. 近2万字详解JAVA NIO2文件操作,过瘾!
  9. 半天掌握TypeScript,感觉就像写Java
  10. [jaeger] 二、客户端使用 (Java版本)