算法实现:对称加解密算法AES+128位加解密+加解密模式CBC+填充模式PKCS5Padding+base64编码

一、前言

只想要代码的可以直接往后看。

工作以来接触过RSA、AES、HMAC-MD5等数据加解密算法,最近想总结一下。还记得大四刚实习时,项目经理让我用RSA算法实现用户登录注册功能的前后端的数据加密流程,对于当时我这张白纸来说,这玩意儿简直太高深莫测了,而且是一个全国项目,工程好多,工程结构、互相怎么调用我都还没弄清楚,,内心无比慌张,刚来实习又不敢拒绝说不会,硬着头皮接了下来,其实还好,毕竟java api都已经实现并封装了,又不是让我从0开始去写算法的。这篇博客暂时不扯RSA,先让我先总结一下AES算法。(RSA使用总结也写完了,需要的可以点这里:RSA非对称加密算法解析:密钥、明文及密文长度的约定--以及使用RSA算法实现登录时的前后端的加解密)

 差点写成了回忆录加辞职总结。。

二、关于算法的一些理解

1、AES算法:

这是一种对称加密算法,强迫症一定要知道清楚啥对称加密,对称加密的意思是指,加密者和解密者用的是同一串秘钥。

2、128位加解密

这是在约定秘钥的长度,128位即128bit,AES的秘钥长度一般有:128bit、192bit、256bit。java 中,秘钥里的一个字符是一个字节(1byte),1byte=8bit。一个128位的秘钥,即由16个字符组成,如:"aigov1266aba186k".

3、加解密模式CBC

AES有四种加解密模式:CBC、EBC、CFB、OFB ,我这次被要求用CBC模式,所以大概了解一下CBC。其他几个,咱也不懂,咱也不敢说。CBC模式下,加密时,是对明文进行分组加密的,每组大小一致,到最后一组时,可能长度不够,这个时候就需要填充到一样长度,就有了下面的填充模式。

4、填充模式

有两种填充模式:PKCS5Padding、PKCS7Padding 。这两种填充模式填充规则一样,区别在于,分组时,每组约定大小不一样。PKCS5Padding要求块(block)的大小是8位,PKCS7Padding则没有明确,范围在1-255之间。

5、Base64编码

Base64编码就是将数据编码成只用大小写字母,0-9数字,以及符号 + /等64个字符的String字符串,一般我们在网络中传输较长的数据时,会选中这种编码方式。

明文在经过加密后后变成一个无规则的二进制byte数组,如:

 此时为了展示和传输,我们一般会约定使用Base64编码进行编码。将二进制byte数组进行base64编码后,就得到如下形式字符串:

三、AES算法实现代码:

1、需求

2、实现

消息秘钥是用于加密和解密的,一般由数据发送方提供。

package com.aigov.springbootmybatis.springbootmybatis.util;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

/**
 * @author : aigoV
 * @date :2019/5/16
 * AES加解密工具
 * 128位
 * 加解密模式-CBC :使用CBC模式,需要一个向量,增加算法的强度
 * 填充模式-PKCS5Padding
 * base64编码
 **/
public class AESUtil {
    /** 字符集名称 **/
    public static final String charsetName = "utf-8";
    /** 算法 **/
    public static final String algorithm  = "AES";
    /** 算法/模式/补码方式 **/
    public static final String transformation  = "AES/CBC/PKCS5Padding";

    /**
     * 加密
     * @param DataSecret 消息秘钥
     * @param DataSecretIV 秘钥初始化向量
     * @param content 要加密的内容
     * @return 返回base64编码的String
     * @throws Exception
     */
    public static String encrypt(String DataSecret, String DataSecretIV, String content) throws Exception {
        byte[] raw = DataSecret.getBytes(charsetName);
        SecretKeySpec skeySpec = new SecretKeySpec(raw, algorithm);
        Cipher cipher = Cipher.getInstance(transformation);
        IvParameterSpec ips = new IvParameterSpec(DataSecretIV.getBytes());
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ips);
        byte[] encrypted = cipher.doFinal(content.getBytes());
        return new BASE64Encoder().encode(encrypted);
    }

    /**
     * 解密
     * @param DataSecret 消息秘钥
     * @param DataSecretIV 秘钥初始化向量
     * @param content 要解密的内容
     * @return 返回原文
     * @throws Exception
     */
    public static String decrypt(String DataSecret, String DataSecretIV, String content) throws Exception {
            byte[] raw = DataSecret.getBytes(charsetName);
            SecretKeySpec skeySpec = new SecretKeySpec(raw, algorithm);
            Cipher cipher = Cipher.getInstance(transformation);
            IvParameterSpec ips = new IvParameterSpec(DataSecretIV.getBytes());
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, ips);
            byte[] encrypted1 = new BASE64Decoder().decodeBuffer(content);
            byte[] original = cipher.doFinal(encrypted1);
            String originalString = new String(original);
            return originalString;
    }
}

 

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用JavaScript实现AES算法CBC模式加解密算法的示例代码: ```javascript // 定义AES加解密算法函数 function aesCBC(operation, key, iv, data) { var aesAlgorithm = "AES-CBC"; var blockSize = 16; var keyObj = CryptoJS.enc.Hex.parse(key); var ivObj = CryptoJS.enc.Hex.parse(iv); var dataObj = CryptoJS.enc.Hex.parse(data); var encryptedDataObj; // 根据操作类型选择加密或解密算法 if (operation === "encrypt") { encryptedDataObj = CryptoJS.AES.encrypt(dataObj, keyObj, { iv: ivObj, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, }); } else if (operation === "decrypt") { encryptedDataObj = CryptoJS.AES.decrypt(dataObj, keyObj, { iv: ivObj, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, }); } // 返回加解密结果 return encryptedDataObj.toString(CryptoJS.enc.Hex); } // 示例使用:加密 var key = "0123456789abcdef0123456789abcdef"; var iv = "0123456789abcdef0123456789abcdef"; var data = "0123456789abcdef0123456789abcdef"; var encryptedData = aesCBC("encrypt", key, iv, data); console.log("加密后的数据:" + encryptedData); // 示例使用:解密 var decryptedData = aesCBC("decrypt", key, iv, encryptedData); console.log("解密后的数据:" + decryptedData); ``` 这里使用了CryptoJS这个JavaScript库来实现AES算法CBC模式加解密。其中,`aesCBC`函数接受四个参数: - `operation`:操作类型,可以是`encrypt`(加密)或`decrypt`(解密)。 - `key`:密钥,使用16进制字符串表示。 - `iv`:初始化向量,使用16进制字符串表示。 - `data`:待加密或解密的数据,使用16进制字符串表示。 函数中使用`CryptoJS.AES.encrypt`和`CryptoJS.AES.decrypt`分别进行加密和解密操作,其中`iv`参数表示CBC模式中的初始化向量,`mode`参数表示加密模式,`padding`参数表示填充模式。 示例中使用`console.log`打印加解密结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值