Java.Utils:AES-128-CBC 加密方式

packagecom.boob.common.utils;importorg.apache.commons.codec.binary.Base64;importorg.bouncycastle.jce.provider.BouncyCastleProvider;importjavax.crypto.BadPaddingException;importjavax.crypto….

大家好,又见面了,我是你们的朋友全栈君。

Don’t say much, just go to the code.

Maven

<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk16 -->
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk16</artifactId>
    <version>1.46</version>
</dependency>
package org.bood.common.utils;

import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.*;
import java.security.spec.InvalidParameterSpecException;

/** * AES-128-CBC 加密方式 </br> * 注:</br> * AES-128-CBC 可以自己定义“密钥”和“偏移量“。</br> * AES-128 是 jdk 自动生成的“密钥”。</br> * * @author bood * @since 2020/10/16 */
public class AesCbcUtils { 
   

    private AesCbcUtils() { 
   
    }

    static { 
   
        // BouncyCastle是一个开源的加解密解决方案
        Security.addProvider(new BouncyCastleProvider());
    }

    /** * <p> * AES 解密 * </p> * * @param data: 密文,被加密的数据 * @param key: 秘钥 * @param iv: 偏移量 * @param encodingFormat: 解密后的结果需要进行的编码 * @return:java.lang.String * @author:bood * @date:2020/10/16 */
    public static String decrypt(String data, String key, String iv, String encodingFormat) throws Exception { 
   
        // 被加密的数据
        byte[] dataByte = Base64.decodeBase64(data);
        // 加密秘钥
        byte[] keyByte = Base64.decodeBase64(key);
        // 偏移量
        byte[] ivByte = Base64.decodeBase64(iv);
        try { 
   
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
            SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
            AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
            parameters.init(new IvParameterSpec(ivByte));
            // 初始化
            cipher.init(Cipher.DECRYPT_MODE, spec, parameters);
            byte[] resultByte = cipher.doFinal(dataByte);
            if (null != resultByte && resultByte.length > 0) { 
   
                String result = new String(resultByte, encodingFormat);
                return result;
            }
            return null;
        } catch (NoSuchAlgorithmException e) { 
   
            e.printStackTrace();
        } catch (NoSuchPaddingException e) { 
   
            e.printStackTrace();
        } catch (InvalidParameterSpecException e) { 
   
            e.printStackTrace();
        } catch (InvalidKeyException e) { 
   
            e.printStackTrace();
        } catch (InvalidAlgorithmParameterException e) { 
   
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) { 
   
            e.printStackTrace();
        } catch (BadPaddingException e) { 
   
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) { 
   
            e.printStackTrace();
        }
        return null;
    }

}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/127712.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • html5中的空格怎么写,空格的代码(【html5空格代码怎么写】)「建议收藏」

    html5中的空格怎么写,空格的代码(【html5空格代码怎么写】)「建议收藏」空格的代码(【html5空格代码怎么写】),哪吒游戏网给大家带来详细的空格的代码(【html5空格代码怎么写】)介绍,大家可以阅读一下,希望这篇空格的代码(【html5空格代码怎么写】)可以给你带来参考价值。6.不要应用with,void,eval。每行释注的释注符后要加一个空格后才写解注,如://MynameisCKJ.1.单行释注:用“//”标注,注意免避无意义的释注。2….

    2022年9月22日
    3
  • 手机扫码登录实现原理「建议收藏」

    扫码登录原理最近接到一个需求,要求我用手机扫码实现用户登录,这是近几年比较流行的登录方式。这样确实是实现用户体验至上,操作简单,方便实用。拿到需求之后,我与后端大哥商量后,敲定了具体的实施方案。其实重要的还是要弄懂他实现的原理。需求:用户至上的体验效果,手机扫码同步登录状态很多企业在开发自己app的同时会推出网页版,为了登录更方便、更安全。企业会选用手机扫一扫,实现用户登录。神奇的是。为什么…

    2022年4月18日
    264
  • PyTorch中的转置卷积详解——全网最细

    PyTorch中的转置卷积详解——全网最细前言转置卷积,学名transposedconvolution,在tf和torch里都叫这个。有时在论文里可以看到别人叫它deconvolution(反卷积),但这个名词不合适。因为转置卷积并非directconvolution的逆运算(reverse),并不能还原出原张量。只是从形状上看,其结果的形状等同于逆运算。写这篇文章还是因为网上介绍转置卷积的博客,都讲不清楚,我看了半天还是云里雾里。只能自己手动来一篇了。一、基本运算——错位扫描定义本文中,我们将平时用到的普通卷积,称为dir

    2022年6月21日
    37
  • docker导出容器为镜像_docker如何将容器打包成镜像

    docker导出容器为镜像_docker如何将容器打包成镜像1、docker镜像、容器导出方式dockersave#IDor#Namedockerexport#IDor#Name2、save和export区别(1)、对于DockerSave方法,会保存该镜像的所有历史记录(2)、对于DockerExport方法,不会保留历史记录,即没有commit历史(3)、dockersave保存的是镜像(image),dockerexport保存的是容器(container);(4)、dockerload用来载入镜像包,dock

    2025年9月18日
    5
  • J2EE项目系列(三)–Spring Data JPA+Spring+SpringMVC+Maven快速开发(1)项目架构

    J2EE项目系列(三)–Spring Data JPA+Spring+SpringMVC+Maven快速开发(1)项目架构好久没给大家弄Java后端项目系列了,因为接了Java后端外包以及学习一些后端优化的东西。而现在开始慢慢在这个系列的(三)逐渐把后端外包的一些有价值的东西分享给大家,并且自己也总结一遍嘛。本博客是这个系列的第一篇,所以先讲下项目架构。另外,这个系列还有一些我在外包项目过程中做的优化,七牛云,云旺IM等使用,以及解决一些小bug等等技巧。

    2022年6月6日
    36
  • MySQL 分区表

    MySQL 分区表

    2021年9月11日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号