문제

루비에는 약간의 데이터가 해독되는 다음 기능이 있습니다.

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이 정확하다고 생각합니다 이 지역 128/256은 키 크기가 아니라 블록 크기의 표시라고 말합니다.

도움이 되었습니까?

해결책 2

잘 작동하는 것으로 밝혀졌습니다. 단지 테스트 데이터가 나빴습니다. 내가 만든 두 가지 변경 사항은 사용하는 것이 었습니다 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"
    );
}

다른 팁

개인적으로 나는 집안일에 대해 조금 의심 스럽다 hex_to_str 기능 - 왜 사용하지 않는가 pack('H*', $key)?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top