كيفية القيام PGP في Python (إنشاء مفاتيح ، تشفير/فك التشفير)

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

سؤال

أقوم بتوزيع برنامج في Python على مستخدمي Windows عبر مثبت.

يجب أن يكون البرنامج قادرًا على تنزيل ملف كل يوم مشفر مع مفتاح المستخدم العام ثم فك تشفيره.

لذلك أحتاج إلى العثور على مكتبة Python التي ستتيح لي إنشاء مفاتيح PGP العامة والخاصة ، وكذلك فك تشفير الملفات المشفرة مع المفتاح العام.

هل هذا شيء ستفعله pycrypto (الوثائق غامضة)؟ هل هناك مكتبات بيثون نقية أخرى؟ ماذا عن أداة سطر الأوامر المستقلة بأي لغة؟

كل ما رأيته حتى الآن هو GNUPG ، لكن تثبيت ذلك على Windows يقوم بأشياء للسجل ويلقي DLL في كل مكان ، ومن ثم يجب أن تقلق بشأن ما إذا كان المستخدم قد تم تثبيته بالفعل ، وكيفية النسخ الاحتياطي للمفاتيح الحالية ، وما إلى ذلك. أفضل مجرد الحصول على مكتبة Python أو أداة سطر الأوامر وارد المفاتيح بنفسي.

تحديث: قد يعمل Pyme ولكن لا يبدو أنه متوافق مع Python 2.4 الذي يجب علي استخدامه.

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

المحلول

لا تحتاج PyCrypto أو PyMe, ، على الرغم من أن هذه الحزم قد تكون - سيكون لديك جميع أنواع المشاكل تحت Windows. بدلاً من ذلك ، لماذا لا تتجنب ثقوب الأرانب وفعل ما فعلته؟ يستخدم gnupg 1.4.9. لا تحتاج إلى القيام بتثبيت كامل على آلات المستخدم النهائي - فقط gpg.exe و iconv.dll من التوزيع كافي ، وتحتاج فقط إلى جعلها في مكان ما في المسار أو الوصول إليها من رمز Python الخاص بك باستخدام مسار كامل. لا توجد حاجة إلى تغييرات على السجل ، ويمكن حصر كل شيء (تنفيذيات وملفات البيانات) في مجلد واحد إذا كنت تريد.

هناك وحدة نمطية GPG.py الذي كتبه في الأصل أندرو كوتشلينج ، تحسن من قبل ريتشارد جونز وتحسينه أكثر من ستيف تراوجوت. إنه موجود هنا, ، ولكن كما أنها ليست مناسبة لنظام التشغيل Windows لأنه يستخدم os.fork(). على الرغم من أن في الأصل جزء من PyCrypto, إنه مستقل تمامًا عن الأجزاء الأخرى PyCrypto ويحتاج فقط gpg.exe/iconv.dll من أجل العمل.

لدي نسخة (gnupg.py) مشتقة من تراوجوت GPG.py, الذي يستخدم subprocess وحدة. إنه يعمل بشكل جيد تحت Windows ، على الأقل لأغراضي - أستخدمه للقيام بما يلي:

  • الإدارة الرئيسية - توليد ، قائمة ، تصدير وما إلى ذلك.
  • مفاتيح الاستيراد من مصدر خارجي (مثل المفاتيح العامة التي تم استلامها من شركة شريكة)
  • تشفير وفك تشفير البيانات
  • توقيع والتحقق من التوقيعات

الوحدة النمطية التي حصلت عليها ليست مثالية لإظهارها في الوقت الحالي ، لأنها تتضمن بعض الأشياء الأخرى التي لا ينبغي أن تكون هناك - مما يعني أنه لا يمكنني إطلاقها في الوقت الحالي. في مرحلة ما ، ربما في الأسبوعين المقبلين ، آمل أن أكون قادرًا على ترتيبها ، وإضافة المزيد من اختبارات الوحدة (ليس لدي أي اختبارات للوحدة للتوقيع/التحقق ، على سبيل المثال) وإطلاقها (إما تحت الأصلي PyCrypto ترخيص أو رخصة صديقة تجارية مماثلة). إذا لم تتمكن subprocess وحدة.

كان هذا النهج أقل إيلامًا من الآخرين (على سبيل المثال SWIGحلول أو حلول تتطلب البناء مع MinGW/MSYS) ، والتي فكرت بها وتجربتها. لقد استخدمت نفس الشيء (gpg.exe/iconv.dll) النهج مع الأنظمة المكتوبة بلغات أخرى ، على سبيل المثال C#, ، مع نتائج غير مؤلمة على قدم المساواة.

PS يعمل مع Python 2.4 وكذلك Python 2.5 ثم في وقت لاحق. لم يتم اختباره مع الإصدارات الأخرى ، على الرغم من أنني لا أتوقع أي مشاكل.

نصائح أخرى

بعد الكثير من الحفر ، وجدت حزمة عملت بالنسبة لي. على الرغم من أنه يقال لدعم توليد المفاتيح ، إلا أنني لم أختبرها. ومع ذلك ، تمكنت من فك تشفير رسالة تم تشفيرها باستخدام مفتاح GPG العمومي. تتمثل ميزة هذه الحزمة في أنها لا تتطلب ملفًا قابلًا للتنفيذ GPG على الجهاز ، وهو تنفيذ قائم على Python لـ OpenPGP (بدلاً من غلاف حول القابل للتنفيذ). لقد قمت بإنشاء المفاتيح الخاصة والعامة باستخدام gpg4win و kleopatra لنظام التشغيل Windows انظر الكود الخاص بي أدناه.

