前言
近期小白得到一个任务,要写几篇文档专门给公司实习生做一个简单的培训,其中就有加密解密类,现将收集的代码整理如下,做一个记录,其中参考了这几篇文章:
https://blog.youkuaiyun.com/gulang03/article/details/81771341
https://www.jianshu.com/p/ee3487daca34
1:AES加解密
public class AESEncryptImpl {
private static final String KEY_ALGORITHM = "AES";
private static final String DEFAULT_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";//默认的加密算法
/**
* AES 加密操作
* @param content 待加密内容
* @param key 加密密钥
* @return 返回Base64转码后的加密数据
*/
public static String encrypt(String content, String key) throws Exception{
// 创建密码器
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);
// 通过Base64转码返回
return Base64.encodeBase64String(result);
}
/**
* AES 解密操作
* @param content
* @param key
* @return
*/
public static String decrypt(String content, String key) throws Exception{
// 实例化
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");
}
/**
* 生成加密秘钥
* @return
*/
private static SecretKeySpec getSecretKey(String key) throws Exception{
// 返回生成指定算法密钥生成器的 KeyGenerator 对象
KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);
// AES 要求密钥长度为 128
kg.init(128, new SecureRandom(key.getBytes()));
// 生成一个密钥
SecretKey secretKey = kg.generateKey();
// 转换为AES专用密钥
return new SecretKeySpec(secretKey.getEncoded(), KEY_ALGORITHM);
}
public static void main(String[] args) throws Exception{
String content = "Java 小白";
String key = "java";
System.out.println("明文:" + content);
String encStr = AESEncryptImpl.encrypt(content, key);
System.out.println("加密后:" + encStr);
String decStr = AESEncryptImpl.decrypt(encStr, key);
System.out.println("解密后:"+ decStr);
}
}
2:RSA加解密
public class RSAEncryptImpl {
protected static String RSA_INSTANCE = "RSA";
protected static PrivateKey privateKey;
protected static PublicKey publicKey;
/**
* 生成密钥对:密钥对中包含公钥和私钥
* @return 包含 RSA 公钥与私钥的 keyPair
* @throws Exception
*/
RSAEncryptImpl() throws Exception {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA_INSTANCE); // 获得RSA密钥对的生成器实例
SecureRandom secureRandom = new SecureRandom(String.valueOf(System.currentTimeMillis()).getBytes("utf-8")); // 获得一个安全的随机数
keyPairGenerator.initialize(1024, secureRandom); // 这里可以是1024、2048 初始化一个密钥对
KeyPair keyPair = keyPairGenerator.generateKeyPair(); // 获得密钥对
privateKey = keyPair.getPrivate();
publicKey = keyPair.getPublic();
}
/**
* 获取公钥 (并进行Base64编码,返回一个 Base64 编码后的字符串)
* @return 返回一个 Base64 编码后的公钥字符串
*/
public static String getPublicKey(){
return Base64.encodeBase64String(publicKey.getEncoded());
}
/**
* 获取私钥(并进行Base64编码,返回一个 Base64 编码后的字符串)
* @return 返回一个 Base64 编码后的私钥字符串
*/
public static String getPrivateKey(){
return Base64.encodeBase64String(privateKey.getEncoded());
}
/**
* 公钥加密
* @param content 待加密的字符串
* @return 加密后的字符串
*/
public static String publicEncrytype(String content) throws Exception {
Cipher cipher = Cipher.getInstance(RSA_INSTANCE);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] bytes = cipher.doFinal(content.getBytes());
return Base64.encodeBase64String(bytes);
}
/**
* 私钥解密
* @param content 待解密的字符串
* @return 解密后的字符串
*/
public static String privateDecrypt(String content) throws Exception {
Cipher cipher = Cipher.getInstance(RSA_INSTANCE);
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] bytes = cipher.doFinal(Base64.decodeBase64(content));
return new String(bytes);
}
public static void main(String[] args) throws Exception{
RSAEncryptImpl rsaEncrypt = new RSAEncryptImpl();
String content = "Java 小白"; // 明文内容
System.out.println("明文:" + content);
// 获得进行Base64 加密后的公钥和私钥 String
System.out.println("Base64处理后的私钥:" + rsaEncrypt.getPrivateKey());
System.out.println("Base64处理后的公钥:" + rsaEncrypt.getPublicKey());
// 公钥加密/私钥解密
String publicEncryStr = rsaEncrypt.publicEncrytype(content);
System.out.println("公钥加密后的字符串(经BASE64处理):" + publicEncryStr);
String privateDecryStr = rsaEncrypt.privateDecrypt(publicEncryStr);
System.out.println("私钥解密后的原始字符串:" + privateDecryStr);
}
}