سؤال

أحتاج إلى أن أكون قادرًا على إرسال بيانات مشفرة بين عميل Ruby وخادم Python (والعكس صحيح) وأواجه مشكلة مع روبي-aes جوهرة/مكتبة.المكتبة سهلة الاستخدام للغاية ولكننا نواجه مشكلة في تمرير البيانات بينها وبين مكتبة pyCrypto AES الخاصة بـ Python.تبدو هذه المكتبات جيدة عندما تكون الوحيدة المستخدمة، ولكن لا يبدو أنها تعمل بشكل جيد عبر حدود اللغة.أيه أفكار؟

يحرر:نحن نقوم بالاتصال عبر SOAP وحاولنا أيضًا تحويل البيانات الثنائية إلى base64 ولكن دون جدوى.وأيضًا، من المهم أيضًا أن يكون التشفير/فك التشفير متماثلًا تقريبًا ولكن ليس تمامًا بين الاثنين (على سبيل المثال، تختلف الأطوال بمقدار واحد أو هناك أحرف غير مرغوب فيها إضافية في نهاية السلسلة التي تم فك تشفيرها)

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

المحلول 2

وتبين ما حدث هو أن روبي-AES منصات البيانات تلقائيا لملء 16 حرف والعصي حرف فارغة في نهاية السلسلة النهائية كما هو محدد. يتطلب PyCrypto لك أن تفعل مضاعفات 16 حرف بحيث كان كيف أحسب ما روبي-AES كان يقوم به.

نصائح أخرى

<اقتباس فقرة>   

و(على سبيل المثال، أطوال تختلف من واحدة أو هناك هي الأحرف القمامة اضافية على نهاية سلسلة فك)

وفاتني أن قليلا. لا يوجد شيء خاطئ مع الخاص بك التشفير / فك التشفير. هذا يبدو وكأنه مشكلة الحشو. AES دائما يشفر البيانات في كتل من 128 بت. إذا كان طول البيانات ليست من مضاعفات 128 بت يجب مبطن البيانات قبل التشفير ويحتاج الحشو إلى إزالة / تجاهله بعد التشفير.

من الصعب حتى تخمين ما يحدث دون مزيد من المعلومات ...

لو كنت مكانك، لتحققت من ذلك في برامج بايثون وروبي الخاصة بك:

  1. المفاتيح هي نفسها (من الواضح).قم بتفريغها على شكل سداسي عشري وقارن كل بايت.
  2. ناقلات التهيئة هي نفسها.هذه هي المعلمة IV في AES.new() في pyCrypto.تفريغها كما عرافة أيضا.
  3. الأوضاع هي نفسها.المعلمة mode في AES.new() في pyCrypto.

هناك افتراضيات ل IV و mode في pyCrypto، لكن لا تثق في أنها هي نفسها الموجودة في تطبيق Ruby.استخدم أحد الأوضاع الأبسط، مثل CBC.لقد وجدت أن المكتبات المختلفة لديها تفسيرات مختلفة لكيفية عمل الأوضاع المعقدة، مثل PTR.

تحتوي ويكيبيديا على مقالة رائعة حول كيفية القيام بذلك أوضاع تشفير الكتلة.

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

f = open('/path/to/file', 'rb')

وو"ب" إلى ثنائية. وإذا كنت تكتب البيانات المشفرة لملف من بيثون:

f = open('/path/to/file', 'wb')
f.write(encrypted_data)

وأساسا ما قال هيو فوق: تحقق والأحجام الرئيسية وسائط تسلسل الرابع لتأكد من كل شيء مطابق

واختبار كلا الجانبين بشكل مستقل، ترميز بعض المعلومات والتحقق من روبي وبيثون endoded أنه مماثل. كنت على افتراض أن المشكلة لا علاقة لها التشفير، لكنه قد يكون مجرد شيء بسيط مثل إرسال البيانات المشفرة مع puts الذي يلقي أسطر جديدة عشوائية في البيانات. مرة واحدة كنت على يقين من أنهم تشفير البيانات بشكل صحيح، تأكد من أن تتلقى بالضبط ما كنت تعتقد أنك أرسلت. الاستمرار خطوة خطوة حتى تجد المرحلة التي تفسد البيانات.

وأيضا، أنا أقترح باستخدام مكتبة بينسل الذي تم تضمينه في المكتبة القياسية روبي بدلا من استخدام الأحجار الكريمة الخارجي.

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