当前位置:网站首页>js和PHP通用的DES加解密算法
js和PHP通用的DES加解密算法
2022-08-06 22:57:00 【幕尘枫】
导读:
为什么要在前端使用DES加解密呢,如果从数据安全角度考虑,确实没必要在前端进行加解密操作,容易暴露算法,但如果从数据传递的特殊需求来讲,是有必要的。比如我服务器的宝塔控制面板使用了Nginx防火墙,我的form表单提交参数里有"insert into"之类的数据库SQL语句关键词,那么我网站表单提交的get或者post请求就会被防火墙误拦截。
需求说明白了,开始说DES加解密的前提条件:
1、js需要使用CryptoJS插件
<script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.min.js"></script>2、php需要开启openssl扩展
js前端的代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Des加解密示例</title>
</head>
<body>
<script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.min.js"></script>
<script type="text/javascript">
let message="admin";//要加密的字符串
let key="abcd1234";//密钥(要求8位以上)
let ivstr= "3a1f315222c490121ae193c5";//偏移量(要求8位以上)
var result=encryptByDES(message,key);
document.write("加密结果:"+result);
var decrypt=decryptByDES(result,key);
document.write("<br>解密结果:"+decrypt);
// JS DES CBC模式 加密
function encryptByDES(message, key){
let ckey = CryptoJS.enc.Utf8.parse(key)
let encrypted = CryptoJS.DES.encrypt(message, ckey, {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: CryptoJS.enc.Utf8.parse(ivstr)
});
//return encrypted.toString(); //此方式返回base64格式密文
return encrypted.ciphertext.toString(); // 此方式返回hex格式的密文
}
// JS DES CBC模式 解密
function decryptByDES(message, key){
let ckey = CryptoJS.enc.Utf8.parse(key);
let ciphertext = CryptoJS.enc.Hex.parse(message);
let srcs = CryptoJS.enc.Base64.stringify(ciphertext);
let decrypt = CryptoJS.DES.decrypt(srcs, ckey, {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: CryptoJS.enc.Utf8.parse(ivstr)
});
return decrypt.toString(CryptoJS.enc.Utf8);
}
</script>
</body>
</html>
为什么我用的是CBC模式,而不是ECB模式呢?
我也很纠结呀,本来想用ECB模式的,但PHP那边加解密的结果的js前端不一致。找不到原因,只能用CBC模式了。
PHP后端代码:
<?php
$str="admin";//要加密的字符串
$key="abcd1234";//要求8位以上
$iv="12345678";//必须是8位
$result=des($str,$key,$iv,"加密");
echo "加密结果:".$result;
$decrypt=des($result,$key,$iv,"解密");
echo "<br>解密结果:".$decrypt;
/**
* 和js端通用的des加解密算法
* $message 字符串
* $key 密钥
* $type 类型
*/
function des($message,$key,$iv, $type="加密"){
if($type=="加密"){
$aes = openssl_encrypt($message, 'DES-CBC', $key, OPENSSL_RAW_DATA,$iv);
return bin2hex($aes);
}else if($type=="解密"){
$mes = hex2bin($message);
return openssl_decrypt($mes, 'DES-CBC',$key, OPENSSL_RAW_DATA,$iv);
}
}边栏推荐
猜你喜欢

灵活好用的sql monitoring 脚本 part5

有趣的opencv-记录图片二值化和相似度实现

【ECCV2022】OSFormer: One-Stage Camouflaged Instance Segmentation with Transformers

Axure9 basic interactions (2)

伪装马上线Cobalstrike

基于FTP协议文件的上传与下载

移动平台助力推进智慧型科研院所信息化建设

2022暑期总结-兼职、学业、工作

C language structure linked list node insertion method (before and after)

C语言结构体链表 节点插入方法(从前和从后)
随机推荐
MMDtection3D
C语言结构体链表 节点插入方法(从前和从后)
TL431的参考电极与负极之间的相移
拽人互动地图怎么绘制线条(比如铁路线)
PAT乙级-B1028 人口普查(20)
启牛APP是什么?请问一下手机开户股票开户安全吗?
package DotaChessSelfPlay is not in GOROOT以及 relative import paths are not supported in module mode
PAT serie b - B1024 scientific notation (20)
GBRank:一种基于回归的排序方法
有趣的opencv-记录图片二值化和相似度实现
IE彻底退出历史舞台 盘点那些年微软砍掉的产品
Julia两天极速入门学习笔记
Logic and arithmetic
B. Jumps
fasterrcnn tensorrt部署实践
xpath的使用:(1)xpath插件的安装
s905l3a series brush armbian to teach you to build your own blog from 0
那些舍不得删除的 MP3--批量修改mp3的ID3tag
VS2019报错:应用程序无法正常启动(0xc000007b),请单击确定关闭应用程序;VCRUNTIME140.dll报错
“蔚来杯“2022牛客暑期多校训练营6,签到题GJBMA