Skip to content

Commit 5691161

Browse files
committed
aes
1 parent 4b7db6e commit 5691161

File tree

2 files changed

+73
-24
lines changed

2 files changed

+73
-24
lines changed

class/src/main/java/security/aes/AESUtil.java

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
11
package security.aes;
22

3-
import javax.crypto.BadPaddingException;
4-
import javax.crypto.Cipher;
5-
import javax.crypto.IllegalBlockSizeException;
6-
import javax.crypto.KeyGenerator;
7-
import javax.crypto.NoSuchPaddingException;
8-
import javax.crypto.SealedObject;
9-
import javax.crypto.SecretKey;
10-
import javax.crypto.SecretKeyFactory;
3+
import javax.crypto.*;
114
import javax.crypto.spec.IvParameterSpec;
125
import javax.crypto.spec.PBEKeySpec;
136
import javax.crypto.spec.SecretKeySpec;
@@ -16,6 +9,7 @@
169
import java.io.FileOutputStream;
1710
import java.io.IOException;
1811
import java.io.Serializable;
12+
import java.nio.charset.StandardCharsets;
1913
import java.security.InvalidAlgorithmParameterException;
2014
import java.security.InvalidKeyException;
2115
import java.security.NoSuchAlgorithmException;
@@ -45,9 +39,9 @@ public static String decrypt(String algorithm, String cipherText, SecretKey key,
4539
}
4640

4741
/**
48-
* @see com.sun.crypto.provider.AESCrypt#isKeySizeValid 16 24 32 字节
42+
* @see com.sun.crypto.provider.AESCrypt#isKeySizeValid 16 24 32 字节
4943
*/
50-
public static SecretKey generateKey(int bit) throws NoSuchAlgorithmException {
44+
public static SecretKey randomKey(int bit) throws NoSuchAlgorithmException {
5145
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
5246
keyGenerator.init(bit);
5347
return keyGenerator.generateKey();
@@ -162,4 +156,46 @@ public static String decryptPasswordBased(String cipherText, SecretKey key, IvPa
162156
return new String(cipher.doFinal(Base64.getDecoder().decode(cipherText)));
163157
}
164158

159+
public static String encryptPass(String text, String passwd, String salt, String iv) throws Exception {
160+
return AESUtil.encryptPasswordBased(text, AESUtil.getKeyFromPassword(passwd, salt), AESUtil.generateIv(iv));
161+
}
162+
163+
public static String decryptPass(String text, String passwd, String salt, String iv) throws Exception {
164+
return AESUtil.decryptPasswordBased(text, AESUtil.getKeyFromPassword(passwd, salt), AESUtil.generateIv(iv));
165+
}
166+
167+
168+
// 密钥长度(AES支持128、192、256位)
169+
private static final int KEY_SIZE = 256;
170+
171+
// 固定IV 0值
172+
private static final byte[] FIXED_IV = new byte[16]; // AES块大小为16字节
173+
174+
// 将字符串密钥转换为SecretKeySpec
175+
176+
/**
177+
* @param key 字符串长度对应 KEY_SIZE 长度/8
178+
*/
179+
public static SecretKeySpec generateKey(String key) throws Exception {
180+
byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);
181+
byte[] keyArray = new byte[KEY_SIZE / 8];
182+
System.arraycopy(keyBytes, 0, keyArray, 0, Math.min(keyBytes.length, keyArray.length));
183+
return new SecretKeySpec(keyArray, "AES");
184+
}
185+
186+
// 加密方法
187+
public static String encrypt(String plainText, SecretKeySpec key) throws Exception {
188+
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
189+
cipher.init(Cipher.ENCRYPT_MODE, key, new javax.crypto.spec.IvParameterSpec(FIXED_IV));
190+
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
191+
return Base64.getEncoder().encodeToString(encryptedBytes);
192+
}
193+
194+
// 解密方法
195+
public static String decrypt(String encryptedText, SecretKeySpec key) throws Exception {
196+
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
197+
cipher.init(Cipher.DECRYPT_MODE, key, new javax.crypto.spec.IvParameterSpec(FIXED_IV));
198+
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
199+
return new String(decryptedBytes, StandardCharsets.UTF_8);
200+
}
165201
}

