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

Jon*_*ill 0 php java mcrypt jasypt

这可能是一个不可能的问题,但我将遗留系统从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");
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*dez 5

您不了解"PBEWithMD5AndDES"的含义.

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

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

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

希望这可以帮助.