我实在JDK8环境开发测试。
1、AES算法cbc模式的加密解密
package com.community.core.util;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
public class AesCBCUtils {
private static final String key = "6C4E60E55552386C"; //加密kay
private static final String initVector = "5315265453152654"; //偏移量
/**
* 加密算法
*/
private static final String KEY_ALGORITHM = "AES"; //加密算法
//算法/模式/填充模式
private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5PADDING";
/**
* 加密
* @param value
* @return
*/
public static String encrypt(String value) {
try {
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes(StandardCharsets.UTF_8));
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), KEY_ALGORITHM);
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(value.getBytes());
return Base64.encodeBase64String(encrypted);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
/**
* 解密
* @param encrypted
* @return
*/
public static String decrypt(String encrypted) {
try {
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes(StandardCharsets.UTF_8));
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), KEY_ALGORITHM);
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted));
return new String(original);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
public static void main(String[] args){
String data = "中国人";
String res = encrypt(data);
System.out.println(res);
System.out.println(decrypt(res));
}
}
2、3DES算法CBC模式加密解密
package com.community.core.util;
import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
import java.nio.charset.StandardCharsets;
import java.security.Key;
public class Des3CBCUtils {
public final static Logger log = LoggerFactory.getLogger(Des3CBCUtils.class);
/**
* 加密算法
*/
private static final String KEY_ALGORITHM = "DESede";
private static final String CIPHER_ALGORITHM = "DESede/CBC/PKCS5Padding";
/**
* 3DES 加密
*
* @param key 秘钥(24位)
* @param iv 偏移量
* @param data 需要加密的字符串
* @return 返回加密的字符串
*/
public static String encrypt(String key, String iv, String data) {
try {
DESedeKeySpec spec = new DESedeKeySpec(key.getBytes(StandardCharsets.UTF_8));
SecretKeyFactory keyfactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
Key deskey = keyfactory.generateSecret(spec);
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
IvParameterSpec ips = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));
cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);
byte[] bOut = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
return Base64.encodeBase64String(bOut);
} catch (Exception e) {
e.printStackTrace();
log.error("3DES 解密错误:{}", e);
throw new RuntimeException("3DES 解密错误");
}
}
/**
* 3DES 解密
*
* @param key 秘钥(24位)
* @param iv 偏移量
* @param data 需要解密的密文
* @return 返回加密的字符串
*/
public static String decrypt(String key, String iv, String data) {
try {
DESedeKeySpec spec = new DESedeKeySpec(key.getBytes(StandardCharsets.UTF_8));
SecretKeyFactory keyfactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
Key deskey = keyfactory.generateSecret(spec);
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
IvParameterSpec ips = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));
cipher.init(Cipher.DECRYPT_MODE, deskey, ips);
byte[] bOut = cipher.doFinal(Base64.decodeBase64(data.getBytes(StandardCharsets.UTF_8)));
return new String(bOut, StandardCharsets.UTF_8);
} catch (Exception e) {
e.printStackTrace();
log.error("3DES 解密错误:{}", e);
throw new RuntimeException("3DES 解密错误");
}
}
public static void main(String[] args) {
String data = "中国人";
System.out.println("需要加密的字符串内容为:" + data);
String des3EncodeCBC = encrypt("6C4E60E55552386C759569836DC0F83869836DC0F838C0F7", "53152654", data);
System.out.println("加密后的字符串内容为:" + des3EncodeCBC);
String des3DecodeCBC = decrypt("6C4E60E55552386C759569836DC0F83869836DC0F838C0F7", "53152654", des3EncodeCBC);
System.out.println("解密后的字符串内容为:" + des3DecodeCBC);
}
}
3、3DES 算法ECB模式加密解密
package com.community.core.util;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
public class Des3ECBUtils {
private static final String KEY_ALGORITHM = "DESede";
private static final String DEFAULT_CIPHER_ALGORITHM = "DESede/ECB/PKCS5Padding";// 默认的加密算法
/**
* DESede 加密操作
*
* @param content
* 待加密内容
* @param key
* 加密密钥
* @return 返回Base64转码后的加密数据
*/
public static String encrypt(String content, String key) {
try {
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
// 创建密码器
byte[] byteContent = content.getBytes("utf-8");
cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(key));
// 初始化为加密模式的密码器
byte[] result = cipher.doFinal(byteContent);// 加密
return Base64.encodeBase64String(result);// 通过Base64转码返回
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
/**
* } } DESede 解密操作
*
* @param content
* @param key
* @return
*/
public static String decrypt(String content, String key) {
try {
// 实例化
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM); // 使用密钥初始化,设置为解密模式
cipher.init(Cipher.DECRYPT_MODE, getSecretKey(key)); // 执行操作
byte[] result = cipher.doFinal(Base64.decodeBase64(content));
return new String(result, "utf-8");
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
/**
}
* 生成加密秘钥
*
* @return
*/ private static SecretKeySpec getSecretKey(final String key) {
//返回生成指定算法密钥生成器的KeyGenerator 对象
KeyGenerator kg = null; try { kg = KeyGenerator.getInstance(KEY_ALGORITHM);
kg.init(new SecureRandom(key.getBytes()));
//生成一个密钥
SecretKey secretKey = kg.generateKey();
return new SecretKeySpec(secretKey.getEncoded(), KEY_ALGORITHM);
// 转换为DESede专用密钥
} catch (NoSuchAlgorithmException ex) {
ex.printStackTrace();
} return null;
}
public static void main(String[] args) {
String content = "abcdefgh";
String key = "6C4E60E55552386C759569836DC0F83869836DC0F838C0F7";
System.out.println("content:" + content);
String s1 = encrypt(content, key);
System.out.println("加密:" + s1);
System.out.println("解密:" + decrypt(s1, key));
}
}