AES加密解密代码
2017-09-07 11:47
399 查看
在做公司项目时,提到要有安全整改,例如需要将保存到sharedPreference中的密码等敏感信息,进行加密保存。
在网上查找了关于AES的一些加密解密方法,但有些方法可以进行加密,但解密的不是原来的值,下面的方法是经过自己验证后可以使用的:
public static final String AES_KEY_NUMBER = "hpgaerjnaoouekvs";
private final static String HEX = "0123456789ABCDEF";
public static String encryptAES(String cleartext,String seed) {
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
sr.setSeed(seed.getBytes());
kgen.init(128, sr); // 192 and 256 bits may not be available
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(new byte[cipher.getBlockSize()]));
byte[] encrypted = cipher.doFinal(cleartext.getBytes());
if (encrypted == null)
return "";
StringBuffer result = new StringBuffer(2 * encrypted.length);
for (int i = 0; i < encrypted.length; i++) {
result.append(HEX.charAt((encrypted[i] >> 4) & 0x0f)).append(HEX.charAt(encrypted[i] & 0x0f));
}
return result.toString();
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
public static String decryptAES(String encrypted,String seed) {
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
sr.setSeed(seed.getBytes());
kgen.init(128, sr); // 192 and 256 bits may not be available
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
int len = encrypted.length() / 2;
byte[] result = new byte[len];
for (int i = 0; i < len; i++)
result[i] = Integer.valueOf(encrypted.substring(2 * i, 2 * i + 2), 16).byteValue();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(new byte[cipher.getBlockSize()]));
byte[] decrypted = cipher.doFinal(result);
return new String(decrypted);
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
此方法可用,如果要使用Base64的,不过对于使用SVN的开发的话,导包是会遇到困难的,代码如下:
/**
* AES 加密
*
* @param content
* @param key
* @return
*/
public static String encryptAES(String content, String key) {
try {
byte[] byteContent = content.getBytes("UTF-8");
// 注意,为了能与 iOS 统一
// 这里的 key 不可以使用 KeyGenerator、SecureRandom、SecretKey 生成
byte[] enCodeFormat = key.getBytes();
SecretKeySpec secretKeySpec = new SecretKeySpec(enCodeFormat, "AES");
byte[] initParam = AES_KEY_NUMBER.getBytes();
IvParameterSpec ivParameterSpec = new IvParameterSpec(initParam);
// 指定加密的算法、工作模式和填充方式
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] encryptedBytes = cipher.doFinal(byteContent);
// 同样对加密后数据进行 base64 编码
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(encryptedBytes);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "";
}
}
/**
* AES 解密
*
* @param content
* @param key
* @return
*/
public static String decryptAES(String content, String key) {
try {
// base64 解码
BASE64Decoder decoder = new BASE64Decoder();
byte[] encryptedBytes = decoder.decodeBuffer(content);
byte[] enCodeFormat = key.getBytes();
SecretKeySpec secretKey = new SecretKeySpec(enCodeFormat, "AES");
byte[] initParam = AES_KEY_NUMBER.getBytes();
IvParameterSpec ivParameterSpec = new IvParameterSpec(initParam);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
byte[] result = cipher.doFinal(encryptedBytes);
return new String(result, "UTF-8");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "";
}
}
在网上查找了关于AES的一些加密解密方法,但有些方法可以进行加密,但解密的不是原来的值,下面的方法是经过自己验证后可以使用的:
public static final String AES_KEY_NUMBER = "hpgaerjnaoouekvs";
private final static String HEX = "0123456789ABCDEF";
public static String encryptAES(String cleartext,String seed) {
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
sr.setSeed(seed.getBytes());
kgen.init(128, sr); // 192 and 256 bits may not be available
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(new byte[cipher.getBlockSize()]));
byte[] encrypted = cipher.doFinal(cleartext.getBytes());
if (encrypted == null)
return "";
StringBuffer result = new StringBuffer(2 * encrypted.length);
for (int i = 0; i < encrypted.length; i++) {
result.append(HEX.charAt((encrypted[i] >> 4) & 0x0f)).append(HEX.charAt(encrypted[i] & 0x0f));
}
return result.toString();
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
public static String decryptAES(String encrypted,String seed) {
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
sr.setSeed(seed.getBytes());
kgen.init(128, sr); // 192 and 256 bits may not be available
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
int len = encrypted.length() / 2;
byte[] result = new byte[len];
for (int i = 0; i < len; i++)
result[i] = Integer.valueOf(encrypted.substring(2 * i, 2 * i + 2), 16).byteValue();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(new byte[cipher.getBlockSize()]));
byte[] decrypted = cipher.doFinal(result);
return new String(decrypted);
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
此方法可用,如果要使用Base64的,不过对于使用SVN的开发的话,导包是会遇到困难的,代码如下:
/**
* AES 加密
*
* @param content
* @param key
* @return
*/
public static String encryptAES(String content, String key) {
try {
byte[] byteContent = content.getBytes("UTF-8");
// 注意,为了能与 iOS 统一
// 这里的 key 不可以使用 KeyGenerator、SecureRandom、SecretKey 生成
byte[] enCodeFormat = key.getBytes();
SecretKeySpec secretKeySpec = new SecretKeySpec(enCodeFormat, "AES");
byte[] initParam = AES_KEY_NUMBER.getBytes();
IvParameterSpec ivParameterSpec = new IvParameterSpec(initParam);
// 指定加密的算法、工作模式和填充方式
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] encryptedBytes = cipher.doFinal(byteContent);
// 同样对加密后数据进行 base64 编码
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(encryptedBytes);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "";
}
}
/**
* AES 解密
*
* @param content
* @param key
* @return
*/
public static String decryptAES(String content, String key) {
try {
// base64 解码
BASE64Decoder decoder = new BASE64Decoder();
byte[] encryptedBytes = decoder.decodeBuffer(content);
byte[] enCodeFormat = key.getBytes();
SecretKeySpec secretKey = new SecretKeySpec(enCodeFormat, "AES");
byte[] initParam = AES_KEY_NUMBER.getBytes();
IvParameterSpec ivParameterSpec = new IvParameterSpec(initParam);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
byte[] result = cipher.doFinal(encryptedBytes);
return new String(result, "UTF-8");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "";
}
}
相关文章推荐
- AES加密解密代码实现
- [小代码]在Android和PHP之间的加密/解密,AES加密
- 使用Python进行AES加密和解密的示例代码
- SQLServer CLR 函数AES加密解密代码
- android使用AES加密和解密文件实例代码
- AES加密解密代码,key是16位
- Android AES加密/解密代码
- C#代码实现对AES加密解密
- C#实现AES加密和解密函数原代码
- 【前端Js】高级加密解密标准AES加密(Javascript代码实现)
- 代码虚拟的[小代码]在Android和PHP之间的加密/解密,AES加密
- 文本 Unicode 码加密与解密 代码
- java AES加密解密方法
- android之AES加密解密
- openssl对数组加密解密的完整实现代码
- Android平台 AES加密/解密
- javascript 代码加密解密代码
- C# AES加密解密
- AES 加密代码
- 一些加密解密的代码示例