首页 > 其他分享 >使用AES进行加解密

使用AES进行加解密

时间:2024-03-20 11:29:04浏览次数:25  
标签:AES return String 加解密 iv 使用 import workKey

今天来使用aes对sk(一个字段)进行加解密,要求秘钥一半在配置文件,一般写死

aes就是一个加解密的工具,有加密和解密二个方法,是可逆的

package com.huawei.koophone.openpower.common.utils.algo;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Hex;

import javax.crypto.*;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.AlgorithmParameterSpec;

/**
 * AES/GCM/NoPadding工具类
 *
 * @author zhouhaofeng
 * @version 2022/9/26 0026
 * @see [相关类/方法]
 * @since [ai-file-processor]
 */
@Slf4j
public class AESUtil
{
   private AESUtil ()
   {
   }

   private static final String AES = "AES";
   private static final String ALGORITHM = "AES/GCM/NoPadding";
   private static final Integer IV_SIZE = 16;

   /**
    * AES/GCM/NoPadding 加密
    *
    * @param data    待加密的数据
    * @param workKey 工作密钥
    * @return 加密后的字符串
    */
   public static String encrypt (String data, String workKey)
   {
      try
      {
         SecureRandom sr = SecureRandom.getInstance ("SHA1PRNG");
         byte[] iv = new byte[IV_SIZE];
         sr.nextBytes (iv);

         Cipher cipher = Cipher.getInstance (ALGORITHM);
         SecretKey secretKey = new SecretKeySpec (workKey.getBytes (), AES);
         //128 bit auth tag length
         AlgorithmParameterSpec parameterSpec = new GCMParameterSpec (128, iv);
         cipher.init (Cipher.ENCRYPT_MODE, secretKey, parameterSpec);

         byte[] cipherText = cipher.doFinal (data.getBytes (StandardCharsets.UTF_8));
         ByteBuffer byteBuffer = ByteBuffer.allocate (iv.length + cipherText.length);
         byteBuffer.put (iv);
         byteBuffer.put (cipherText);
         return Hex.encodeHexString (byteBuffer.array ());
      }
      catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException |
            InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException e)
      {
         log.error ("AES failed to encrypt: ", e);
      }
      return null;
   }

   /**
    * AES/GCM/NoPadding解密
    *
    * @param encrypted 加密后的密码敏文
    * @param workKey   工作秘钥
    * @return 解密后的字节数组
    */
   public static String decryptEnd (String encrypted, String workKey)
   {
      //截取iv向量
      String ivStr = encrypted.substring (0, 32);
      //截取真正的密文
      String encodeSource = encrypted.substring (32);
      byte[] result;
      try
      {
         result = decrypt (encodeSource, Hex.decodeHex (ivStr), workKey, ALGORITHM);
         if (result == null)
         {
            return null;
         }
      }
      catch (DecoderException e)
      {
         log.error ("AES failed to decryptEnd: ", e);
         return null;
      }
      return new String (result, StandardCharsets.UTF_8);
   }

   /**
    * @param source    密文
    * @param iv        vi12进制数组
    * @param workKey   工作秘钥
    * @param algorithm 算法 如:AES/GCM/NoPadding
    * @return 解密后的字节数组
    */
   public static byte[] decrypt (String source, byte[] iv, String workKey, String algorithm)
   {
      try
      {
         SecretKeySpec skey = new SecretKeySpec (workKey.getBytes (), AES);
         Cipher cipher = Cipher.getInstance (algorithm);
         GCMParameterSpec ivP = new GCMParameterSpec (128, iv);
         cipher.init (Cipher.DECRYPT_MODE, skey, ivP);
         return cipher.doFinal (Hex.decodeHex (source));
      }
      catch (BadPaddingException | IllegalBlockSizeException | NoSuchAlgorithmException | NoSuchPaddingException |
            InvalidAlgorithmParameterException | InvalidKeyException | DecoderException e)
      {
         log.error ("AES failed to decrypt: ", e);
      }
      return new byte[0];
   }
}

首先给大家来一个工具类,其中的密钥字段不得超过 private static final Integer IV_SIZE = 16;

然后我们需要去创建一个密钥

