Pergunta

Eu tenho a seguinte função em Ruby que decifra um bit de dados:

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

Eu estou tentando fazer exatamente a mesma coisa em PHP, mas não tenho certeza do que estou fazendo de errado. Aqui está o que eu tenho:

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;
}

A saída apenas acaba sendo lixo, não o fio Eu estou procurando. Ideias?

E antes mesmo de começar, ligá-lo para MCRYPT_RIJNDAEL_256 não parece ajuda e apenas faz com que ele se queixam da iv não ser tão longo como o tamanho do bloco. Eu acredito 128 está correto, neste caso, uma vez neste site diz que o 128/256 é uma indicação do tamanho do bloco, não o tamanho da chave.

Foi útil?

Solução 2

Acontece que ele estava funcionando bem, é apenas que os meus dados de teste era ruim. As duas alterações que fiz estavam usando pack() (por sugestão de caf) e soltando os caracteres de preenchimento a partir do final.

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"
    );
}

Outras dicas

Pessoalmente, eu sou um pouco suspeito da função hex_to_str Homebrewed - por que não usar pack('H*', $key)

?
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top