PHP使用TripleDes、PKCS7和ECB进行加密/解密

7
我可以帮助您进行翻译。以下是需要翻译的内容:

我的加密函数已经正常工作,但我无法弄清如何使解密函数产生正确的输出。

这是我的加密函数:

function Encrypt($data, $secret)
{    
  //Generate a key from a hash
  $key = md5(utf8_encode($secret), true);

  //Take first 8 bytes of $key and append them to the end of $key.
  $key .= substr($key, 0, 8);

  //Pad for PKCS7
  $blockSize = mcrypt_get_block_size('tripledes', 'ecb');
  $len = strlen($data);
  $pad = $blockSize - ($len % $blockSize);
  $data .= str_repeat(chr($pad), $pad);

  //Encrypt data
  $encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb');

  return base64_encode($encData);

}

这是我的解密函数:

function Decrypt($data, $secret)
{
    $text = base64_decode($data);

    $data = mcrypt_decrypt('tripledes', $secret, $text, 'ecb');

    $block = mcrypt_get_block_size('tripledes', 'ecb');
    $pad   = ord($data[($len = strlen($data)) - 1]);

    return substr($data, 0, strlen($data) - $pad);
}

我现在正在使用密钥test并尝试加密1234567。我得到了所需的base64输出,但当我尝试解密时,返回了一个空白区域。

我对加密/解密不是很熟悉,所以非常感谢任何帮助!


2
我建议用AES替换3DES,用CBC替换ECB,并添加MAC。 - CodesInChaos
感谢您的推荐 @CodesInChaos。我无法更改诸如此类的具体信息,必须使用我已经拥有的,尽管它可能不太安全。 - Brandon Green
1个回答

15

感谢所有查看我的问题的人。我认为我已经解决了这个问题,以下是我的完整解决方案。希望它能够帮助其他遇到类似问题的人:

function Encrypt($data, $secret)
{    
  //Generate a key from a hash
  $key = md5(utf8_encode($secret), true);

  //Take first 8 bytes of $key and append them to the end of $key.
  $key .= substr($key, 0, 8);

  //Pad for PKCS7
  $blockSize = mcrypt_get_block_size('tripledes', 'ecb');
  $len = strlen($data);
  $pad = $blockSize - ($len % $blockSize);
  $data .= str_repeat(chr($pad), $pad);

  //Encrypt data
  $encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb');

  return base64_encode($encData);

}

这里是新的解密函数。

function Decrypt($data, $secret)
{

    //Generate a key from a hash
    $key = md5(utf8_encode($secret), true);

    //Take first 8 bytes of $key and append them to the end of $key.
    $key .= substr($key, 0, 8);

    $data = base64_decode($data);

    $data = mcrypt_decrypt('tripledes', $key, $data, 'ecb');

    $block = mcrypt_get_block_size('tripledes', 'ecb');
    $len = strlen($data);
    $pad = ord($data[$len-1]);

    return substr($data, 0, strlen($data) - $pad);
}

在运行 mycrypt_decrypt 函数之前,我不得不添加相同的代码以正确生成密钥格式。


2
在Decrypt函数中,$block从未被使用。 - omarjebari
由于mcrypt将来会从PHP中删除,如何使用openssl_decrypt方法进行解密? - W.M.
有没有这个的 Python 版本,我非常感激! - linhtruong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接