/*** AES加密实现方法*/public static byte[] AESEncrypt(byte[] plainBytes, byte[] keyBytes, String keyAlgorithm, String cipherAlgorithm, String IV)throws Exception {try {// AES密钥长度为128bit、192bit、256bit,默认为128bitif (keyBytes.length % 8 != 0 || keyBytes.length < 16 || keyBytes.length > 32) {throw new Exception("AES密钥长度不合法");}Cipher cipher = Cipher.getInstance(cipherAlgorithm);SecretKey secretKey = new SecretKeySpec(keyBytes, keyAlgorithm);if (StringUtils.trimToNull(IV) != null) {IvParameterSpec ivspec = new IvParameterSpec(IV.getBytes());cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivspec);} else {cipher.init(Cipher.ENCRYPT_MODE, secretKey);}byte[] encryptedBytes = cipher.doFinal(plainBytes);return encryptedBytes;} catch (NoSuchAlgorithmException e) {throw new Exception(String.format("没有[%s]此类加密算法", cipherAlgorithm));} catch (NoSuchPaddingException e) {throw new Exception(String.format("没有[%s]此类填充模式", cipherAlgorithm));} catch (InvalidKeyException e) {System.out.println(e);throw new Exception("无效密钥");} catch (InvalidAlgorithmParameterException e) {throw new Exception("无效密钥参数");} catch (BadPaddingException e) {throw new Exception("错误填充模式");} catch (IllegalBlockSizeException e) {throw new Exception("加密块大小不合法");}}/*** AES解密实现方法*/public static byte[] AESDecrypt(byte[] encryptedBytes, byte[] keyBytes, String keyAlgorithm, String cipherAlgorithm, String IV)throws Exception {try {// AES密钥长度为128bit、192bit、256bit,默认为128bitif (keyBytes.length % 8 != 0 || keyBytes.length < 16 || keyBytes.length > 32) {throw new Exception("AES密钥长度不合法");}Cipher cipher = Cipher.getInstance(cipherAlgorithm);SecretKey secretKey = new SecretKeySpec(keyBytes, keyAlgorithm);if (IV != null && StringUtils.trimToNull(IV) != null) {IvParameterSpec ivspec = new IvParameterSpec(IV.getBytes());cipher.init(Cipher.DECRYPT_MODE, secretKey, ivspec);} else {cipher.init(Cipher.DECRYPT_MODE, secretKey);}byte[] decryptedBytes = cipher.doFinal(encryptedBytes);return decryptedBytes;} catch (NoSuchAlgorithmException e) {throw new Exception(String.format("没有[%s]此类加密算法", cipherAlgorithm));} catch (NoSuchPaddingException e) {throw new Exception(String.format("没有[%s]此类填充模式", cipherAlgorithm));} catch (InvalidKeyException e) {throw new Exception("无效密钥");} catch (InvalidAlgorithmParameterException e) {throw new Exception("无效密钥参数");} catch (BadPaddingException e) {throw new Exception("错误填充模式");} catch (IllegalBlockSizeException e) {throw new Exception("解密块大小不合法");}}/*** AES加密* @author zc-t208* @param param 需要加密的字符串* @return*/public static String AESEncodeParam(String param){if(StringUtils.isEmpty(param)){return null;}String encryptData = "";String strKey = sysConfigService.getAESStrKey().getConfigValue();try {byte[] base64encryptDataBytes = Base64.encodeBase64(AESEncrypt(param.getBytes("UTF-8"),strKey.getBytes("UTF-8"),"AES","AES/ECB/PKCS5Padding",null));encryptData = new String(base64encryptDataBytes, "UTF-8");} catch (UnsupportedEncodingException e) {log.info(e.getMessage());e.printStackTrace();} catch (Exception e) {log.info(e.getMessage());e.printStackTrace();}return encryptData;}/*** AES解密* @author zc-t208* @param param 需要解密的参数* @return*/public static String AESdecodeParam(String param){if(StringUtils.isEmpty(param)){return null;}String resData = "";String strKey = sysConfigService.getAESStrKey().getConfigValue();try {byte[] decodeBase64DataBytes = Base64.decodeBase64(param.getBytes("UTF-8"));byte[] merchantXmlDataBytes = AESDecrypt(decodeBase64DataBytes,strKey.getBytes("UTF-8"), "AES", "AES/ECB/PKCS5Padding", null);resData = new String(merchantXmlDataBytes,"UTF-8");} catch (UnsupportedEncodingException e) {log.info(e.getMessage());e.printStackTrace();} catch (Exception e) {log.info(e.getMessage());e.printStackTrace();}return resData;}



 /**
     * 获取AES秘钥方法
     * @param length
     * @return
     */
    public static String generateLenString(int length) {
        char[] cResult = new char[length];
        int[] flag = { 0, 0, 0 }; // A-Z, a-z, 0-9
        int i = 0;
        while (flag[0] == 0 || flag[1] == 0 || flag[2] == 0 || i < length) {
            i = i % length;
            int f = (int) (Math.random() * 3 % 3);
            if (f == 0)
                cResult[i] = (char) ('A' + Math.random() * 26);
            else if (f == 1)
                cResult[i] = (char) ('a' + Math.random() * 26);
            else
                cResult[i] = (char) ('0' + Math.random() * 10);
            flag[f] = 1;
            i++;
        }
        return new String(cResult);
    }
注意:加密秘钥为16位随机数字,并且加密和解密使用同一秘钥,加密后的参数想要传递,需要再进行一次加密后再传输
keyAlgorithm为"AES"
cipherAlgorithm为"AES/ECB/PKCS5Padding"

本博客为自己记录所做,如果有什么不对的地方,请多多指教




												

AES128加密解密以及参数的处理相关推荐

  1. AES128加密解密

    之前工作项目要求对文件数据要进行解密处理,而且必须是AES128算法,然后自己去找资料熟悉该算法和流程,以及具体怎么实现的.由于只能对16字节进行处理,所以我对文件进行拆分,将大文件拆为多个小文件,利 ...

  2. AES128加密/解密(单片机可用)

    通过网上代码进行修改,将输入输出缓冲区复用,降低内存消耗,使用需要注意的是,加密数据长度可以不是16字节整数倍,但是缓冲区必须是16字节整数倍,不足部分会自动补充0,解密数据长度必须是16的整数倍; ...

  3. AES-128加密解密方式(逐步更新)

    @AES-128加密解密方式 慢慢钻研也在慢慢更新 前言说一下,本人小白起步,断断续续的学习Python,慢慢的垒代码,持续学习中.部分内容,可能是直接找到网上内容来使用的,请大家勿喷,感谢. 由于最 ...

  4. java aes128加密解密_java AES 128 位加密解密算法

    最近在做app后台的服务器,使用到AES加密解密算法,无奈网上的都不符合要求,于是自己借鉴着写了一个AES加密解密工具. 密钥长度问题 默认 Java 中仅支持 128 位密钥,当使用 256 位密钥 ...

  5. AES128加密解密以及遇到的问题

    由于工作需求,需要对一个字符串进行加密与解密的操作,自己在网上查了一下,发现AES对称加密算法非常符合我的需求.它的简单思路就是事先设置一个秘钥(比如放在配置文件中),然后根据这个秘钥对字符串进行加密 ...

  6. android java加密_Android、iOS和Java通用的AES128加密解密示例代码

    前言 移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如android和iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输. 这篇文章给大家分享AES的加密和解密. ...

  7. ios java aes128_iOS AES128加密解密的两种模式(CBC和ECB)

    原理什么的不在本篇的范畴,网上很多大牛总结的很好了 请参考AES加密过程详解 1. 苹果默认是CBC模式的,有文档为证: /*! @enum CCOptions @abstract Options f ...

  8. 史上最全总结!爬虫常见加密解密算法

    文章目录 简介 JavaScript 加密解密模块 Crypto-JS Node-RSA JSEncrypt Python 加密解密库 Cryptodome & Crypto Hashlib ...

  9. 【Python网络爬虫】爬虫常见加密解密算法

    ](https://img2020.cnblogs.com/blog/2501174/202108/2501174-20210816091906408-1932195692.png) 简介# 本文总结 ...

最新文章

  1. [delphi]参数带有默认值的函数
  2. 数据的存入取出(注册机方式)
  3. 008_Input输入框
  4. Android中的约束布局
  5. Flowable工作流入门
  6. 51单片机io位与 c语言,【51单片机】普通I/O口模拟SPI口C语言程序
  7. delphi 解析一维条码_科普帖:一般商用条码扫描器全知道,只需三把枪
  8. BIO、伪异步 IO、AIO和NIO
  9. Apache Struts 2的命名空间实战
  10. Spring的 @ExceptionHandler注解无效问题
  11. 身体排毒,自己就可以轻松搞定 - 生活至上,美容至尚!
  12. 一、最简单的爬虫(python3 爬虫小白系列文章)
  13. 嵌入式系统的软件组成
  14. Office Open XML 的测量单位
  15. Graham Scan算法
  16. 1626:Hankson 的趣味题
  17. Linux 虚拟内存和物理内存的理解(转)
  18. 西安计算机软件行业薪水,西安今夏求职平均薪酬为每月8295元 这两个行业竞争最激烈...
  19. C# Get和Post
  20. 在线制作webp格式的图片

热门文章

  1. Android弧形SeekBar的设计与实现
  2. javascript sha512算法 加密
  3. 卓克-二维码破损了还能扫出来是怎么回事?
  4. DMVPN 动态多点隧道技术
  5. Java实现键盘输入
  6. No enclosing instance of type xxx is accessible
  7. 哪个AI绘画软件好用?接着看下去吧我告诉你
  8. Spark底层原理详细解析
  9. licode安装使用
  10. 马不停蹄的错过,轻而易举的辜负,不知不觉的陌路