PHP使用TripleDes,PKCS7和ECB加密/解密

Bra*_*een 7 php encryption ecb tripledes pkcs#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);

}
Run Code Online (Sandbox Code Playgroud)

这是我的解密功能:

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);
}
Run Code Online (Sandbox Code Playgroud)

现在我正在使用密钥,test我正在尝试加密1234567.我从我正在寻找的加密中得到base64输出,但是当我去解密时它什么都不返回(空白区域).

我不是很精通加密/解密所以任何帮助都非常感谢!!

Bra*_*een 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);

}
Run Code Online (Sandbox Code Playgroud)

这是新的解密功能.

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);
}
Run Code Online (Sandbox Code Playgroud)

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

  • $block 从未在 Decrypt 函数中使用 (2认同)