JAVA AES/CBC/ZeroPadding

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class AesUtil {

    //加密
    public static String encrypt(String data, String key, String ivStr) {
        //偏移量
        byte[] iv = ivStr.getBytes();
        try {
            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
            int blockSize = cipher.getBlockSize();
            byte[] dataBytes = data.getBytes();
            int length = dataBytes.length;
            //计算需填充长度
            if (length % blockSize != 0) {
                length = length + (blockSize - (length % blockSize));
            }
            byte[] plaintext = new byte[length];
            //填充
            System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);
            SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
            //设置偏移量参数
            IvParameterSpec ivSpec = new IvParameterSpec(iv);
            cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
            byte[] encryped = cipher.doFinal(plaintext);

            return Base64.getMimeEncoder().encodeToString(encryped);

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    //解密
    public static String desEncrypt(String data, String key, String ivStr) {

        byte[] iv = ivStr.getBytes();

        try {
            byte[] encryp = Base64.getMimeDecoder().decode(data);
            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
            SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
            IvParameterSpec ivSpec = new IvParameterSpec(iv);
            cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
            byte[] original = cipher.doFinal(encryp);
            return new String(original);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    //测试
    public static void main(String[] args) {
        String date = "发发发发发";
        String key = "12345";
        String ivStr = "12345";
        String encrypt = encrypt(date,key, ivStr);
        String desencrypt = desEncrypt(encrypt, key, ivStr);
        System.out.println("加密后:"+encrypt);
        System.out.println("解密后:"+desencrypt);
    }

}

参考原文:

Java适配Node.js中AES-CBC-ZeroPadding加密 - 掘金

Java AES加密 CBC模式 zeropadding填充 实现代码_骑鱼的猫咪的博客-CSDN博客_aes cbc zeropadding

AES是高级加密标准(Advanced Encryption Standard)的缩写,是一种对称加密算法,被广泛用于保护网络通信和数据传输中的敏感信息。CBCAES的一种工作模式,全称为Cipher Block Chaining,用于处理分组密码中的加密块。 在AES/CBC中,将明文按照指定的分组大小进行分块,每个分块的大小为128位(16字节)。然后,利用初始向量(Initialization Vector,IV),将第一个分组与一个随机生成的IV进行异或操作。接下来,将异或结果与密钥进行加密,生成密文。对于下一个分组,将上一个分组的密文与IV进行异或操作,然后再与密钥进行加密。以此类推,每个分组都与前一个分组的密文进行异或操作,并进行加密。 ZeroPadding指的是在明文不足一个分组大小时,用0来填充以达到分组大小的要求。这是为了满足AES算法要求明文长度必须是16字节的倍数。 AES/CBC/ZeroPadding的工作流程如下:首先,对明文进行ZeroPadding填充,并设定一个初始向量IV。然后,将填充后的明文分块,与IV进行异或操作,再与密钥进行加密,得到第一个密文块。对于后续的分块,将上一个密文块与IV进行异或操作,再与密钥进行加密。最后,将所有密文块连接起来,得到最终的密文。 使用AES/CBC/ZeroPadding可以保证数据传输的机密性和完整性。由于AES算法的强加密性和CBC模式的分块和异或操作,使得数据在传输过程中更加安全可靠。同时,ZeroPadding填充保证了明文长度的完整性,使得加密操作可以进行正确性验证。 总之,AES/CBC/ZeroPadding是一种常用的数据加密和保护机制,可以在网络通信和数据传输中有效地保护敏感信息的机密性和完整性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值