【问题标题】:convert mcrypt algorithm to openssl PHP (MCRYPT_TripleDES, MCRYPT_MODE_CBC)将 mcrypt 算法转换为 openssl PHP (MCRYPT_TripleDES, MCRYPT_MODE_CBC)
【发布时间】:2020-07-17 15:51:34
【问题描述】:

我有一个使用已弃用 mcrypt 的解密代码,我需要将此函数转换为使用 openssl。 Stackoverflow上有很多类似的问题,但对我没有帮助。

这里是解密函数:

    public function decrypt($str, $key){
    //input
    $str = '9ACF38C842B3522415364850EAD1909BD43FD590BE3CBD539AD5FF6C7465973ABD61E8371E03282605ED06C994DF394244B7E7DAD54A046510484FAA724330C4C95A527D7891151E7C195D4136CBD70A87D1BD1F75473CF6B45A3F2FA8231DD71FFB4150E0BF4B133ECAA5ACC82CFD74903E21BC6EECB4B33AF39B8AF0C183A64002CFC125A55685C69A13192F3A9A4FDAC860E90C3FB6D125285E9E687BEFBE05707E131FC7ABE25FE35AB114FAE8A247B8C0F3DBA8AA74396D10564B7A0617EED913ED';
    $key = '10,10,10,10,10,10,10,10';

    //expected output:
    //'6706598320;67005551;100;00;YKB_TST_090519001330;0;0;https://setmpos.ykb.com/PosnetWebService/YKBTransactionService;posnettest.ykb.com;2225;N;0;Not authenticated;1557398383820;TL'
    outputsrand((double) microtime() * 10000000);
    $block = @mcrypt_get_block_size(MCRYPT_TripleDES, MCRYPT_MODE_CBC);
    $td = @mcrypt_module_open(MCRYPT_TripleDES, '', MCRYPT_MODE_CBC, '');
    $ks = @mcrypt_enc_get_key_size($td);

    if (strlen($str) < 16 + 8) return false;

    // Get IV
    $iv = pack("H*", substr($str, 0, 16));

    // Get Encrypted Data
    $encrypted_data = pack("H*", substr($str, 16, strlen($str)-16-8));

    // Get CRC
    $crc = substr($str, -8);

    // Check CRC
    /*if (!$this->checkCrc(substr($str, 0, strlen($str)-8), $crc)) {
        return "CRC is not valid! ($crc)";
    }*/

    // Initialize
    @mcrypt_generic_init($td, substr(strtoupper(md5($key)), 0, $ks), $iv);

    // Decrypt Data
    $decrypted_data = @mdecrypt_generic($td, $encrypted_data);

    $packing = ord($decrypted_data[strlen($decrypted_data) - 1]);

    if ($packing and ($packing < $block)) {
        for($P = strlen($decrypted_data) - 1; $P >= strlen($decrypted_data) - $packing; $P--) {
            if (ord($decrypted_data[$P]) != $packing) {
                $packing = 0;
            }
        }
    }

    return substr($decrypted_data, 0, strlen($decrypted_data) - $packing);

我试过了:

$encrypted_data = pack("H*", substr($str, 16, strlen($str)-16-8));
$iv = pack("H*", substr($str, 0, 16));
/returns FALSE when sample input above given
$decrypted_data = openssl_decrypt($encrypted_data, 'des-ede3-cbc', $key, OPENSSL_RAW_DATA, $iv);

有人可以帮帮我吗?

【问题讨论】:

    标签: php mcrypt encryption-symmetric php-openssl


    【解决方案1】:

    我错过了关键的转换步骤,这样做很有效:

    $decrypted_data = openssl_decrypt($encrypted_data, 'des-ede3-cbc', substr(strtoupper(md5($key)), 0, 24), OPENSSL_RAW_DATA, $iv);
    

    【讨论】:

      猜你喜欢
      • 2019-07-23
      • 2018-11-10
      • 2017-10-15
      • 2020-05-16
      • 2016-09-14
      • 2017-12-18
      • 2019-03-11
      • 2021-10-28
      • 1970-01-01
      相关资源
      最近更新 更多