将Ruby AES256解密函数转换为PHP

时间:2009-10-27 02:36:46

标签: php ruby openssl aes

我在Ruby中有以下函数来解密一些数据:

def decrypt(key, iv, cipher_hex)
    cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')

    cipher.decrypt
    cipher.key = key.gsub(/(..)/){|h| h.hex.chr}
    cipher.iv = iv.gsub(/(..)/){|h| h.hex.chr}

    decrypted_data = cipher.update(cipher_hex.gsub(/(..)/){|h| h.hex.chr})
    decrypted_data << cipher.final

    return decrypted_data
end

我正在尝试用PHP做同样的事情,但我不确定我做错了什么。这就是我所拥有的:

function decrypt_data($key, $iv, $cipher_hex) {
    return mcrypt_decrypt(
        MCRYPT_RIJNDAEL_128, 
        hex_to_str($key), 
        hex_to_str($cipher_hex), 
        MCRYPT_MODE_CBC, 
        hex_to_str($iv)
    );
}

function hex_to_str($hex_str) {
    preg_match_all('/(..)/', $hex_str, $matches);

    $to_return = '';
    foreach ($matches[1] as $val)
        $to_return .= chr(hexdec($val));
    return $to_return;
}

输出结果只是垃圾,而不是我正在寻找的字符串。想法?

在我们开始之前,将它切换到MCRYPT_RIJNDAEL_256似乎没有帮助,只是让它抱怨iv不像块大小那样长。我相信在这种情况下128是正确的,因为this site表示128/256表示块大小,而不是密钥大小。

2 个答案:

答案 0 :(得分:1)

我个人对自制的hex_to_str功能有点怀疑 - 为什么不使用pack('H*', $key)

答案 1 :(得分:0)

事实证明它工作正常,只是我的测试数据很糟糕。我做的两个更改是使用pack()(在caf的建议中)并从最后删除填充字符。

function decrypt_data($key, $iv, $cipher_hex) {
    return rtrim(
        mcrypt_decrypt(
            MCRYPT_RIJNDAEL_128, 
            pack('H*', $key), 
            pack('H*', $cipher_hex), 
            MCRYPT_MODE_CBC, 
            pack('H*', $iv)
        ), 
        "\x00..\x1F"
    );
}