用PHP mcrypt加密的Javascript解密Blowfish CBC
Decrypting Blowfish CBC in Javascript that has been encrypted with PHP mcrypt
我很难解密一个用Blowfish CBC在PHP中加密的字符串;
我在客户端使用Javascript和Node.js进行一个用Mocha编写的单元测试。我正在使用Node的内置加密功能。
以下是在PHP中解密字符串的代码。
<?php
$cipher = mcrypt_module_open(MCRYPT_BLOWFISH, '', MCRYPT_MODE_CBC, '');
$iv = "my_iv";
$key = substr("my_key", 0, 56);
// I read that php automaticly pads my key with '0 to make it 56char long.
if (mcrypt_generic_init($cipher, $key, $iv) != -1) {
$text = mdecrypt_generic($cipher, urldecode("X%10%8F%AD%1C%1D%E1f%29%CD%D2%E1%81%B0%BE%D2M%8E3%D6%5DO%29%E3%E6%EF%24%A0%E0g%22%DA%D7YK%5B%AA%E6P%91%BA%B8U%C1%87k%7F%07%FD%9D%BF%1F%BD%95r%04%F0%18%A9%27%E17%2C%A8"));
mcrypt_generic_deinit($cipher);
echo rtrim($text, "'0");
} else {
echo "ERRROR";
}
?>
这段代码给了我正确的输出,它是一个作为字符串的串行数组。
然后我尝试了两个库在JS、中使用相同的流进行解密
带加密(内置节点):
var crypto = require('crypto');
var iv = new Buffer('my_iv');
var key = new Buffer('my_key');
var text = new Buffer(unescape("X%10%8F%AD%1C%1D%E1f%29%CD%D2%E1%81%B0%BE%D2M%8E3%D6%5DO%29%E3%E6%EF%24%A0%E0g%22%DA%D7YK%5B%AA%E6P%91%BA%B8U%C1%87k%7F%07%FD%9D%BF%1F%BD%95r%04%F0%18%A9%27%E17%2C%A8"));
var decipher = crypto.createDecipheriv('bf-cbc', key, iv);
var decrypted = decipher.update(text, '', '');
decrypted += decipher.final('');
console.log(decrypted);
给我这个错误:
error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
TypeError: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
at Decipheriv.Cipher.final (crypto.js:320:27)
使用节点的mcrypt模块:https://github.com/tugrul/node-mcrypt
var MCrypt = require('mcrypt').MCrypt;
var bfCcb = new MCrypt('blowfish', 'cbc');
var iv = Buffer.from('my_iv');
var key = Buffer.from('my_key_padded_with_0'0'0');
var text = Buffer.from(unescape("X%10%8F%AD%1C%1D%E1f%29%CD%D2%E1%81%B0%BE%D2M%8E3%D6%5DO%29%E3%E6%EF%24%A0%E0g%22%DA%D7YK%5B%AA%E6P%91%BA%B8U%C1%87k%7F%07%FD%9D%BF%1F%BD%95r%04%F0%18%A9%27%E17%2C%A8"));
bfCcb.open(key, iv);
var plaintext = bfCcb.decrypt(text);
console.log(plaintext.toString());
它给了我错误的输出,
我不知道这是否与可能的编码有关,或者我是否在配置javascript对象时遗漏了一些东西。。。
如果有人已经遇到这个问题,请告诉我。
OK,忽略安全性。
注意:Blowfish的块大小为64位,密钥长度从32位到448位不等
错误消息说明错误是什么:"错误的最终块长度",这是非常具体的。基于块的加密要求输入是块大小的倍数。"my_url_encodeed_string"是22字节的ling,不是Blowfish块大小8字节的倍数。
"my_url_encodeed_string"未加密(加密的似乎是随机位和字节),因此无法解密。它也不是URL编码的,因此不需要unescape
。
mcrypt
不产生错误并不意味着它成功地解密了它的数据。Blowfish加密本身无法判断解密是否成功。此外(你不会喜欢这样的):
最好不要使用mcrypt,它是废弃软件,多年没有更新,不支持标准的PKCS#7填充,只有非标准的null填充,甚至不能与二进制数据一起使用。相反,可以考虑使用缓和措施,因为它正在得到维护,而且是正确的。
此外:不要依赖于参数填充,因为没有标准,每个实现都可以随心所欲。只需为IV和键提供正确的长度。
- 如何解密此javascript代码
- 如何从文本区域获取数据并使用javascript进行解密
- 制作我自己的加密/解密系统
- 使用 SJCL 在 Javascript 中加密,在 PHP 中解密
- AES-CTR 在 Go 中加密,在 CryptoJS 中解密
- 用Python编码,用Javascript解密
- react本机AES加密匹配Java解密算法
- 在.js档案中解密
- RSA使用jsencrypt加密,使用bouncy-castle解密
- 使用CryptoJS进行渐进式AES解密
- 用JavaScript加密字符串,用RSA技术用PHP解密
- RSA在JS和Python之间加密和解密(pycrypto)
- 与PHP解密相匹配的Javascript加密
- 角度指令验证和解密
- 可以't使用CryptoJS解密字符串
- javascript中的AES加密和java中的解密
- 如何使用forge加密和解密pdf blob并存储在localStorage中
- 如何在CryptoJS(nodejs/web浏览器)中解密AES 128
- 用PHP mcrypt加密的Javascript解密Blowfish CBC
- 在Visual Basic中加密AES,然后在服务器到客户端中解密AES