1.先看下介紹
AES 密碼學(xué)中的高級(jí)加密標(biāo)準(zhǔn)(Advanced Encryption Standard,AES),又稱Rijndael加密法,是美國(guó)聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)。這個(gè)標(biāo)準(zhǔn)用來(lái)替代原先的DES(Data Encryption Standard),已經(jīng)被多方分析且廣為全世界所使用。
AES 是對(duì)稱加密算法,優(yōu)點(diǎn):加密速度快;缺點(diǎn):如果秘鑰丟失,就容易解密密文,安全性相對(duì)比較差
對(duì)稱加密 : 也就是加密秘鑰和解密秘鑰是一樣的。
非對(duì)稱加密 : 也就是加密秘鑰和解密秘鑰是不一樣的。
2.廢話不多說(shuō),直接上代碼
2.1 自己定義的一個(gè)類,參數(shù)是AES加密模式,方便調(diào)用
public static final String AESCBCNoPadding = "AES/CBC/NoPadding";
public static final String AESCBCPKCS5Padding = "AES/CBC/PKCS5Padding(";
public static final String AESECBNoPadding = "AES/ECB/NoPadding";
public static final String AESECBPKCS5Padding = "AES/ECB/PKCS5Padding";
public static final String DESCBCNoPadding = "DES/CBC/NoPadding";
public static final String DESCBCPKCS5Padding = "DES/CBC/PKCS5Padding";
public static final String DESECBNoPadding = "DES/ECB/NoPadding";
public static final String DESECBPKCS5Padding = "DES/ECB/PKCS5Padding";
public static final String DESedeCBCNoPadding = "DESede/CBC/NoPadding";
public static final String DESedeCBCPKCS5Padding = "DESede/CBC/PKCS5Padding";
public static final String DESedeECBNoPadding = "DESede/ECB/NoPadding";
public static final String DESedeECBPKCS5Padding = "DESede/ECB/PKCS5Padding";
public static final String RSAECBPKCS1Padding = "RSA/ECB/PKCS1Padding";
public static final String RSAECBOAEPWithSHA_1AndMGF1Padding = "RSA/ECB/OAEPWithSHA-1AndMGF1Padding";
public static final String RSAECBOAEPWithSHA_256AndMGF1Padding = "RSA/ECB/OAEPWithSHA-256AndMGF1Padding";
2.2 由于aes加密后的字節(jié)數(shù)組,直接轉(zhuǎn)String返回參數(shù)有可能存在亂碼,所以對(duì)返回值做一下處理,將加密的結(jié)果轉(zhuǎn)換為base64的字符串。同理,解密時(shí)候,需要把字符串先base64處理,再把解密后的內(nèi)容進(jìn)行aes解密操作。
也就是說(shuō)流程為:
加密(從前往后):明文 -> 加密 -> base64處理 -> 密文
解密(從后往前):明文 <- 解密 <- base64處理 <- 密文
/**
* @param data 明文
* @param key 密鑰,長(zhǎng)度16
* @param iv 偏移量,長(zhǎng)度16
* @return 密文
* @Description AES算法加密明文
*/
public static String AesEncrypt(String data, String key, String iv) {
try {
//AES/CBC/NoPadding
Cipher cipher = Cipher.getInstance(AESEnum.AESCBCNoPadding);
int blockSize = cipher.getBlockSize();
byte[] dataBytes = data.getBytes();
int plaintextLength = dataBytes.length;
if (plaintextLength % blockSize != 0) {
plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
}
byte[] plaintext = new byte[plaintextLength];
System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);
SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
// CBC模式,需要一個(gè)向量iv,可增加加密算法的強(qiáng)度
IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
byte[] encrypted = cipher.doFinal(plaintext);
// 加密后直接轉(zhuǎn)string可能亂碼,用BASE64做轉(zhuǎn)碼。
return encode(encrypted).trim();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* @param data 密文
* @param key 密鑰,長(zhǎng)度16
* @param iv 偏移量,長(zhǎng)度16
* @return 明文
* @Description AES算法解密
*/
public static String AesDecrypt(String data, String key, String iv) {
try {
//先用base64解密
byte[] encrypted1 = decode(data);
//AES/CBC/NoPadding
Cipher cipher = Cipher.getInstance(AESEnum.AESCBCNoPadding);
SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
byte[] original = cipher.doFinal(encrypted1);
String originalString = new String(original);
return originalString.trim();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 編碼
*
* @param byteArray
* @return
*/
public static String encode(byte[] byteArray) {
return new String(new org.apache.commons.codec.binary.Base64().encode(byteArray));
}
/**
* 解碼
*
* @param base64EncodedString
* @return
*/
public static byte[] decode(String base64EncodedString) {
return new org.apache.commons.codec.binary.Base64().decode(base64EncodedString);
}
用到的依賴文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-636303.html
<!--常用的加密解密方法-->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>
測(cè)試結(jié)果:
沒(méi)一點(diǎn)問(wèn)題滴文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-636303.html
到了這里,關(guān)于java | 使用Cipher類實(shí)現(xiàn)AES所有常用加密模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!