New file |
| | |
| | | package com.dy.pipIrrWechat.util; |
| | | |
| | | import javax.crypto.Cipher; |
| | | import javax.crypto.NoSuchPaddingException; |
| | | import javax.crypto.spec.GCMParameterSpec; |
| | | import javax.crypto.spec.SecretKeySpec; |
| | | import java.io.IOException; |
| | | import java.security.GeneralSecurityException; |
| | | import java.security.InvalidAlgorithmParameterException; |
| | | import java.security.InvalidKeyException; |
| | | import java.security.NoSuchAlgorithmException; |
| | | import java.util.Base64; |
| | | |
| | | /** |
| | | * @author ZhuBaoMin |
| | | * @date 2024-07-15 10:18 |
| | | * @LastEditTime 2024-07-15 10:18 |
| | | * @Description |
| | | */ |
| | | public class AesUtil { |
| | | static final int KEY_LENGTH_BYTE = 32; |
| | | static final int TAG_LENGTH_BIT = 128; |
| | | |
| | | /** |
| | | * 解密 |
| | | * @param apiV3Key apiV3密钥 |
| | | * @param associatedData 附加数据 |
| | | * @param nonce 随机串 |
| | | * @param ciphertext 数据密文 |
| | | * @return 解密后字符串 |
| | | * @throws GeneralSecurityException |
| | | * @throws IOException |
| | | */ |
| | | public static String decryptToString(byte[] apiV3Key, byte[] associatedData, byte[] nonce, String ciphertext) throws GeneralSecurityException, IOException { |
| | | try { |
| | | Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); |
| | | SecretKeySpec key = new SecretKeySpec(apiV3Key, "AES"); |
| | | GCMParameterSpec spec = new GCMParameterSpec(TAG_LENGTH_BIT, nonce); |
| | | |
| | | cipher.init(Cipher.DECRYPT_MODE, key, spec); |
| | | cipher.updateAAD(associatedData); |
| | | |
| | | return new String(cipher.doFinal(Base64.getDecoder().decode(ciphertext)), "utf-8"); |
| | | } catch (NoSuchAlgorithmException | NoSuchPaddingException e) { |
| | | throw new IllegalStateException(e); |
| | | } catch (InvalidKeyException | InvalidAlgorithmParameterException e) { |
| | | throw new IllegalArgumentException(e); |
| | | } |
| | | } |
| | | } |