AES对称加密算法及实现

Posted 熊孩子码农之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AES对称加密算法及实现相关的知识,希望对你有一定的参考价值。

一、背景

    项目开发中尽管有https协议做安全协议,但是有时候还是会选择自己再将数据手动加密解密一遍。面对这种情况,我们怎么做呢。

    ①  选择一种加密算法。

    ②  实现前端与后端的对称加解密。

    今天在这里跟大家分享一种实现方案:使用AES对称加密实现前后端数据加解密。前端代码使用JS编写。后端代码使用java编写。一起来看看吧

   https://github.com/shen8332402/publicResource/tree/master/AES_JAVA_JS

三、java实现

    1.背景与环境

        使用AES加密不需要额外的jar包,使用jdk自带的jar就可以。

    2.加密算法代码如下

public static String encrypt(String data, String key, String iv) throws Exception {

try {

Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");//"算法/模式/补码方式"

int blockSize = cipher.getBlockSize();

byte[] dataBytes = data.getBytes("utf-8");

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");

IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());

cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);

byte[] encrypted = cipher.doFinal(plaintext);

return new Base64().encodeToString(encrypted);

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

   3.解密算法实现如下

        public static String desEncrypt(String data, String key, String iv) throws Exception {

try {

byte[] encrypted1 = new Base64().decode(data);

Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");

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,"utf-8");

return originalString;

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

  4.参数中的key和iv是什么

        key:大家称其为密钥。可以随意定义。

        例:public static String KEY = "1234123412ABCDEF";

        iv:大家称其为偏移量。也可以随意定义。

        例:public static String IV = "ABCDEF1234123412";

四、js实现

    1.背景

        引入js库文件,引入实现加密算法的页面就可以啦。

    2.JS文件头(引入库文件,一些公共属性定义)    

        import CryptoJS from 'crypto-js';

        const key = CryptoJS.enc.Latin1.parse('1234123412ABCDEF');

        const iv = CryptoJS.enc.Latin1.parse('ABCDEF1234123412');

        const mode = CryptoJS.mode.CBC;

        const padding = CryptoJS.pad.ZeroPadding;

    3.加密算法如下

                function encryptData(data){

                //加密

                let encrypted = CryptoJS.AES.encrypt(

                data,

                key,

                {

                iv: iv, mode: mode, padding: padding

                });

                return encrypted;

                }

    4.解密算法如下:

            function decryptData(data){

            //解密

            let decrypted = CryptoJS.AES.decrypt(data, key, { iv: iv, padding: padding });

            return decrypted;

            }

    五:总结

        需要注意的点:

            1.注意JS中key与vi的定义,一定要按我写的来。

            2.注意java中的“AES/CBC/NoPadding”的定义与js中

         const mode = CryptoJS.mode.CBC;

         const padding = CryptoJS.pad.ZeroPadding;

            这两行的定义。

        以上两个问题涉及到了AES加密的几种实现方法。简单说一下就是AES加密在java与js中分别有几种不同的实现方式。如果选择的实现方式不同加密解密结果是不同的,所以需要选择它们的公共实现方式。而我在这里提供的实现方法就是取其交集,然后就可以实现前后端加解密。具体我在这里就不陈述了,有兴趣的朋友可以自行去学习一下。

        

        互联网时代,这样的加解密肯定会用到的,怎么样,关注,关注,兄弟关注赶紧关注我吧。

        


        彩蛋彩蛋:昨天,RNG获得了MSI世界冠军,UZI祝贺你,你是我的英雄。



以上是关于AES对称加密算法及实现的主要内容,如果未能解决你的问题,请参考以下文章

AES对称加密算法及实现

干货分享 | 对称加密及AES加密算法

AES 对称加密中的 ECB 实现

对称加密算法AES

PHP对称加密-AES

密码学第四讲-对称加密算法AES原理及实现