تعارض مكتبات التشفير (Mcrypt ، libgcrypt)
سؤال
أحاول إجراء التشفير والتشفير (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 - ما نوع الأنظمة الخادم والعميل؟ كبيرة مقابل ليتل إنديان؟