前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、简单实现加解密
1.1加密
/**
* 加密
*
* @param content 待加密内容
* @param encryptKey 加密 KEY
* @return
*/
public static String encrypt(String content, String encryptKey) throws Exception {
if (content == null || encryptKey == null) {
throw new IllegalArgumentException("加密内容 content 和 encryptKey 不能为 null");
}
if (encryptKey.length() != KEY_LENGTH) {
throw new IllegalArgumentException("加密的encryptKey必须为16位");
}
// 创建cipher实例 参数按"算法/模式/填充模式" "AES/ECB/PKCS5Padding"
Cipher cipher = Cipher.getInstance(PADDING);
// 初始化ciper,
// (1)opmode :Cipher.ENCRYPT_MODE(加密模式)和 Cipher.DECRYPT_MODE(解密模式)
// (2)key :密匙,使用传入的盐构造出一个密匙,可以使用SecretKeySpec、KeyGenerator和KeyPairGenerator创建密匙,其中
// * SecretKeySpec和KeyGenerator支持AES,DES,DESede三种加密算法创建密匙
// * KeyPairGenerator支持RSA加密算法创建密匙
// (3)params :使用CBC模式时必须传入该参数,该项目使用IvParameterSpec创建iv 对象
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(DEFAULT_ENCODING), KEY_ALGORITHM));
/* org.apache.commons.codec.binary.Base64; Base64.encodeBase64String() 解决Base64加密换行问题 */
// 加密或解密,返回byte数组
byte[] bytes = cipher.doFinal(content.getBytes(DEFAULT_ENCODING));
return Base64.encodeBase64String(bytes);
}
1.2、解密
/**
* 解密
*
* @param content 待解密内容
* @param decryptKey 解密的 KEY
* @return
*/
public static String decrypt(String content, String decryptKey) throws Exception {
if (content == null || decryptKey == null) {
throw new IllegalArgumentException("解密内容或解密key不能为null");
}
if (decryptKey.length() != KEY_LENGTH) {
throw new IllegalArgumentException("解密的decryptKey必须为16位");
}
Cipher cipher = Cipher.getInstance(PADDING);
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(DEFAULT_ENCODING), KEY_ALGORITHM));
/*Base64.decodeBase64(content);*/
byte[] bytes = Base64.decodeBase64(content);
bytes = cipher.doFinal(bytes);
return new String(bytes, DEFAULT_ENCODING);
}
1.3 代码解释
上面简单实现了AES(“AES/CBC/PKCS5Padding”)的加密和解密。可以看到代码中主要的是cipher对象,并有以下调用
(1)新建Cipher对象时需要传入一个参数"AES/CBC/PKCS5Padding"
(2)cipher对象使用之前还需要初始化,共三个参数(“加密模式或者解密模式”,“密匙”,“向量”)
(3)调用数据转换:cipher.doFinal(content),其中content是一个byte数组
实际上Cipher类实现了多种加密算法,在创建Cipher对象时,传入不同的参数就可以进行不同的加密算法。而这些算法不同的地方只是创建密匙的方法不同而已。
如传入“AES/CBC/NoPadding”可进行AES加密,传入"DESede/CBC/NoPadding"可进行DES3加密。具体的后面会介绍到。
2. Cipher类
2.1 Cipher类提供了加密和解密的功能。
该项目使用Cipher类完成aes,des,des3和rsa加密.
获取Cipher类的对象:Cipher cipher = Cipher.getInstance(“DES/CBC/PKCS5Padding”); 参数按"算法/模式/填充模式",有以下的参数
- AES/CBC/NoPadding (128)
- AES/CBC/PKCS5Padding (128)
- AES/ECB/NoPadding (128)
- AES/ECB/PKCS5Padding (128)
- DES/CBC/NoPadding (56)
- DES/CBC/PKCS5Padding (56)
- DES/ECB/NoPadding (56)
- DES/ECB/PKCS5Padding (56)
- DESede/CBC/NoPadding (168)
- DESede/CBC/PKCS5Padding (168)
- DESede/ECB/NoPadding (168)
- DESede/ECB/PKCS5Padding (168)
- RSA/ECB/PKCS1Padding (1024, 2048)
- RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024, 2048)
- RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024, 2048)
(1)加密算法有:AES,DES,DESede(DES3)和RSA 四种
(2) 模式有CBC(有向量模式)和ECB(无向量模式),向量模式可以简单理解为偏移量,使用CBC模式需要定义一个IvParameterSpec对象
(3) 填充模式: - NoPadding: 加密内容不足8位用0补足8位, Cipher类不提供补位功能,需自己实现代码给加密内容添加0, 如{65,65,65,0,0,0,0,0}
- PKCS5Padding: 加密内容不足8位用余位数补足8位, 如{65,65,65,5,5,5,5,5}或{97,97,97,97,97,97,2,2}; 刚好8位补8位8
2.2 Cipher对象需要初始化
init(int opmode, Key key, AlgorithmParameterSpec params)
(1)opmode :Cipher.ENCRYPT_MODE(加密模式)和 Cipher.DECRYPT_MODE(解密模式)
(2)key :密匙,使用传入的盐构造出一个密匙,可以使用SecretKeySpec、KeyGenerator和KeyPairGenerator创建密匙,其中
- SecretKeySpec和KeyGenerator支持AES,DES,DESede三种加密算法创建密匙
- KeyPairGenerator支持RSA加密算法创建密匙
(3)params :使用CBC模式时必须传入该参数,该项目使用IvParameterSpec创建iv 对象
2.3 加密或解密
byte[] b = cipher.doFinal(content);
返回结果为byte数组,如果直接使用 new String(b) 封装成字符串,则会出现乱码