小编典典

问题在于,在CryptoJS代码中,密码用于导出密钥,而IV用于AES加密,但是mcrypt仅使用密钥进行加密/解密。此信息需要传递给php。由于您不想传输密码,因此必须在php中以相同的方式派生密钥和IV。

以下代码从密码和盐中导出密钥和IV。它是根据我在此处的答案中的代码建模的(更多信息)。

function evpKDF($password, $salt, $keySize = 8, $ivSize = 4, $iterations = 1, $hashAlgorithm = "md5") {

$targetKeySize = $keySize + $ivSize;

$derivedBytes = "";

$numberOfDerivedWords = 0;

$block = NULL;

$hasher = hash_init($hashAlgorithm);

while ($numberOfDerivedWords < $targetKeySize) {

if ($block != NULL) {

hash_update($hasher, $block);

}

hash_update($hasher, $password);

hash_update($hasher, $salt);

$block = hash_final($hasher, TRUE);

$hasher = hash_init($hashAlgorithm);

// Iterations

for ($i = 1; $i < $iterations; $i++) {

hash_update($hasher, $block);

$block = hash_final($hasher, TRUE);

$hasher = hash_init($hashAlgorithm);

}

$derivedBytes .= substr($block, 0, min(strlen($block), ($targetKeySize - $numberOfDerivedWords) * 4));

$numberOfDerivedWords += strlen($block)/4;

}

return array(

"key" => substr($derivedBytes, 0, $keySize * 4),

"iv" => substr($derivedBytes, $keySize * 4, $ivSize * 4)

);

}

盐是在CryptoJS加密期间生成的,需要与密文一起发送到php。在调用evpKDF盐之前,必须先将其从十六进制转换为二进制字符串。

$keyAndIV = evpKDF("Secret Passphrase", hex2bin($saltHex));

$decryptPassword = mcrypt_decrypt(MCRYPT_RIJNDAEL_128,

$keyAndIV["key"],

hex2bin($cipherTextHex),

MCRYPT_MODE_CBC,

$keyAndIV["iv"]);

如果仅将encryptedPassword.toString()其发送到服务器,则有必要在使用前将盐和实际密文分开。该格式是与OpenSSL兼容的专有格式,前8个字节为“

Salted__”,后8个字节为随机盐,其余为实际密文。所有内容都经过Base64编码。

function decrypt($ciphertext, $password) {

$ciphertext = base64_decode($ciphertext);

if (substr($ciphertext, 0, 8) != "Salted__") {

return false;

}

$salt = substr($ciphertext, 8, 8);

$keyAndIV = evpKDF($password, $salt);

$decryptPassword = mcrypt_decrypt(MCRYPT_RIJNDAEL_128,

$keyAndIV["key"],

substr($ciphertext, 16),

MCRYPT_MODE_CBC,

$keyAndIV["iv"]);

// unpad (PKCS#7)

return substr($decryptPassword, 0, strlen($decryptPassword) - ord($decryptPassword[strlen($decryptPassword)-1]));

}

使用OpenSSL扩展而不是Mcrypt可以实现相同的目的:

function decrypt($ciphertext, $password) {

$ciphertext = base64_decode($ciphertext);

if (substr($ciphertext, 0, 8) != "Salted__") {

return false;

}

$salt = substr($ciphertext, 8, 8);

$keyAndIV = evpKDF($password, $salt);

$decryptPassword = openssl_decrypt(

substr($ciphertext, 16),

"aes-256-cbc",

$keyAndIV["key"],

OPENSSL_RAW_DATA, // base64 was already decoded

$keyAndIV["iv"]);

return $decryptPassword;

}

2020-05-26