import pgpy
emsg = pgpy.PGPMessage.from_file(<path to the file from the client that was encrypted using your public key>)
key,_  = pgpy.PGPKey.from_file(<path to your private key>)
with key.unlock(<your private key passpharase>):
    print (key.decrypt(emsg).message)

على الرغم من أن السؤال قديم جدًا. آمل أن يساعد هذا المستخدمين في المستقبل.

يدعم Pycrypto PGP - على الرغم من أنه يجب عليك اختباره للتأكد من أنه يعمل على مواصفاتك.

على الرغم من أنه من الصعب الحصول على الوثائق ، إذا نظرت من خلال util/test.py (البرنامج النصي اختبار الوحدة النمطية) ، يمكنك العثور على مثال بدائي لدعم PGP الخاص بهم:

if verbose: print '  PGP mode:',
obj1=ciph.new(password, ciph.MODE_PGP, IV)
obj2=ciph.new(password, ciph.MODE_PGP, IV)
start=time.time()
ciphertext=obj1.encrypt(str)
plaintext=obj2.decrypt(ciphertext)
end=time.time()
if (plaintext!=str):
    die('Error in resulting plaintext from PGP mode')
print_timing(256, end-start, verbose)
del obj1, obj2

يوفر Futhermore ، publickey/pubkey.py الطرق التالية ذات الصلة:

def encrypt(self, plaintext, K)
def decrypt(self, ciphertext):
def sign(self, M, K):
def verify (self, M, signature):
def can_sign (self):
    """can_sign() : bool
    Return a Boolean value recording whether this algorithm can
    generate signatures.  (This does not imply that this
    particular key object has the private information required to
    to generate a signature.)
    """
    return 1

بيم هل المطالبة بالتوافق الكامل مع Python 2.4 ، وأقتبس:

أحدث إصدار من Pyme (حتى كتابة هذه السطور) هو V0.8.0. تم تجميع توزيعها الثنائي لـ Debian باستخدام SWIG V1.3.33 و GCC V4.2.3 ل GPGME V1.1.6 و Python v2.3.5 و V2.4.4 و V2.5.2 (المقدم في التوزيع غير المستقر في ذلك الوقت). تم تجميع توزيعها الثنائي لنظام التشغيل Windows باستخدام SWIG V1.3.29 و MINGW V4.1 لـ GPGME V1.1.6 و Python v2.5.2 (على الرغم من أن نفس الثنائي يتم تثبيته ويعمل بشكل جيد في v2.4.2 أيضًا).

لست متأكدًا من سبب قولك "لا يبدو أنه متوافق مع Python 2.4 الذي يجب أن أستخدمه" - تفاصيل من فضلك؟

ونعم ، إنها موجودة كغسل شبه بيثوني (SWIGD) على GPGME-هذه طريقة شائعة لتطوير امتدادات Python بمجرد حصولك على مكتبة C تقوم بالمهمة بشكل أساسي.

PYPGP له مقاربة أبسط بكثير-لهذا السبب هو نص بيثون واحد بسيط: إنه في الأساس لا يفعل شيئًا أكثر من "صفق" على أوامر PGP لخط الأوامر. على سبيل المثال ، فك التشفير هو فقط:

def decrypt(data):
    "Decrypt a string - if you have the right key."
    pw,pr = os.popen2('pgpv -f')
    pw.write(data)
    pw.close()
    ptext = pr.read()
    return ptext

أي ، اكتب النص المشفر إلى الإدخال القياسي لـ pgpv -f, ، اقرأ الإخراج القياسي لـ PGPV كنص عادي.

يعد PYPGP أيضًا مشروعًا قديمًا للغاية ، على الرغم من أن بساطته تعني أن جعله يعمل مع Python الحديثة (على سبيل المثال ، العمليات الفرعية بدلاً من OS.Popen2 المخصصة الآن) لن يكون صعبًا. لكنك ما زلت بحاجة PGP تثبيت ، أو pypgp لن يفعل أي شيء ؛-).

M2Crypto لديه وحدة PGP ، لكنني في الواقع لم أحاول استخدامها. إذا حاولت ذلك ، وهو يعمل ، فيرجى إخبارنا (أنا حارس M2Crypto الحالي). بعض الروابط:

تحديث: لا توفر وحدة PGP طرقًا لإنشاء مفاتيح ، ولكن من المفترض أن يتم إنشاءها بمستوى أقل RSA, DSA إلخ. الوحدات النمطية. لا أعرف PGP الدواخل ، لذلك يجب عليك حفر التفاصيل. أيضًا ، إذا كنت تعرف كيفية إنشاء أوامر سطر أوامر OpenSSL ، فيجب أن يكون من السهل تحويل ذلك إلى مكالمات M2Crypto.

كما لاحظ الآخرون ، فإن Pyme هو الحل الكنسي لهذا ، لأنه يعتمد على GPGME ، وهو جزء من النظام البيئي GNUPG.

لنظام التشغيل Windows ، أوصي بشدة بالاستخدام GPG4win كتوزيع GNUPG ، لسببين:

يعتمد على GNUPG 2 ، والذي يتضمن ، من بين أشياء أخرى ، gpg2.exe, ، والتي يمكن (أخيرًا ، قد أضيف :) ابدأ gpg-agent.exe عند الطلب (GPG v1.x لا يمكن).

وثانياً ، إنها النوافذ الرسمية الوحيدة التي يبنيها مطورو GNUPG. على سبيل المثال ، تم تجميعها تمامًا من Linux إلى Windows ، لذلك لم يتم استخدام iota من البرامج غير المجانية في إعداده (مهم جدًا لمجموعة أمان :).

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