java | 使用Cipher类实现AES所有常用加密模式

这篇具有很好参考价值的文章主要介绍了java | 使用Cipher类实现AES所有常用加密模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.先看下介绍

AES 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES(Data Encryption Standard),已经被多方分析且广为全世界所使用。

AES 是对称加密算法,优点:加密速度快;缺点:如果秘钥丢失,就容易解密密文,安全性相对比较差
对称加密 : 也就是加密秘钥和解密秘钥是一样的。
非对称加密 : 也就是加密秘钥和解密秘钥是不一样的。

2.废话不多说,直接上代码

2.1 自己定义的一个类,参数是AES加密模式,方便调用
    public static final String AESCBCNoPadding = "AES/CBC/NoPadding";
    public static final String AESCBCPKCS5Padding = "AES/CBC/PKCS5Padding(";
    public static final String AESECBNoPadding = "AES/ECB/NoPadding";
    public static final String AESECBPKCS5Padding = "AES/ECB/PKCS5Padding";
    public static final String DESCBCNoPadding = "DES/CBC/NoPadding";
    public static final String DESCBCPKCS5Padding = "DES/CBC/PKCS5Padding";
    public static final String DESECBNoPadding = "DES/ECB/NoPadding";
    public static final String DESECBPKCS5Padding = "DES/ECB/PKCS5Padding";
    public static final String DESedeCBCNoPadding = "DESede/CBC/NoPadding";
    public static final String DESedeCBCPKCS5Padding = "DESede/CBC/PKCS5Padding";
    public static final String DESedeECBNoPadding = "DESede/ECB/NoPadding";
    public static final String DESedeECBPKCS5Padding = "DESede/ECB/PKCS5Padding";
    public static final String RSAECBPKCS1Padding = "RSA/ECB/PKCS1Padding";
    public static final String RSAECBOAEPWithSHA_1AndMGF1Padding = "RSA/ECB/OAEPWithSHA-1AndMGF1Padding";
    public static final String RSAECBOAEPWithSHA_256AndMGF1Padding = "RSA/ECB/OAEPWithSHA-256AndMGF1Padding";

2.2 由于aes加密后的字节数组,直接转String返回参数有可能存在乱码,所以对返回值做一下处理,将加密的结果转换为base64的字符串。同理,解密时候,需要把字符串先base64处理,再把解密后的内容进行aes解密操作。
也就是说流程为:
加密(从前往后):明文 -> 加密 -> base64处理 -> 密文
解密(从后往前):明文 <- 解密 <- base64处理 <- 密文

