سؤال

أحتاج إلى تشفير متوسطة إلى قوية على ServerSide، لذلك اعتقدت أنني سوف أستخدم MCrypt مع PHP. إذا كنت تستخدم الوظائف الموجودة أسفل بداية السلسلة الأصلية تتحول إلى القمامة الثنائية بعد فك التشفير. (هذه ليست المشكلة المعتادة للحصول على إلحاق إضافي القمامة، بدلا من بلدي سلسلة بلدي تغيير.) وفقا للوثائق، يجب أن يكون mcript_Encrypt () أحرفا كافية مبطنة لتتناسب مع حجم كتلة الخوارزمية المحددة ولكني أظن أنه لا يعمل.

ومع ذلك، إذا قمت بمنوحة ذلك يدويا إلى حجم كتلة 128 بت (16 بايت) من ريخندل، فإنه لا يعمل أيضا. الطريقة الوحيدة التي يمكنني الحصول عليها من العمل هي بإعداد بعض السلسلة لفترة كافية بما يكفي (من المحتمل) تغطي كتلة القوائم وتضيف بادئة معروفة مثل "البيانات" بين تلك السلسلة وبياناتي. بعد فك التشفير تم تشكيل كتلة جزئيا ولكن البادئة الخاصة بي وجميع البيانات بعد فك تشفيرها بشكل صحيح.

$GLOBALS['encryptionmarker'] = 'DATA#';

function encrypt($plain, $key) {
    /*
    // workaround because beginning of decrypted string is being mangled
    // so we simply prefix with some text plus marker
    $prefix = str_pad('', 128, '#', STR_PAD_RIGHT).$GLOBALS['encryptionmarker'];
    $plain = $prefix.$plain;
    */

    $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $plain, MCRYPT_MODE_CFB,
        mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB),
        MCRYPT_DEV_URANDOM));

    return $encrypted;
}

function decrypt($encrypted, $key) {
    $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $encrypted, MCRYPT_MODE_CFB,
        mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB),
        MCRYPT_DEV_URANDOM));

    /*
    // workaround: remove garbage
    $pos = strpos($decrypted, $GLOBALS['encryptionmarker']);
    $decrypted = trim(substr($decrypted, $pos + strlen($GLOBALS['encryptionmarker'])));
    */

    return $decrypted;
}

ما الخطأ في وظائفي؟ لماذا يجب علي بادئة بياناتي من هذا القبيل (أعتبرها عبارة عن حلول قذر، لذلك أود إصلاحها)؟

تخزين البيانات المشفرة ليست هي المشكلة؛ فك تشفيرها مباشرة بعد التشفير دون تخزينها إلى نتائج قاعدة بيانات في نفس الأخطاء.

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

المحلول

مشكلتك هي أن تقوم بتوليد جديدة ومختلفة عشوائية عشوائية على الجانب الاستقبال. هذا لا يعمل، كما رأيته.

يحتاج المتلقي إلى معرفة الرابع الذي يستخدم المرسل؛ لذلك عليك أن ترسلها مع البيانات المشفرة وتمريرها إلى mcrypt_decrypt().

لاحظ أنه يجب عليك أيضا استخدام mhash() مع مفتاح (مفتاح مختلف لمفتاح التشفير) لإنشاء HMAC عبر الرسالة، والتحقق من ذلك على الجانب الاستقبال. إذا لم تفعل ذلك، فيمكن أن يعدل الإنسان في الوسط أجزاء تافهة رسالتك دون اكتشافه.

نصائح أخرى

استخدم نفس الرابع في EN- وفك التشفير. الرابع ليس سر مشترك، ولكن يجب مشاركته. قد تستشير ويكيبيديا: الرابع

$IV = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB),
      MCRYPT_DEV_URANDOM));

يجب نقل الرابع مرة واحدة. قد ترغب في زيادة قيمة IV لكل حزمة. ولكن يمكن القيام بذلك على كلا الجانبين بشكل مستقل.

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