1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
@Service public class AESCryptoService {
private static final String ALGORITHM = "AES"; private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding"; private static final String CHARSET = "UTF-8";
@Autowired private KeyManagementService keyManagementService;
public String encrypt(String plainText, String keyId) { try { SecretKey secretKey = keyManagementService.getSecretKey(keyId);
Cipher cipher = Cipher.getInstance(TRANSFORMATION); cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(CHARSET));
byte[] iv = cipher.getIV();
byte[] combined = new byte[iv.length + encryptedBytes.length]; System.arraycopy(iv, 0, combined, 0, iv.length); System.arraycopy(encryptedBytes, 0, combined, iv.length, encryptedBytes.length);
return Base64.getEncoder().encodeToString(combined);
} catch (Exception e) { log.error("AES加密失败", e); throw new CryptoException("AES加密失败", e); } }
public String decrypt(String encryptedText, String keyId) { try { SecretKey secretKey = keyManagementService.getSecretKey(keyId);
byte[] combined = Base64.getDecoder().decode(encryptedText);
byte[] iv = new byte[16]; byte[] encryptedBytes = new byte[combined.length - 16]; System.arraycopy(combined, 0, iv, 0, 16); System.arraycopy(combined, 16, encryptedBytes, 0, encryptedBytes.length);
Cipher cipher = Cipher.getInstance(TRANSFORMATION); IvParameterSpec ivSpec = new IvParameterSpec(iv); cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec);
byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
return new String(decryptedBytes, CHARSET);
} catch (Exception e) { log.error("AES解密失败", e); throw new CryptoException("AES解密失败", e); } }
public Map<String, String> batchEncrypt(Map<String, String> plainTexts, String keyId) { Map<String, String> encryptedTexts = new HashMap<>();
for (Map.Entry<String, String> entry : plainTexts.entrySet()) { try { String encrypted = encrypt(entry.getValue(), keyId); encryptedTexts.put(entry.getKey(), encrypted); } catch (Exception e) { log.error("批量加密失败: {}", entry.getKey(), e); encryptedTexts.put(entry.getKey(), null); } }
return encryptedTexts; }
public Map<String, String> batchDecrypt(Map<String, String> encryptedTexts, String keyId) { Map<String, String> plainTexts = new HashMap<>();
for (Map.Entry<String, String> entry : encryptedTexts.entrySet()) { try { String decrypted = decrypt(entry.getValue(), keyId); plainTexts.put(entry.getKey(), decrypted); } catch (Exception e) { log.error("批量解密失败: {}", entry.getKey(), e); plainTexts.put(entry.getKey(), null); } }
return plainTexts; }
public String generateRandomKey() { try { KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM); keyGenerator.init(256); SecretKey secretKey = keyGenerator.generateKey(); return Base64.getEncoder().encodeToString(secretKey.getEncoded()); } catch (Exception e) { log.error("生成随机密钥失败", e); throw new CryptoException("生成随机密钥失败", e); } } }
|