将mcrypt 3DES ECB转换为openssle_encrpt

问题描述 投票:1回答:1

我正在将MCRYPT ECB转换为打开的SSL ECB

MCRYPT功能

public function encrypt($input) {
    $vi = base64_decode($this->iv);
    $key = mb_convert_encoding($this->key, "UTF8");
    $key = md5($key,true);
    $key = $this->processKey($key);     
    $input = $this->addPKCS7Padding($input);
    $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_ECB, '');
    mcrypt_generic_init($td, $key, $vi);
    $data = mcrypt_generic($td, $input);
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    $data = base64_encode($data);
    return $data;
}
private function processKey($key) {
    // Complete the key
    $key_add = 24 - strlen($key);
    $key .= substr($key, 0, $key_add);

    // Padding the text
    $text_add = strlen($text)%8;
    for ($i=$text_add; $i<8; $i++){
        $text .= chr(8-$text_add);
    }
    return $key;
}

private function addPKCS7Padding($source) {
    $block = mcrypt_get_block_size('tripledes', 'cbc');
    $pad = $block - (strlen($source) % $block);
    if ($pad <= $block) {
        $char = chr($pad);
        $source .= str_repeat($char, $pad);
    }
    return $source;
}

来自here

mcrypt_module_open ( MCRYPT_3DES, '', 'ecb', '' )  == "DES-EDE3"

来自旧示例

1,md5键并转换为utf 8

2,添加PKCS7Padding openssl已经执行PKCS#7填充(所以我不添加)

在我的功能之前

function encry_it($data,$cipher_method,$secret_key ,$iv){
    $secret_key = md5(utf8_encode($secret_key), true);
    $result = openssl_encrypt($data, $cipher_method, $secret_key, $options=OPENSSL_RAW_DATA);
    return base64_encode($result);
}

加密结果不同我不能将IV添加到openssl函数,因为它的错误是说此DES-EDE3期望0 IV因此,为什么会有不同的结果?

谢谢希望高端开发人员可以帮助我,谢谢

php encryption openssl 3des block-cipher
1个回答
0
投票

这里似乎存在复制/粘贴错误,这导致processKeyaddPKCS7Padding功能混合在一起。可能必须是:

private function processKey($key) {
    // Complete the key
    $key_add = 24 - strlen($key);
    $key .= substr($key, 0, $key_add);
    return $key;
}

private function addPKCS7Padding($text) {
    // Padding the text
    $text_add = strlen($text)%8;
    for ($i=$text_add; $i<8; $i++){
        $text .= chr(8-$text_add);
    }
    return $text;
}

这样,如果在openssl代码中,openssl代码将返回与mcrypt代码相同的密文:

  1. $cipher_method等于des-ede。原因:MD5摘要返回一个16字节的哈希,通过附加前8个字节,该哈希在mcrypt代码的processKey中扩展为24个字节。结果用作与2TDEA对应的键。在openssl代码中,如果应用了des-ede标识符,则可以直接将MD5摘要的16个字节的哈希值用作[2TDEA]的密钥(而不是与des-ede对应的des-ede3标识符,如果使用24个字节)使用由三个不同的DES密钥组成的密钥)。 注意:或者,可以在openssl代码中使用des-ede3标识符,在这种情况下,必须将密钥扩展为类似于mcrypt代码的24个字节。

  2. 3TDEA替换为des-ede3(在mcrypt代码中也使用)。原因:utf8_encodeutf8_encode具有不同的功能,并且通常会产生不同的结果:mb_convert_encoding(..., "UTF8")将ISO-8859-1编码转换为UTF-8编码。 mb_convert_encoding(..., "UTF8")在任意两种编码(每种都要指定)之间转换,即utf8_encode将一种编码(要指定)转换成UTF-8编码。因此,如果转换了ISO-8859-1编码,则两个函数仅返回相同的结果。

  3. 已通过Base64解码的IV通过。原因:在mcrypt代码中,IV是通过Base64解码的,而在openssl代码中则不是。

关于安全性:mcrypt代码(以及由此衍生出的openssl代码)使用ECB模式和MD5摘要作为KDF,两者都不安全。更好的选择是GCM和PBKDF2。此外,应使用AES代替TripleDES,而不仅仅是出于安全性考虑,还是出于性能mb_convert_encoding的考虑。

© www.soinside.com 2019 - 2024. All rights reserved.