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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何升级PIP命令

    如何升级PIP命令1、首先使用pipshowpip命令查看当前pip版本;2、升级命令:python-mpipinstall–upgradepip;3、验证升级成功,再次使用pipshowpip命令查看pip版本。

    2022年6月11日
    174
  • MATLAB中画折线图:plot函数的简单用法

    MATLAB中画折线图:plot函数的简单用法使用plot绘制二维图像MATLAB中plot函数常常被用于绘制各种二维图像,其用法也是多种多样,本文仅介绍plot函数的基本用法——使用plot函数绘制二维点图和线图。plot函数的一般调用形式如下:plot(X,Y,LineSpec)其中X由所有输入点坐标的x值组成,Y是由与X中包含的x对应的y所组成的向量。LineSpec是用户指定的绘图样式,主要选项如下:Specif…

    2022年6月9日
    40
  • Springboot引入本地jar包,并通过maven把项目成功打包成jar包部署[通俗易懂]

    Springboot引入本地jar包,并通过maven把项目成功打包成jar包部署[通俗易懂]引入钉钉的sdk打包到线上,各种报错:ClassNofFoundException…第一步:将jar包放到resource的lib文件夹下:第二部:在pom文件中引入:第三部:继续修改pom文件的打包插件配置:<includeSystemScope>true</includeSystemScope>打包时候IDEA还是会报警告,不用管它;…

    2022年6月29日
    23
  • 《LaTeX教程》

    《LaTeX教程》一位小仙女分享给我的LaTeX排版教程书,本人感觉特别好用。人生最快乐的事就是分享你的快乐给别人。独乐不如众乐,愿你我都有所获。链接:https://pan.baidu.com/s/1IkRzLz-Vmt5uL5TksX1lxg提取码:v9ag(“Ifyouhavegreattalents,industrywillimprovethem;ifyouhavebutm…

    2022年7月16日
    12
  • Springboot+Seata整合以及事务模式分析

    Springboot+Seata整合以及事务模式分析分布式事务一、分布式事务的组成部分事务参与者:对应的一个一个的微服务资源服务器:对应一个个微服务的数据库事务管理器:决策各个事务参与者的提交和回滚两阶段提交:准备阶段:向事务管理器向事务参与者发送预备请求,事务参与者在写本地的redo和undo日志,但是不提交,并且返回准备就绪的信息,最后提交的动作交给第二阶段来进行提交阶段:如果事务协调者收到失败或者超时的信息,直接给每个参与者发送回滚消息;否则提交消息,最后根据协调者的指令释放所有事务处理过程中使用的资源锁二、项目例子当前依赖,

    2022年9月19日
    2
  • mysql主从读写分离配置(阿里云数据库主从读写分离)

    一、MySQL主备的基本原理在状态1中,客户端的读写都直接访问节点A,而节点B是A的备库,只是将A的更新都同步过来,到本地执行。这样可以保持节点B和A的数据是相同的。当需要切换的时候,就切成状态2。这时候客户端读写访问的都是节点B,而节点A是B的备库在状态1中,虽然节点B没有被直接访问,但是建议把备库节点B,设置成只读模式。有以下几个原因:1.有时候一些运营类的查询语句会被放到备库上去查,…

    2022年4月10日
    71

发表回复

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

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