对称加密——AES算法使用

对称加密

image-20211212115944043

我们知道MD5加密的本质上是无法解密,是一个不可逆的过程,而网上有很多解密其实都是一种穷举法对比,根本不存在破解方法。

但是在业务中,很多时候存在解密的需要,这个时候我们可以采用对称加密,对称加密是指加密和解密都采用相同的秘钥。使用对称加密,发送方使用密钥将明文数据加密成密文,然后发送出去,接收方收到密文后,使用同一个密钥将密文解密成明文读取,我们可以用一个很形象的例子来解释对称加密,例如:只有一模一样的钥匙才能打开同一个锁,也只有那把钥匙能锁住那把锁。

AES详解

典型的对称加密算法有DES、3DES、AES,但AES加密算法的安全性要高于DES和3DES,所以AES已经成为了主要的对称加密算法。

AES加密算法就是众多对称加密算法中的一种,它的英文全称是Advanced Encryption Standard,翻译过来是高级加密标准,它是用来替代之前的DES加密算法的。

要理解AES的加密流程,会涉及到AES加密的五个关键词,分别是:分组密码体制Padding密钥初始向量IV四种加密模式,下面我们一一介绍。

分组密码体制:所谓分组密码体制就是指将明文切成一段一段的来加密,然后再把一段一段的密文拼起来形成最终密文的加密方式。AES采用分组密码体制,即AES加密会首先把明文切成一段一段的,而且每段数据的长度要求必须是128位16个字节,如果最后一段不够16个字节了,就需要用Padding来把这段数据填满16个字节,然后分别对每段数据进行加密,最后再把每段加密数据拼起来形成最终的密文。

Padding:Padding就是用来把不满16个字节的分组数据填满16个字节用的,它有三种模式PKCS5、PKCS7和NOPADDING。PKCS5是指分组数据缺少几个字节,就在数据的末尾填充几个字节的几,比如缺少5个字节,就在末尾填充5个字节的5。PKCS7是指分组数据缺少几个字节,就在数据的末尾填充几个字节的0,比如缺少7个字节,就在末尾填充7个字节的0。NoPadding是指不需要填充,也就是说数据的发送方肯定会保证最后一段数据也正好是16个字节。那如果在PKCS5模式下,最后一段数据的内容刚好就是16个16怎么办?那解密端就不知道这一段数据到底是有效数据还是填充数据了,因此对于这种情况,PKCS5模式会自动帮我们在最后一段数据后再添加16个字节的数据,而且填充数据也是16个16,这样解密段就能知道谁是有效数据谁是填充数据了。PKCS7最后一段数据的内容是16个0,也是同样的道理。解密端需要使用和加密端同样的Padding模式,才能准确的识别有效数据和填充数据。我们开发通常采用PKCS7 Padding模式。

初始向量IV:初始向量IV的作用是使加密更加安全可靠,我们使用AES加密时需要主动提供初始向量,而且只需要提供一个初始向量就够了,后面每段数据的加密向量都是前面一段的密文。初始向量IV的长度规定为128位16个字节,初始向量的来源为随机生成。至于为什么初始向量能使加密更安全可靠。

密钥:AES要求密钥的长度可以是128位16个字节、192位或者256位,位数越高,加密强度自然越大,但是加密的效率自然会低一些,因此要做好衡量。我们开发通常采用128位16个字节的密钥,我们使用AES加密时需要主动提供密钥,而且只需要提供一个密钥就够了,每段数据加密使用的都是这一个密钥,密钥来源为随机生成。

四种加密模式:AES一共有四种加密模式,分别是ECB(电子密码本模式)CBC(密码分组链接模式)CFBOFB我们一般使用的是ECB和CBC模式。四种模式中除了ECB相对不安全之外,其它三种模式的区别并没有那么大,因此这里只会对ECB和CBC模式做一下对比。

ECB模式是最基本的加密模式,即仅仅使用明文和密钥来加密数据,相同的明文块会被加密成相同的密文块,这样明文和密文的结构将是完全一样的,就会更容易被破解,相对来说不是那么安全,因此很少使用。

image-20211212120209543

CBC模式则比ECB模式多了一个初始向量IV,加密的时候,第一个明文块会首先和初始向量IV做异或操作,然后再经过密钥加密,然后第一个密文块又会作为第二个明文块的加密向量来异或,依次类推下去,这样相同的明文块加密出的密文块就是不同的,明文的结构和密文的结构也将是不同的,因此更加安全。

image-20211212120257593

AES算法下载

java 中的 AES 秘钥为256bit 算法执行时,会遇到 Illegal key size or default parameters 错,原因是因为本地没有对应的算法库,需要下载对应JDK版本的算法库。

JDK8 jar 包下载地址:

https://www.oracle.com/java/technologies/javase-jce8-downloads.html

JDK7 jar 包下载地址:

https://www.oracle.com/java/technologies/javase-jce7-downloads.html

JDK6 jar 包下载地址:

https://www.oracle.com/java/technologies/jce-6-download.html

下载后解压,可以看到local_policy.jarUS_export_policy.jar以及readme.txt。将两个jar文件放到%JRE_HOME%\lib\security目录下覆盖原来的文件。还要将两个jar文件也放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件。

AES实战

使用AES加密、解密,他们的执行过程都是一样的,步骤如下:

1:加载加密解密算法处理对象(包含算法、秘钥管理)
2:根据不同算法创建秘钥
3:设置加密模式(无论是加密还是解析,模式一致)
4:初始化加密配置
5:执行加密/解密

我们首先需要引入相关依赖包:

<!--算法依赖包-->
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk16</artifactId>
    <version>1.46</version>
</dependency>

然后开始编写相关工具类:

public class AESUtil {

    /****
     * AES加密
     * @param buffer : 明文/密文
     * @param appsecret : 秘钥,16位
     * @param mode : 处理方式  1:加密,2:解密
     */
    public static byte[] encryptAndDecrypt(byte[] buffer, String appsecret, Integer mode) throws Exception {
        //1、加载加密处理对象,该对象会提供加密算法、秘钥生成、秘钥转换、秘钥管理等功能
        Security.addProvider(new BouncyCastleProvider());
        //2、创建秘钥对象,并指定算法
        SecretKeySpec secretKey = new SecretKeySpec(appsecret.getBytes("UTF-8"), "AES");
        //3、设置Cipher的加密模式,AES/ECB/PKCS7Padding  BC指定算法对象(BouncyCastleProvider)
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
        //4、初始化加密配置
        cipher.init(mode, secretKey);
        //5、执行加密/解密
        return cipher.doFinal(buffer);
    }

}

此处的秘钥为16byte(128bit),秘钥的长度可以为128/192/256 bit,我们测试如下:

public static void main(String[] args) throws Exception {
    //明文
    String content = "AES算法加密!";
    //16位秘钥
    String key = "1616161616161616";

    //加密
    byte[] encrypt = encryptAndDecrypt(content.getBytes("UTF-8"), key, 1);
    System.out.println("加密后的密文:" + new String(encrypt,"UTF-8"));
    //解密
    byte[] decrypt = encryptAndDecrypt(encrypt, key, 2);
    System.out.println(new String(decrypt,"UTF-8"));
}

测试效果如下:

���.g-����܌�����G�+�8"/
AES算法加密!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

、楽.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值