JAVA AES加解密CBC模式PCKS5padding的实现

之前有个项目是.net采用RSA加密AES的密钥,然后进行AES的加密

当初对方只给了RSA的密文和私钥,以及AES加密的密文,然后我们就自己解密了

依稀记得走了很多的弯路,我甚至发现一个奇异现象,AES加密如果采用CBC模式的加密结果,如果我采用ECB解密再和向量IV进行异或处理,再截取字符串也能得到结果(可能是对方的那组数据比较特殊吧)

但是那次没有做任何的记录,现在开始写博文,算是慢慢记录自己遇到的点点滴滴

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/**
 * 项目中要求访问某个页面的时候要有权限控制,由于是从一个系统跳到另一个系统 所以其中的一部分功能就是使用动态的URL链接 由于我自己负责,所以我的实现打算是这样的
 * 使用AES加密采用CBC加密模式PKCS5PADDING填充方式,动态的URL的参数使用当前时间 IV向量采用当前时间的年月日,最近采用BASE64加密一下 这里只是提前写一下实现方案
 */

public class AesEncrypt {
    static Cipher cipher;

    static final String KEY_ALGORITHM = "AES";

    static final String CIPHER_ALGORITHM_CBC = "AES/CBC/PKCS5Padding";

    static SecretKey secretKey;
    
    static String key;

    public static void main(String[] args) throws Exception {
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String date2String = sdf.format(date) + "00";
        System.out.println(date2String);
        String iv = date2String.substring(0, 8) + date2String.substring(0, 8);
        key = iv;
        String ans = encrypt(date2String, iv);
        descrypt(ans, iv);
    }

    /**
     * 使用AES 算法 加密,默认模式 AES/CBC/PKCS5Padding
     */
    public static String encrypt(String str, String iv) throws Exception {
        cipher = Cipher.getInstance(CIPHER_ALGORITHM_CBC);
        // KeyGenerator 生成aes算法密钥
        secretKey = new SecretKeySpec(key.getBytes(), KEY_ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(iv.getBytes("utf-8")));// 使用加密模式初始化 密钥
        byte[] encrypt = cipher.doFinal(str.getBytes("utf-8")); // 按单部分操作加密或解密数据,或者结束一个多部分操作。
        String ans = new BASE64Encoder().encode(encrypt);
        System.out.println(ans);
        return ans;
    }

    /**
     * 使用AES 算法 解密,默认模式 AES/CBC/PKCS5Padding
     */
    static void descrypt(String str, String iv) throws Exception {
        byte[] encrypt = new BASE64Decoder().decodeBuffer(str);
        secretKey = new SecretKeySpec(key.getBytes(), KEY_ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(iv.getBytes("utf-8")));// 使用解密模式初始化 密钥
        byte[] decrypt = cipher.doFinal(encrypt);
        System.out.println(new String(decrypt));
    }
}


你可能感兴趣的:(JAVA AES加解密CBC模式PCKS5padding的实现)