PHP Ruby AES256 şifresini dönüştürme fonksiyonu

2 Cevap php

Ben bir bit veri çözer Ruby aşağıdaki işlevi vardır:

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 aynı şeyi yapmaya çalışıyorum, ama ben yanlış yapıyorum emin değilim. İşte bende ne:

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

Çıkışı sadece olmaktan çöp değil, ben arıyorum dize biter. Fikirler?

Ve biz bile bunu geçiş, başlamadan önce MCRYPT_RIJNDAEL_256 yardım görünüyor ve sadece iv sürece blok boyutu olarak değil varlık hakkında şikayet için neden değildir. I this site 128/256 blok boyutunun bir göstergesi değil, anahtar boyutu olduğunu söylüyor beri 128 bu durumda doğru olduğuna inanıyorum.

2 Cevap

Bu benim test verileri kötü olduğunu sadece o, gayet iyi çalışıyordu çıkıyor. Ben yapılan iki değişiklik (caf önerisiyle) pack() kullanarak ve ucundan doldurma karakterleri bırakarak edildi.

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

Şahsen ben homebrewed hex_to_str fonksiyonu biraz şüpheli değilim - neden sadece kullanmak değil, pack('H*', $key)?