باستخدام MCrypt لفك تشفير النص المشفر (وضع CBC 3DES)

StackOverflow https://stackoverflow.com/questions/1142477

  •  16-09-2019
  •  | 
  •  

سؤال

لدي النص المشفر، مشفرة في وضع 3DES CBC، وأواجه بعض المشاكل في فك تشفيره. لدي المعلومات التالية (القيم الفعلية):

<?php
// Three 16 character long keys
$key1 = '1234567890123456';
$key2 = '6543210987654321';
$key3 = '6549873210456123';

// The initialisation vector
$ivec = '0102030405060708';

// A token which looks something like this
$token = '2ad82e09e3b4e7c491e4bb9fb7c606e1';
?>

أنا أساس وظيفة فك التشفير الخاصة بي قبالة فئة PHP الموجودة في هذه المدونة post.. وبعد تبدو هكذا:

<?php
function decrypt($key,$iv,$token) {
    $td = mcrypt_module_open('tripledes', '', 'cbc', ''); 
    $iv = substr($iv, 0, mcrypt_enc_get_iv_size($td)); 
    $expected_key_size = mcrypt_enc_get_key_size($td); 

    $key = substr(md5($key), 0, $expected_key_size); 
    mcrypt_generic_init($td, $key, $iv);

    $decrypted_string = trim(mdecrypt_generic($td, base64_decode($token)));

    mcrypt_generic_deinit($td); 
    mcrypt_module_close($td); 

    return $decrypted_string;
}
?>

ومع ذلك، لست متأكدا من كيفية إطعام المفاتيح الثلاثة في الخوارزمية. لقد حاولت تسليحهم معا مثل ذلك: Key1 $ 1. $ key2. $ key3، وفي ترتيب عكسي، ولكن دون جدوى.

سيكون موضع تقدير أي مساعدة.

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

المحلول

// ثلاثة مفاتيح طويلة 16 حرف
$ cultion_key_size هو 24، 3 * 8. على الأرجح مفاتيح المفاتيح بتنسيق عرافة.

function foo($hex) {
    $rv = '';
    foreach(str_split($hex, 2) as $b) {
        $rv .= chr(hexdec($b));
    }
    return $rv;
}

// Three 16 character long keys
$key1 = '1234567890123456';
$key2 = '6543210987654321';
$key3 = '6549873210456123';

$key = foo($key1.$key2.$key3);

نصائح أخرى

لقد وجدت المشكلة مع الوظيفة في النهاية. كان مزيجا من تحويل المفتاح، IVEC و Token من عرافة، وإزالة علامة تجزئة MD5 من مفتاح فك التشفير وإزالة فك تشفير Base64 للنص العادي الناتج.

كانت شخصية الحشو التي أسفرت عن النص العادي غريبا بعض الشيء، ولكنها جردت مع Rtrim (). قد تجدر الإشارة أيضا إلى أن التشفير قد تم في البداية في JSP باستخدام بعض مكتبات Java القياسية، لذلك قد يكون هذا مفيدا لأي شخص آخر يمضي من تشفير Java ← فك التشفير PHP.

شكرا لمساعدتكمكم Volkerk، إليك الوظيفة التي انتهيت منها باستخدام (بما في ذلك وظيفة HEX الخاصة بك التي لم أقم بإضافتها أدناه):

$algorithm = 'tripledes';
$key   = 'F123ACA...'; // Some hex key
$ivec  = 'FE12FA1...'; // Some hex ivec
$token = 'F2ACE12...'; // Some hex token
$mode  = 'cbc';

$key    = foo($key);
$ivec   = foo($ivec);
$token  = foo($token);

function decrypt($key,$iv,$algorithm,$mode,$token) {
    $td = mcrypt_module_open($algorithm, '', $mode, '') ; 
    $iv = substr($iv, 0, mcrypt_enc_get_iv_size($td));

    $expected_key_size = mcrypt_enc_get_key_size($td); 
    $key = substr($key, 0, $expected_key_size); 

    mcrypt_generic_init($td, $key, $iv);

    $response = rtrim(mdecrypt_generic($td, $token), '');

    mcrypt_generic_deinit($td); 
    mcrypt_module_close($td); 

    return $response;
}

$plaintext = decrypt($key,$ivec,$algorithm,$mode,$token);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top