如何在PHP中解密Jasypt加密的字符串?

时间:2010-12-21 20:43:20

标签: java php mcrypt jasypt

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

According to the documentation,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");
}

3 个答案:

答案 0 :(得分:5)

您不理解“PBEWithMD5AndDES”的含义。

PBEWithMD5AndDES表示使用MD5对加密密码(字符串)进行哈希处理,以获得用作DES算法的加密密钥输入的字节数组以及要加密的文本。

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

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

希望这有帮助。

答案 1 :(得分:1)

Php for Java简化加密:https://github.com/kevwis/Phpsypt

答案 2 :(得分:1)

您缺少生成密钥。

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