DES 3DES加密算法,cbc模式,pkcs5Padding字符填充方式

7 篇文章 0 订阅
6 篇文章 0 订阅

前端引用DES(加解密)

   前端基于ElementUI Vue3 为一体的开发
  • npm install crypto-js
  • 配置文件添加如下内容
import CryptoJS from 'crypto-js';

export default {
    //解密
    decrypt(word) {
        const iv = process.env.VUE_APP_DES_IV
        const keyStr = process.env.VUE_APP_DES_KEY
        let keyHex = CryptoJS.enc.Utf8.parse(keyStr);
        let decrypted = CryptoJS.DES.decrypt({
            ciphertext: CryptoJS.enc.Hex.parse(word)
        }, keyHex, {
            iv: CryptoJS.enc.Utf8.parse(iv),
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });
        return decrypted.toString(CryptoJS.enc.Utf8);
    },
    //加密
    encrypt(word) {
        const iv = process.env.VUE_APP_DES_IV
        const keyStr = process.env.VUE_APP_DES_KEY
        let keyHex = CryptoJS.enc.Utf8.parse(keyStr);
        let encrypted = CryptoJS.DES.encrypt(word,
            keyHex, {
                mode: CryptoJS.mode.CBC, // ecb模式不需要偏移量
                padding: CryptoJS.pad.Pkcs7,
                iv: CryptoJS.enc.Utf8.parse(iv)
            });
        let hexstr = encrypted.ciphertext.toString();
        return hexstr;
    },

}

  • 前端请求封装处理
/* eslint-disable no-unused-vars */
import axios from 'axios';
import router from '@/pis/router'
import {
    Message
} from 'element-ui';
import aes from './aes.js'

if ((location.host.indexOf("pis") != -1)) {
    axios.get('/productapi/token').then((res) => {
        axios.defaults.headers.common['X-CSRF-TOKEN'] = res.data;
        axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
    });
}

const service = axios.create({
    timeout: 30000,
    withCredentials: false,
});

const openDes = process.env.VUE_APP_OPEN_DES == 'true' ? true : false;
// 加密
service.interceptors.request.use(
    config => {
        if (openDes && config.method == 'post') {
            if (config.headers['Content-Type'] != 'multipart/form-data') {
                config.data = aes.encrypt(JSON.stringify(config.data));
            }
        }
        return config;
    },
    error => {
        return Promise.reject();
    }
);

// 解密
service.interceptors.response.use(
    response => {
        if (response.status === 200) {
            if (openDes && !response.data.status) {
                response.data = aes.decrypt(response.data);
                response.data = JSON.parse(response.data);
            }
            if (response.data.status != '200') {
                let message = response.data.message ? response.data.message : '出错了,请刷新页面重新执行!';
                Message({
                    type: 'error',
                    message: message,
                })
            }
            return response.data;
        } else {
            Promise.reject();
        }
    },
    error => {
        if (error.response) {
            switch (error.response.status) {
                case 401:
                case 419:
                    localStorage.removeItem('store');
                    router.replace({
                        path: "/login",
                    });
                    break;
                case 500:
                    Message({
                        type: 'error',
                        message: '出错了,请刷新页面重新执行!',
                    });
                    break;
            }
        }
        return Promise.reject(error);
    }
);

export default service;

后端DES(加解密)


/**
 * @des 3DES加密算法,cbc模式,pkcs5Padding字符填充方式
 * des-ede3-cbc
 */
class Des
{
    final public static function encrypt($input, $key, $iv)
    {
        $data = @openssl_encrypt($input, 'DES-CBC', $key, OPENSSL_RAW_DATA, $iv);
        $data = bin2hex($data);
        return $data;
    }

    final public static function decrypt($encrypted, $key, $iv)
    {
        $encrypted = hex2bin($encrypted);
        $data = @openssl_decrypt($encrypted,'DES-CBC', $key, OPENSSL_RAW_DATA, $iv);
        $data = json_decode($data);
        return $data;
    }

}

**********  实例调用 ***********
<?php
namespace app\security\controller;

use app\BaseController;
use think\facade\Request;
use utils\algorithm\Des;

class Index extends BaseController
{

    protected $des_key = "xxxxx";
    protected $des_iv = "xxxxx";

    /**
     * 解密
     * @return json 业务处理响应结果
     */
    public function decrypt($data)
    {
        if (mode() == 'd'&&$data) {
            $des = new Des();
            $effect = $des->decrypt($data, $this->des_key, $this->des_iv);
            return $effect;
        } else {
            return json_decode($data);
        }

    }

    /**
     * 加密
     * @return json 业务处理响应结果
     */
    public function encrypt($data)
    {
        if (mode() == 'd'&&$data) {
            $des = new Des();
            $json_str = json_encode($data);
            $effect = $des->encrypt($json_str, $this->des_key, $this->des_iv);
            return $effect;
        } else {
            return $data;
        }
    }

    /**
     * 用户登录 xz
     * @api /index/Index/demo
     */
    public function demo()
    {
        $payload = Request::getInput();
        $payload = $this->decrypt($payload);
        if (empty($payload)) {
            return json(['code' => 400, 'msg' => '请求参数不能为空']);
        }
        $data = (new User)->doLogin($payload);
        if ($data) {
            $data = $this->encrypt($data);
            return success($data);
        } else {
            return json(['code' => 400, 'msg' => '账号或密码信息有误', 'data' => null]);
        }
    }

更多文献参考:DES 3DES加密算法,cbc模式,pkcs5Padding字符填充方式

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是使用CryptoJS库实现DES/CBC/PKCS5Padding模式的加解密示例代码: ```javascript // 加密方法 function encryptByDES(message, key, iv) { // 将密钥和向量转换为WordArray对象 var keyHex = CryptoJS.enc.Hex.parse(key); var ivHex = CryptoJS.enc.Hex.parse(iv); // 将明文转换为WordArray对象 var messageBytes = CryptoJS.enc.Utf8.parse(message); // 进行加密 var encrypted = CryptoJS.DES.encrypt(messageBytes, keyHex, { iv: ivHex, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); // 将密文转换为Base64字符串 return encrypted.toString(); } // 解密方法 function decryptByDES(ciphertext, key, iv) { // 将密钥和向量转换为WordArray对象 var keyHex = CryptoJS.enc.Hex.parse(key); var ivHex = CryptoJS.enc.Hex.parse(iv); // 将密文转换为WordArray对象 var ciphertextBytes = CryptoJS.enc.Base64.parse(ciphertext); // 进行解密 var decrypted = CryptoJS.DES.decrypt({ ciphertext: ciphertextBytes }, keyHex, { iv: ivHex, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); // 将解密后的结果转换为UTF-8字符串 return decrypted.toString(CryptoJS.enc.Utf8); } // 测试 var message = "Hello, world!"; var key = "1234567890abcdef"; var iv = "12345678"; var ciphertext = encryptByDES(message, key, iv); var plaintext = decryptByDES(ciphertext, key, iv); console.log("明文:" + message); console.log("密文:" + ciphertext); console.log("解密后的明文:" + plaintext); ``` 在这个示例代码中,我们使用了CryptoJS库提供的DES加密算法进行加解密,其中mode参数指定了加密模式CBCpadding参数指定了填充方式PKCS5Padding。在加密时,我们使用了指定的密钥和向量对明文进行加密,并将密文转换为Base64字符串返回。在解密时,我们使用了相同的密钥和向量对密文进行解密,并将解密后的结果转换为UTF-8字符串返回。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr Xu Luka

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

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

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

打赏作者

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

抵扣说明:

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

余额充值