/**
     * @param data 明文
     * @param key  密钥,长度16
     * @param iv   偏移量,长度16
     * @return 密文
     * @Description AES算法加密明文
     */
    public static String AesEncrypt(String data, String key, String iv) {
        try {
        	//AES/CBC/NoPadding
            Cipher cipher = Cipher.getInstance(AESEnum.AESCBCNoPadding);
            int blockSize = cipher.getBlockSize();
            byte[] dataBytes = data.getBytes();
            int plaintextLength = dataBytes.length;
            if (plaintextLength % blockSize != 0) {
                plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
            }
            byte[] plaintext = new byte[plaintextLength];
            System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);
            SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
            // CBC模式,需要一个向量iv,可增加加密算法的强度
            IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());  
            cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
            byte[] encrypted = cipher.doFinal(plaintext);
            // 加密后直接转string可能乱码,用BASE64做转码。
            return encode(encrypted).trim(); 
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * @param data 密文
     * @param key  密钥,长度16
     * @param iv   偏移量,长度16
     * @return 明文
     * @Description AES算法解密
     */
    public static String AesDecrypt(String data, String key, String iv) {
        try {
        	//先用base64解密
            byte[] encrypted1 = decode(data);
            //AES/CBC/NoPadding 
            Cipher cipher = Cipher.getInstance(AESEnum.AESCBCNoPadding);
            SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
            IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
            cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
            byte[] original = cipher.doFinal(encrypted1);
            String originalString = new String(original);
            return originalString.trim();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 编码
     *
     * @param byteArray
     * @return
     */
    public static String encode(byte[] byteArray) {
        return new String(new org.apache.commons.codec.binary.Base64().encode(byteArray));
    }

    /**
     * 解码
     *
     * @param base64EncodedString
     * @return
     */
    public static byte[] decode(String base64EncodedString) {
        return new org.apache.commons.codec.binary.Base64().decode(base64EncodedString);
    }

用到的依赖

		<!--常用的加密解密方法-->
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.15</version>
        </dependency>

测试结果:
没一点问题滴
java cipher,java,java,开发语言,爬虫,web安全文章来源地址https://www.toymoban.com/news/detail-636303.html

到了这里,关于java | 使用Cipher类实现AES所有常用加密模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java实现AES加密工具类 - 简单易用的数据加密解决方案

    当我们涉及到敏感数据的存储和传输时,数据加密是非常重要的。加密可以确保数据的保密性和完整性,并帮助我们防止数据泄露和攻击。在Java中,使用标准的加密算法和库可以很容易地实现数据加密和解密。本篇文章将介绍一个简单的Java工具类,该工具类使用AES对称加密

    2024年02月11日
    浏览(45)
  • Java:SpringBoot使用AES对JSON数据加密和解密

    客户端和服务端都可以加密和解密,使用base64进行网络传输 加密方 解密方 2.1、项目结构 2.2、常规业务代码 pom.xml Application.java WebMvcConfig.java CrossConfig.java JsonRequest.java JsonResult.java JsonResultVO.java IndexController.java UserController.java 2.3、加密的实现 application.yml SecretData.java DecryptRequ

    2024年02月11日
    浏览(58)
  • 安全:AES算法及其加密模式

    AES(高级加密标准)是一种对称密钥加密算法,被广泛用于保护数据的机密性。 AES算法: 结构: AES算法使用替代(SubBytes)、置换(ShiftRows)、混淆(MixColumns)和轮密钥加(AddRoundKey)等四种基本操作来处理数据块。 密钥长度: AES支持128位、192位和256位三种密钥长度,分别

    2024年01月23日
    浏览(50)
  • 小程序AES加密ECB模式

    2024年02月09日
    浏览(278)
  • AES加密每种模式的优缺点

    在AES加密中,常用的模式有ECB、CBC、CFB和OFB等。每种模式都有其优缺点,以下是每种模式的优缺点: 1.ECB模式(电子密码本模式): 优点: 算法简单,加解密速度快。 易于并行计算,因此在硬件中实现时非常高效。 缺点: 不支持并行加解密,因此安全性较差。 明文块内部

    2023年04月26日
    浏览(44)
  • 实现 MyBatis-Plus 中的配置加密功能(使用 AES 算法)

    在项目开发过程中,为了增强数据安全性,我们常常需要对敏感信息进行加密处理。MyBatis-Plus 提供了方便的配置加密功能,使我们能够对配置文件中的敏感信息进行加密和解密操作。本文将详细介绍如何实现 MyBatis-Plus 中的配置加密功能,并给出相应的代码示例。 首先,我们

    2024年02月07日
    浏览(41)
  • php常用加密算法大全aes、3des、rsa等

    目录 一、可解密加解密算法 1、aes 加解密算法 2、旧3des加解密方法  3、新3des加解密方法 4、rsa公私钥加解密、签名验签方法 5、自定义加密算法1  6、自定义加密算法2 7、自定义加密算法3 二、不可解密加密算法  1、md5算法  2、crypt算法 3、sha1算法 5、hash 算法 6、 password_ha

    2024年02月09日
    浏览(50)
  • java:AES加密和解密

    1 前言 对称加密,即单秘钥加密,指加密和解密的过程中,使用相同的秘钥,相比于非对称加密,因仅有一把钥匙,故而速度更快,更适合解密大文件(常见于如视频文件的加密解密中)。AES算法就属于对称加密中的一种。 2 使用 依赖引入: AES加密与解密的工具类封装: 执

    2024年02月11日
    浏览(59)
  • 前端使用AES密码加密、解密,使用详细(crypto加密解密,前后端分离,AES加密解密)

    1、 首先安装 crypto-js插件,安装命令如下:    -S等同于--save,保存在package.json文件中,是在dependencies 下, --save安装包信息将加入到dependencies(生产环境)中,生产阶段的依赖,也就是项目运行时的依赖,就是程序上线后仍然需要依赖; -D等同于--save-dev,也保存在package.j

    2024年02月11日
    浏览(63)
  • python实现AES加密

    目录 1.AES加密 2.需要导入的模块 3.定义好全局变量 4.编写加密函数 5.将密文解密 6.完整代码   AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特; AES有多种加密模式,其中CBC分组模式是SSL、IPSec的标准。使用CBC加密模式时需要提前给出一段初始化向量iv,因为明

    2023年04月08日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包