java实现aes的五种加密模式
时间: 2023-08-25 12:06:02 浏览: 99
Java中支持AES加密模式的有五种,分别是ECB、CBC、CFB、OFB和CTR。下面我将分别介绍这五种加密模式的实现方式:
1. ECB模式(电子密码本模式)
ECB模式是最基本的加密模式,它将明文分成若干块,每一块分别进行加密,加密后的密文组合起来形成最终的密文。在使用ECB模式时,如果明文中有相同的数据块,那么加密后的密文也是相同的,因此ECB模式并不安全,一般不建议使用。
Java实现代码如下:
```
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class AESECBUtil {
public static byte[] AESEncrypt(byte[] content, byte[] keyBytes) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
SecretKey key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] result = cipher.doFinal(content);
return result;
}
public static byte[] AESDecrypt(byte[] content, byte[] keyBytes) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
SecretKey key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] result = cipher.doFinal(content);
return result;
}
}
```
2. CBC模式(加密块链模式)
CBC模式是一种分组密码加密模式,它需要一个初始化向量(IV)来进行加密。在加密时,明文首先与IV进行异或操作,然后再进行加密,加密后的密文再与下一个明文块进行异或操作再进行加密,以此类推。在使用CBC模式时,同样的明文会因为不同的IV而加密成不同的密文,因此相对于ECB模式来说,CBC模式更加安全。
Java实现代码如下:
```
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class AESCBCUtil {
public static byte[] AESEncrypt(byte[] content, byte[] keyBytes, byte[] iv) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
SecretKey key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
byte[] result = cipher.doFinal(content);
return result;
}
public static byte[] AESDecrypt(byte[] content, byte[] keyBytes, byte[] iv) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
SecretKey key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
byte[] result = cipher.doFinal(content);
return result;
}
}
```
3. CFB模式(加密反馈模式)
CFB模式是一种分组密码加密模式,它采用了反馈机制,将上一次加密的结果作为下一次加密的输入,以此来增强加密的安全性。在使用CFB模式时,同样的明文会因为不同的初始向量而加密成不同的密文,因此相对于ECB模式来说,CFB模式更加安全。
Java实现代码如下:
```
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class AESCFBUtil {
public static byte[] AESEncrypt(byte[] content, byte[] keyBytes, byte[] iv) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
SecretKey key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/CFB/PKCS5Padding");
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
byte[] result = cipher.doFinal(content);
return result;
}
public static byte[] AESDecrypt(byte[] content, byte[] keyBytes, byte[] iv) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
SecretKey key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/CFB/PKCS5Padding");
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
byte[] result = cipher.doFinal(content);
return result;
}
}
```
4. OFB模式(输出反馈模式)
OFB模式也是一种分组密码加密模式,它采用了输出反馈机制,将上一次加密的结果作为下一次加密的输入。在使用OFB模式时,同样的明文会因为不同的初始向量而加密成不同的密文,因此相对于ECB模式来说,OFB模式更加安全。
Java实现代码如下:
```
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class AESOFBUtil {
public static byte[] AESEncrypt(byte[] content, byte[] keyBytes, byte[] iv) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
SecretKey key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/OFB/PKCS5Padding");
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
byte[] result = cipher.doFinal(content);
return result;
}
public static byte[] AESDecrypt(byte[] content, byte[] keyBytes, byte[] iv) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
SecretKey key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/OFB/PKCS5Padding");
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
byte[] result = cipher.doFinal(content);
return result;
}
}
```
5. CTR模式(计数器模式)
CTR模式也是一种分组密码加密模式,它将明文分成若干块,每一块分别进行加密。在加密时,先生成一个计数器,将计数器与密钥进行加密得到密文,再将密文与明文进行异或操作得到最终的密文。在使用CTR模式时,同样的明文会因为不同的计数器而加密成不同的密文,因此相对于ECB模式来说,CTR模式更加安全。
Java实现代码如下:
```
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class AESCTRUtil {
public static byte[] AESEncrypt(byte[] content, byte[] keyBytes, byte[] iv) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
SecretKey key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding");
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
byte[] result = cipher.doFinal(content);
return result;
}
public static byte[] AESDecrypt(byte[] content, byte[] keyBytes, byte[] iv) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
SecretKey key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding");
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
byte[] result = cipher.doFinal(content);
return result;
}
}
```
以上就是Java实现AES加密的五种模式,希望能对你有所帮助。
阅读全文