这里一半在配置类里边,一半写死在我需要调用的地方

也就是说这个密钥是

+

接着我们就可以调用方法了

 

标签:AES,return,String,加解密,iv,使用,import,workKey
From: https://blog.csdn.net/2201_75470170/article/details/136863407

相关文章

  • Python配置文件使用教程
    在Python应用程序开发过程中,配置文件扮演着重要的角色。配置文件可以用来存储应用程序的各种设置、选项和参数,使得程序更加灵活和可配置。本文将介绍Python中如何使用配置文件,并提供一些常见的配置文件处理方法。一、配置文件格式常见的配置文件格式有多种,包括INI格式、J......
  • Python配置文件使用教程
    在Python应用程序开发过程中,配置文件扮演着重要的角色。配置文件可以用来存储应用程序的各种设置、选项和参数,使得程序更加灵活和可配置。本文将介绍Python中如何使用配置文件,并提供一些常见的配置文件处理方法。一、配置文件格式常见的配置文件格式有多种,包括INI格式、JS......
  • postcss-px2rem 的使用
    两种方法:1、不改变第三方组件的样式第一步先卸载安装的postcss-px2remnpmuninstallpostcss-px2rem安装postcss-px2rem-excludenpmipostcss-px2rem-exclude--save第二步在项目根目录下面建立postcss.config.js文件 module.exports={plugins:{......
  • Android JNI学习-使用第三方SO库
    https://david1840.github.io/2018/12/03/Android-JNI学习-使用第三方SO库/CMakeList.txt在CMake中将LibTest.so导入工程cmake_minimum_required(VERSION3.4.1)add_library(#Setsthenameofthelibrary.UseSo#Setsthelibraryasasha......
  • 深入理解Java双冒号(::)运算符的使用
    Jdk8中有好多新的特性,比如引入Lambda,简化代码的书写等等我们先看一个关于Lambda的使用 /***输出list*/@Testpublicvoidtest(){String[]array={"aaaa","bbbb","cccc"};List<String>list=Arrays.asList(array);//Java7for(......
  • C# 中使对象序列化/反序列化 Json 支持使用派生类型以及泛型的方式
    C#中使对象序列化/反序列化Json支持使用派生类型以及泛型方式废话#前言#为啥想写这个博客最近自己写的框架有用到这个类似工作流,支持节点编码自定义,动态运行自定义.尽量减少动态解析这就需要确定类型.有什么好的奇思妙想可以一起来讨论噢(现在还是毛坯,测......
  • Vue3 Slot—插槽全家桶使用详解
    插槽是什么插槽slot就是子组件中提供给父组件使用的一个占位符,用<slot></slot>表示,父组件可以给这个占位符内填充任何模板代码,填充的内容会自动替换<slot></slot>标签。插槽被分为三种:匿名插槽、具名插槽、作用域插槽。1、匿名插槽没有名字的插槽就是匿名插槽,组件可以放......
  • Android使用MediaRecorder进行录像,暂停和继续录像的VideoUtils
    使用MediaRecorder进行录像,要注意再设置MediaRecorder的参数的时候设置,这里也是查了网上很多代码都没有一个完整能实现的,或多或少都有点问题。还有再暂停/继续录制的时候要注意将Camera的预览关闭camera.stopPreview()不然预览的界面还是会继续动给人暂停了还在录制的错觉。还有......
  • Windows Server 2022 上进行域操作需要使用一些命令和工具来管理域、用户、计算机等
    WindowsServer2022上进行域操作需要使用一些命令和工具来管理域、用户、计算机等。以下是一些常用的WindowsServer2022上域操作的命令:添加计算机到域:将计算机添加到域的命令为:Add-Computer-DomainNameyour_domain-Credentialyour_credentials列出域中的计算机......
  • Windows Server 2022 中使用 PowerShell 5.1 进行域管理时,您可以使用一些命令来执行各
    WindowsServer2022中使用PowerShell5.1进行域管理时,您可以使用一些命令来执行各种操作。以下是一些命令:创建新用户:powershellCopyCodeNew-ADUser-Name"JohnDoe"-SamAccountName"johndoe"-AccountPassword(ConvertTo-SecureString"P@ssw0rd"-AsPlainText-Fo......