这可能是一个不可能的问题,但我正在将遗留系统从 Java 迁移到 PHP,并且我需要能够解密在 PHP 中使用 Jasypt 加密的字符串。
根据文档,Jasypt 使用以下算法:
- 将随机盐(我认为这与密码的初始化向量相同)附加到要加密的数据
- 重复加密 1000 次
- 将未加密的 salt/IV 添加到加密的字符串中
- Base64 编码整个字符串
遗留应用程序使用PBEWithMD5AndDES
Jasypt 算法。我完全知道 MD5 不是为解密而设计的,这不是我想要做的。
我只是想对字符串进行 DES 解密,这样我剩下的就是 MD5 哈希。除了 PHP 中的二进制垃圾,我似乎什么也得不到。我错过了什么?
<?php
#jasypt.algorithm=PBEWithMD5AndDES
$secret = 'secret-password';
$encrypted = 'xh/roK2diJPDfZGlT9DlwuG2TsS7t7F+';
$cipher = MCRYPT_DES;
$modes = array(
'ecb' => MCRYPT_MODE_ECB,
'cbc' => MCRYPT_MODE_CBC,
'cfb' => MCRYPT_MODE_CFB,
'ofb' => MCRYPT_MODE_OFB,
'nofb' => MCRYPT_MODE_NOFB,
'stream' => MCRYPT_MODE_STREAM,
);
foreach($modes as $mode => $mc) {
$iv_len = 0; //mcrypt_get_iv_size($cipher, $mode);
$password = base64_decode($encrypted);
$salt = substr($password, 0, $iv_len);
$data = substr($password, $iv_len);
for($i = 0; $i < 1000; $i++) {
$data = @mcrypt_decrypt($cipher, $secret, $data, $mode, $salt);
}
var_dump("$mode: $i: $data");
}