0

这可能是一个不可能的问题,但我正在将遗留系统从 Java 迁移到 PHP,并且我需要能够解密在 PHP 中使用 Jasypt 加密的字符串。

根据文档,Jasypt 使用以下算法:

  • 将随机盐(我认为这与密码的初始化向量相同)附加到要加密的数据
  • 重复加密 1000 次
  • 将未加密的 salt/IV 添加到加密的字符串中
  • Base64 编码整个字符串

遗留应用程序使用PBEWithMD5AndDESJasypt 算法。我完全知道 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");
}
4

3 回答 3

5

您不理解“PBEWithMD5AndDES”的含义。

PBEWithMD5AndDES 意味着加密密码(字符串)使用 MD5 进行散列,以获得用作 DES 算法的加密密钥输入的字节数组以及要加密的文本。

因此,无法使用 DES 解密以获得 MD5 哈希。这是没有意义的。您只需要使用完全相同的算法解密该加密数据,但在 PHP 实现中。

顺便说一句,“PBEWithMD5AndDES”不是“jasypt 算法”。它是一种 Java 加密扩展 (JCE) 算法。Jasypt 本身不实现任何算法。

希望这可以帮助。

于 2010-12-22T00:30:51.847 回答
1

您缺少生成密钥。

我不得不为我的一个客户做同样的事情,并写了几行代码来帮助解决问题:https ://github.com/kevinsandow/PBEWithMD5AndDES

于 2014-01-28T13:26:47.537 回答
1

此处为 Java 简化加密的 PHP:https ://github.com/kevwis/Phpsypt

于 2013-08-09T17:12:09.620 回答