js 文本加密 php解密,JavaScript加密和PHP解密相关推荐

  1. JS 不可逆加密,高级 JavaScript 加密

    高级 JS 加密方式:https://www.sojson.com/javascriptobfuscator.html (function(w, d) { w.info = "这是一个一系列 ...

  2. 真正的JavaScript加密和网页资源加密系统,从原理到实现

    网站作为网民获取信息的主要来源之一,基于Html5的建站服务和应用越来越多,而Html5存在一个关键问题: 网页内的资源(包括了javascript.文字.图像等)可以通过非常简单的方式获取! 目前网 ...

  3. 加密越来越简单——用JavaScript实现数据加密和解密

    加密越来越简单--用JavaScript实现数据加密和解密 概念 常用算法 1. MD5加密算法 2. SHA-1加密算法 3. AES加密算法 代码示例 结论 总结 在当今互联网的世界中,安全性越来 ...

  4. RSA javascript加密 lua解密

    一个在线RSA非对称加密解密,可以用这个地址生成公钥和私钥 https://blog.zhengxianjun.com/online-tool/rsa/ javascript加密 jsencrypt. ...

  5. java和js实现前端加密后端解密,后端加密前端解密(Base64)

    目录 1.前端加密后端解密 2.后端加密前端解密 在前端和后端数据传输时,常常涉及到隐私数据的传输(例如用户名和密码),这时,我们就需要对隐私数据进行加密解密 1.前端加密后端解密 1.1 前端jqu ...

  6. JavaScript加密注意事项,怎么加密JS脚本最安全?

    JavaScript加密话题 #.  JavaScript  需不需要加密? #.怎么  加密JS  最安全? #.怎么把  JS  中的URL地址.秘钥隐藏起来? #.  JavaScript加密  ...

  7. 【土旦】vue项目中 使用 pako.js 解密 gzip加密字符串

    前言 今天跟后台对接一个接口,接受到一个加密的值,说是通过gzip加密过的,然后就蒙蔽了, 赶紧上百度找了一下资料,通过一篇文章(原文在底部)发现有个js库可以解密,就下载轻松解密了 实现代码 pok ...

  8. 使用Auto.js庖丁对Pro Snapshot快照加密的解密打包教程

    学业繁重,废话少说! 自从Auto.js Pro在8.7.6版本之后,引用了一种新的加密方式Snapshot快照加密之后,越来越多的开发者使用了此加密方法,也是比较推荐的一种加密方式. 目前比较安全的 ...

  9. 国密sm2 js加密后台解密,sm3 js、后台加密,sm4 后台加密

    公司最近进行安全问题修改,所以要用国密系列的sm2,sm3,sm4,这些加密都用在登录模块,因此作为菜鸟的我,从网上找了一堆资料,整理修改后形成符合项目的加密,需要的可以自己去查看相关代码和jar包: ...

最新文章

  1. 使用Servlet完成单表的CRUD
  2. 易语言基础编程知识〖E语言手册〗
  3. Java 128陷阱+自动装箱拆箱
  4. 2017.9.25 随机数生成器 失败总结
  5. BP神经网络原理简介
  6. PDF 开发者 Charles Geschke 去世,39 年前联合创立软件巨头 Adobe!
  7. [TWLFramework] Singleton
  8. eclipse汉化教程(官方汉化包,傻瓜式操作,附带中英文快捷切换方式以及常见问题解决方案)
  9. java中的source_Linux中source命令的用法
  10. Raid5磁盘阵列数据恢复,服务器raid数据恢复步骤和方法
  11. php getdigest,http digest
  12. 通过电话拨号上网的家用计算机,拨号上网需计算机、电话线、帐号和()
  13. html涟漪动画效果,CSS+JS实现水滴涟漪动画按钮效果的示例代码
  14. 图论应用 floyd(弗洛伊德)算法、dijkstra(迪杰斯特拉)算法
  15. LOL自动走A和释放技能原理及安全防护
  16. IDEA javadoc快捷键
  17. 2018年山东外贸进出口1.93万亿元创历史新高
  18. GeneXus3 筛选条件
  19. [软件工程]敏捷过程模型的特性研讨——源自newsmth上的讨论
  20. MySQL内部联结和外部联结

热门文章

  1. 房屋征收管理系统高保真原型征收项目管理(项目预警)房屋测绘管理(测绘确权)协议管理测绘报表管理web端后台管理系统
  2. Axure电商后台业务管理系统原型模板+app电商原型交互+移动端电商通用PRD文档+全局交互用例说明+Axure高保真电商社交prd文档
  3. 多线程下单例模式的实现_ThreadLocal_ReentrantLock
  4. POJ 2409 Let it Bead【Polya定理】(模板题)
  5. (学习笔记)laravel 中间件
  6. SQL HQL JPQL CQL的对比
  7. 24.Linux-Nand Flash驱动(分析MTD层并制作NAND驱动)
  8. Swift学习笔记(10)--枚举
  9. LeetCode OJ - Best Time to Buy and Sell Stock III
  10. Copy-On-Write容器之一:CopyOnWriteArrayList