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中分别有几种不同的实现方式。如果选择的实现方式不同加密解密结果是不同的,所以需要选择它们的公共实现方式。而我在这里提供的实现方法就是取其交集,然后就可以实现前后端加解密。具体我在这里就不陈述了,有兴趣的朋友可以自行去学习一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值