سؤال

ولدي الدالة التالية في روبي أن يفك شفرة قليلا من البيانات:

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 لا يبدو المساعدة والقضايا العادلة ليشكو من الرابع لا يجري طالما حجم الكتلة. أعتقد 128 هو الصحيح في هذه الحالة منذ rel="nofollow هذا الموقع يقول إن 128/256 هو مؤشرا على حجم الكتلة، وليس حجم المفتاح.

هل كانت مفيدة؟

المحلول 2

وتبين أنه كان يعمل على ما يرام، انها مجرد أن بيانات الاختبار بلدي كانت سيئة. التغييرين أدليت تستخدم pack() (بناء على اقتراح مقهى) وإسقاط الأحرف الحشو من نهاية المباراة.

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 homebrewed - لماذا لا تستخدم فقط pack('H*', $key)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top