سؤال

أحاول إجراء التشفير والتشفير (Rijndael 256 ، وضع ECB) في مكونين مختلفين:
1. PHP - Server Side (باستخدام Mcrypt)
2. C + + - جانب العميل (باستخدام GCrypt)

واجهت مشكلة عندما لم يتمكن جانب العميل من فك تشفير البيانات المشفرة بشكل صحيح (تم إجراؤه بواسطة جانب الخادم)
لذلك ... راجعت:
1. المتجه الأولي - نفسه (طول 32)
2. المفتاح - مرة أخرى نفس المفتاح على كلا الجانبين ..

لذلك كتبت بعض التعليمات البرمجية في C ++ التي ستشفر البيانات (مع نفس المعلمات كما في PHP)
ووجدت أن البيانات المشفرة تحتوي على بايتات مختلفة (ربما تشفير مشكلة ؟؟)

سأكون أكثر من سعيد للحصول على بعض المساعدة

PHP - Mcrypt


// Encrypt Function
function mc_encrypt($encrypt, $mc_key) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $iv = "static_init_vector_static_init_v";
    echo "IV-Size: " . $iv_size . "\n";
    echo "IV: " . $iv . "\n";
    $passcrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $mc_key, $encrypt, MCRYPT_MODE_ECB, $iv);
    print_hex($passcrypt);
    return $encode;
}

mc_encrypt("Some text which should be encrypted...","keykeykeykeykeykeykeykeykeykeyke");

سأقوم بنشر رمز C ++ في تعليق

شكرا ، جوني ديب

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

المحلول

نعم. سأجعل تعليقي إجابة:

لم يتم استخدام متجه التهيئة (IV) في وضع البنك المركزي الأوروبي. إذا تم توفير تطبيقات مختلفة ، فقد تعمل بشكل مختلف.

إذا كنت تريد التأكد من أن التطبيقات ستعمل بشكل صحيح ، فاستخدم IV من 0 (صفر). على الرغم من أنك توفر IV ، يجب أن يتجاهل كلا التنفيذيين ، لكن لا يمكن للمرء أن يكون متأكدًا من ذلك. يجب أن يعمل عدم توفير IV في وضع البنك المركزي الأوروبي كما أن يعمل ASWELL ولكن مرة أخرى ، كل هذا يتوقف على التطبيقات.

وفقا ل PHP توثيق سوف Mcrypt تجاهلها. gcrypt لست متأكدًا.

mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB) يجب أن تعود فعليًا 0 منذ تحديد وضع البنك المركزي الأوروبي.

يحرر:

لا تتصل mcrypt_get_iv_size أو mcrypt_create_iv.
بدلا من الاتصال mcrypt_encrypt بدون رابع. وفقا ل PHP توثيق سيتم ضبط جميع البايتات في IV على " 0".

الشيء نفسه ينطبق على رمز C ++. لا حاجة لتعيين أي IV على الإطلاق. رمز libgcrypt معقد ولكن من إلقاء نظرة على مصدر الإصدار 1.4.5 ثم في وضع ECB ، يبدو أن IV لا يستخدم على الإطلاق.

إذا كان النص المشفر الناتج لا يزال يختلف ، فإن المشكلة هي شيء آخر.
يتبادر إلى الذهن بعض الاحتمالات:

  • الترميز - هل هو نفس الترميز المستخدم في كل من الخادم والعميل؟
  • endianness - ما نوع الأنظمة الخادم والعميل؟ كبيرة مقابل ليتل إنديان؟
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top