class/src/test/java/security/aes/AESUtilTest.java

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public void testStringEncrypt() throws Exception {
3131
new SecureRandom().nextBytes(var2);
3232
new SecretKeySpec(var2, "AES");
3333

34-
SecretKey key = AESUtil.generateKey(128);
34+
SecretKey key = AESUtil.randomKey(128);
3535
final String base64 = AESUtil.generateIvByte();
3636

3737
// 固定iv密钥
@@ -49,10 +49,11 @@ public void testStringEncrypt() throws Exception {
4949
Assert.assertEquals(input, plainText);
5050
}
5151

52+
5253
@Test
5354
public void testGivenFile_whenEncrypt_thenSuccess() throws Exception {
5455
// given
55-
SecretKey key = AESUtil.generateKey(128);
56+
SecretKey key = AESUtil.randomKey(128);
5657
String algorithm = "AES/CBC/PKCS5Padding";
5758
IvParameterSpec ivParameterSpec = AESUtil.generateIv();
5859
Path originPath = Paths.get("src/test/resources/origin.txt");
@@ -79,7 +80,7 @@ public void testGivenFile_whenEncrypt_thenSuccess() throws Exception {
7980
public void givenObject_whenEncrypt_thenSuccess() throws Exception {
8081
// given
8182
Student student = new Student("Baeldung", 20);
82-
SecretKey key = AESUtil.generateKey(128);
83+
SecretKey key = AESUtil.randomKey(128);
8384
IvParameterSpec ivParameterSpec = AESUtil.generateIv();
8485
String algorithm = "AES/CBC/PKCS5Padding";
8586

@@ -116,23 +117,35 @@ public void givenPassword_whenEncrypt_thenSuccess() throws Exception {
116117

117118
@Test
118119
public void testConfigWay() throws Exception {
119-
String plainText = "www.baeldung.com";
120+
String plainText = "" + System.currentTimeMillis();
120121
String password = "baeldung";
121122
String salt = "12345678";
122-
final String iv = AESUtil.generateIvByte();
123-
log.info("iv={}", iv);
124-
final String result = encryptPass(plainText, password, salt, iv);
125-
final String origin = decryptPass(result, password, salt, iv);
123+
// final String iv = AESUtil.generateIvByte();
124+
String iv = "D+OER4Pzbc+CtaXeVKlTEQ==";
125+
log.info("iv [{}] salt [{}]", iv, salt);
126+
// 即使固定了iv 初始化向量,在跨系统传输仍需要双方约定三个 变量比较麻烦
127+
final String result = AESUtil.encryptPass(plainText, password, salt, iv);
128+
final String origin = AESUtil.decryptPass(result, password, salt, iv);
129+
log.info("{} {}", result, origin);
126130

127131
Assert.assertEquals(origin, plainText);
128-
129132
}
130133

131-
public String encryptPass(String text, String passwd, String salt, String iv) throws Exception {
132-
return AESUtil.encryptPasswordBased(text, AESUtil.getKeyFromPassword(passwd, salt), AESUtil.generateIv(iv));
134+
@Test
135+
public void testSimple() throws Exception {
136+
try {
137+
String key = "b423eb489f47dbe933f7e761946ec216";
138+
SecretKeySpec secretKey = AESUtil.generateKey(key);
139+
140+
String plainText = "Hello, AES Encryption!";
141+
String encryptedText = AESUtil.encrypt(plainText, secretKey);
142+
System.out.println("加密后的密文 (Base64): " + encryptedText);
143+
144+
String decryptedText = AESUtil.decrypt(encryptedText, secretKey);
145+
System.out.println("解密后的明文: " + decryptedText);
146+
} catch (Exception e) {
147+
log.error("", e);
148+
}
133149
}
134150

135-
public String decryptPass(String text, String passwd, String salt, String iv) throws Exception {
136-
return AESUtil.decryptPasswordBased(text, AESUtil.getKeyFromPassword(passwd, salt), AESUtil.generateIv(iv));
137-
}
138151
}

0 commit comments

Comments
 (0)