انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: رمزگشایی یک رشته در python-gnupg(حل شد)  (دفعات بازدید: 1733 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین سید وحید رضا برهانی

  • High Hero Member
  • *
  • ارسال: 1668
  • جنسیت : پسر
  • یک مخالف نرم افزار اوپن سورس
رمزگشایی یک رشته در python-gnupg(حل شد)
« : 12 آذر 1394، 06:46 ب‌ظ »
سلام
عنوان یک خورده بد شد!
من پایتون زیاد نمی دونم
من می خوام یک پیام که به صورت armor هست رو رمزگشایی کنم.
مثال decrypt در http://www.saltycrane.com/blog/2011/10/python-gnupg-gpg-example تا زمانی که encrypt  و decrypt توی یک اسکریپت و به همون صورتی که خودش توی مثالش گفته اجرا بشه خوب کار می کنه ولی اگر که یک متنی که از قبل رمز شده رو بهش بدیم دیگه کار نمی کنه. مثال:
import gnupg


gpg = gnupg.GPG(gnupghome='/tmp/gpghome')
gpg.encoding = 'utf-8'
unencrypted_string = 'its really really really work'

encrypted_string="""  -----BEGIN PGP MESSAGE-----
Version: GnuPG v2

hQEMAx44LzLsoT7QAQgA4R9QiOXni8ZLx6Kq+NKrrShNMOVFedJ2yGbGeZn37o0Z
BvlOcijkbi0XaiAgdHas9jq5hyxe6qMpfD1/dOuLTIAqOyhAICj6Gi+QwJyYMTq1
sjzc10v+cugYOyPl/Hq0rA2Q8JPw1uSDQr1dNKhx+BhH7aQJ2pi6RS2gDuR/phtA
Y2LqMGti+TPmK+vfmRqIDjJZyWUqhP8Fw9EMd1D/oHudhILnzeTF6xuJhsPiyao4
E0vbclApDAVrJT8vbTg5gDwGZbdPpjaNiMnCQ/5frv4benXXdHCvKAFP7bbD7vqm
2TBQNjtiaHcTjNRqIQNgVhIMvllJhveQQuRX/3x1WtJLAV8u58MvDEa4BE3+40v8
cA+U4OwK8i2tWq2203RQCdHNEED3i0n43RzASYWmYU7BHuvpy3FoYvbsyS/sWnce
L+jtQ3fER1eY/hLG
=Spua
-----END PGP MESSAGE-----"""
print (type(encrypted_string))


decrypted_data = gpg.decrypt(encrypted_string)

print ( 'stderr: ', decrypted_data.stderr)
و خزوجی اش
<class 'str'>
Exception in thread Thread-4:
Traceback (most recent call last):
  File "/usr/lib/python3.5/threading.py", line 923, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.5/threading.py", line 871, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/lib/python3.5/site-packages/gnupg.py", line 753, in _read_response
    result.handle_status(keyword, value)
  File "/usr/lib/python3.5/site-packages/gnupg.py", line 533, in handle_status
    Verify.handle_status(self, key, value)
  File "/usr/lib/python3.5/site-packages/gnupg.py", line 284, in handle_status
    raise ValueError("Unknown status message: %r" % key)
ValueError: Unknown status message: 'FAILURE'

Traceback (most recent call last):
  File "/tmp/c.py", line 26, in <module>
    print ( 'stderr: ', decrypted_data.stderr)
AttributeError: 'Crypt' object has no attribute 'stderr'
تنها چیز بدرد بخوری که پیدا کردم. یک پست در باگ ریپورت پروژه توی گوگل کد بود (لینک) که اونم بهش تگ invalid زدن! و به هر حال کار هم نمی کرد. برای تست کدم رو تغییر دادم به این:
import gnupg
from io import StringIO


gpg = gnupg.GPG(gnupghome='/tmp/gpghome')
gpg.encoding = 'utf-8'
unencrypted_string = 'its really really really work'

encrypted_string="""  -----BEGIN PGP MESSAGE-----
Version: GnuPG v2

hQEMAx44LzLsoT7QAQgA4R9QiOXni8ZLx6Kq+NKrrShNMOVFedJ2yGbGeZn37o0Z
BvlOcijkbi0XaiAgdHas9jq5hyxe6qMpfD1/dOuLTIAqOyhAICj6Gi+QwJyYMTq1
sjzc10v+cugYOyPl/Hq0rA2Q8JPw1uSDQr1dNKhx+BhH7aQJ2pi6RS2gDuR/phtA
Y2LqMGti+TPmK+vfmRqIDjJZyWUqhP8Fw9EMd1D/oHudhILnzeTF6xuJhsPiyao4
E0vbclApDAVrJT8vbTg5gDwGZbdPpjaNiMnCQ/5frv4benXXdHCvKAFP7bbD7vqm
2TBQNjtiaHcTjNRqIQNgVhIMvllJhveQQuRX/3x1WtJLAV8u58MvDEa4BE3+40v8
cA+U4OwK8i2tWq2203RQCdHNEED3i0n43RzASYWmYU7BHuvpy3FoYvbsyS/sWnce
L+jtQ3fER1eY/hLG
=Spua
-----END PGP MESSAGE-----"""
print (type(encrypted_string))
stream=StringIO()
stream.write(encrypted_string)
decrypted_data = gpg.decrypt_file(stream)

و خروجی آن

<class 'str'>
Exception in thread Thread-4:
Traceback (most recent call last):
  File "/usr/lib/python3.5/threading.py", line 923, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.5/threading.py", line 871, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/lib/python3.5/site-packages/gnupg.py", line 753, in _read_response
    result.handle_status(keyword, value)
  File "/usr/lib/python3.5/site-packages/gnupg.py", line 533, in handle_status
    Verify.handle_status(self, key, value)
  File "/usr/lib/python3.5/site-packages/gnupg.py", line 284, in handle_status
    raise ValueError("Unknown status message: %r" % key)
ValueError: Unknown status message: 'FAILURE'


خب حالا چیکار کنم


ویرایش (حل شد):
 قهمیدم :). مشکل از انکریپت کردنش بود (هنوز نفهمیدم از کجاشه). من اومدم از خود gpg استفاده کردم دیدم که این پیام های رمز شده رو اون هم نمی تونه باز کنه ولی اگر یک پیام رو با خود gpg رمز کنم به خوبی توی پایتون رمزگشایی می شه!
ویرایش دوم:(برای آینده‌گان)
نمی دونم مشکل دقیقا از چی بود ولی من از ورژن 0.3.7 استفاده می کردم وقتی به نسخه 0.3.8 آپدیت کردم مشکل اش حل شد و الان خیلی راحت می تونم دیکد کنم. در ضمن نسخه ی gpg من:
gpg (GnuPG) 2.1.9
libgcrypt 1.6.4
« آخرین ویرایش: 13 آذر 1394، 10:49 ق‌ظ توسط سید وحید رضا برهانی »
نرم افزاری که نشه سیخ انگولکش کرد (به هر دلیلی چه به‌خاطر قانون و چه پیچیدگی یا توسعه سریع)نرم افزار آزاد نیست حالا مهم نیست چه بنیادی یا چه افرادی اون رو نوشته باشند یا GPL باشه یانه!
نرم افزار آزاد یک جنبش هست نه یک تیکه کاغذ پاره(GPL)
حق فهمیدن از حق خوندن مهمتره

آفلاین häMǝd

  • Newbie
  • *
  • ارسال: 23
  • جنسیت : پسر
پاسخ : رمزگشایی یک رشته در python-gnupg
« پاسخ #1 : 12 آذر 1394، 08:51 ب‌ظ »
---
« آخرین ویرایش: 12 آذر 1394، 10:00 ب‌ظ توسط häMǝd »

آفلاین احمد حمزه ئی

  • Jr. Member
  • *
  • ارسال: 66
  • جنسیت : پسر
    • Github
پاسخ : رمزگشایی یک رشته در python-gnupg
« پاسخ #2 : 12 آذر 1394، 09:25 ب‌ظ »
سلام
اطلاعات خاصی در مورد رمز و این حرفا ندارم، اون لینکی که داده بودی رو دنبال کردم.
چیزی که متوجه شدم:
اول با این برنامه، کلید رو درست می کنیم:
import gnupg

gpg = gnupg.GPG(gnupghome=r'F:\To-Learn\Python\gnupg\gpghome')
input_data = gpg.gen_key_input(
    name_email='spam@gmail.com',
    passphrase='issosecret')
key = gpg.gen_key(input_data)

من ایمیل رو spam@gmail.com و پسورد رو issosecret انتخاب کردم.

بعد با این برنامه پیام رو کد می کنیم:
import gnupg

message = 'Hello ubuntu.ir'
message_file = 'private_msg.txt'

gpg = gnupg.GPG(gnupghome=r'F:\To-Learn\Python\gnupg\gpghome')
encrypted_data = gpg.encrypt(message, 'spam@gmail.com')
encrypted_string = str(encrypted_data)

with open(message_file, 'wb') as f:
f.write(encrypted_string.encode())

پیام من Hello ubuntu.ir هست و گفتم که پیام کد شده رو بریزه تو فایل private_msg.txt

خب حالا پیام کد شده تو فایل private_msg.txt اینطوریه:
-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.4.13 (MingW32)

hQEMA1kOh7yXbIbpAQf/VQWd2ofE79kAhGyIw5dpb9bOF0QKxAACEOp0EE7rWXhD
KbGTXNES/7FZ47JzjCHHW5mdaVxRukCBqSpD7yx1fIDT8IN9S6y6jCLwf/XTfBLG
CI7gSePuXe6K1qjRagQaOmcVC3bWV3kB4Rx+hP7V7q95AjBbH+5LxUVhaklGwa9u
vkOynRzZDOhxdF8sx0VTsSlOs2ddkx7VHLZKLqdDcT48sbxb0Jv6rNKM72iUdy0q
jtT03V6aD/D0FMNWq3KeNdDA+wTX9uFKY1aNYfXNfkJySzJ35RiNEScVhG3ARmnF
iipArUxHyhXHQnwipC8q5s/ZrnmfHojdDKb5RwzmndJKAXJYYKim2gzByWpw0NYU
ZkatjFp5SPsJj4XMVtvfXW6DZysntGq0L8OKatfW+k/O3xbopl8nnJRHNGSeNfpx
Iu++dpTJr8/YXP8=
=95Ju
-----END PGP MESSAGE-----

بعد برای اینکه از بین این چرت و پرت ها پیام رو باز کنم، از این کد استفاده میکنم:
import gnupg

message_file = 'private_msg.txt'

gpg = gnupg.GPG(gnupghome=r'F:\To-Learn\Python\gnupg\gpghome')
decrypted_data = gpg.decrypt(open(message_file).read(), passphrase='issosecret')

print('Status: ', decrypted_data.ok)
print('Decrypted string: ', decrypted_data.data)

خروجی این کد:
$ python decrypt_msg.py
Status:  True
Decrypted string:  b'Hello ubuntu.ir'

البته در صورتی که پسوردم درست نباشه، پیامی هم در کار نیست:
$ python decrypt_msg.py
Status:  False
Decrypted string:  b''

ویرایش: طبیعیه که میتونیم پیام کد شده رو به جای خوندن از فایل، کپی کنیم تو اسکریپتمون:
import gnupg

msg = '''-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.4.13 (MingW32)

hQEMA1kOh7yXbIbpAQf/VQWd2ofE79kAhGyIw5dpb9bOF0QKxAACEOp0EE7rWXhD
KbGTXNES/7FZ47JzjCHHW5mdaVxRukCBqSpD7yx1fIDT8IN9S6y6jCLwf/XTfBLG
CI7gSePuXe6K1qjRagQaOmcVC3bWV3kB4Rx+hP7V7q95AjBbH+5LxUVhaklGwa9u
vkOynRzZDOhxdF8sx0VTsSlOs2ddkx7VHLZKLqdDcT48sbxb0Jv6rNKM72iUdy0q
jtT03V6aD/D0FMNWq3KeNdDA+wTX9uFKY1aNYfXNfkJySzJ35RiNEScVhG3ARmnF
iipArUxHyhXHQnwipC8q5s/ZrnmfHojdDKb5RwzmndJKAXJYYKim2gzByWpw0NYU
ZkatjFp5SPsJj4XMVtvfXW6DZysntGq0L8OKatfW+k/O3xbopl8nnJRHNGSeNfpx
Iu++dpTJr8/YXP8=
=95Ju
-----END PGP MESSAGE-----
'''

gpg = gnupg.GPG(gnupghome=r'F:\To-Learn\Python\gnupg\gpghome')
decrypted_data = gpg.decrypt(msg, passphrase='issosecret')

print('Status: ', decrypted_data.ok)
print('Decrypted string: ', decrypted_data.data)

این طوری هم درست کار می کنه.
« آخرین ویرایش: 12 آذر 1394، 09:30 ب‌ظ توسط احمد حمزه ئی »

آفلاین سید وحید رضا برهانی

  • High Hero Member
  • *
  • ارسال: 1668
  • جنسیت : پسر
  • یک مخالف نرم افزار اوپن سورس
پاسخ : رمزگشایی یک رشته در python-gnupg
« پاسخ #3 : 12 آذر 1394، 09:31 ب‌ظ »
نقل‌قول
Traceback (most recent call last):
  File "/tmp/c.py", line 26, in <module>
    print ( 'stderr: ', decrypted_data.stderr)
AttributeError: 'Crypt' object has no attribute 'stderr

همون کد اولیت چرا stderr. گذاشتی؟


دلیل خاصی نداره! راستش تجربه ام می گفت این اونجا باشه برای دیباگ کردن بدرد می خوره(بزار رو حساب
ناشی گری و بیسوادی!)
ولی گیر از اون نیست! چون قبل از اینکه به اون خط برسه خطا می ده! و تو مثال دوم که حذفش کردم بازم خطا وجود داره
-------------------
به احمد حمزه‌ئی:
نه زمانی که از فایل می خونه مشکلی نیست . می تونی مثل من پیام رمز شده رو توی یک رشته بریزی بعد دیکد کنی؟


ویرایش:ممنون .پس اینطوری که معلومه مشکل از یک جای دیگه است.
« آخرین ویرایش: 12 آذر 1394، 09:37 ب‌ظ توسط سید وحید رضا برهانی »
نرم افزاری که نشه سیخ انگولکش کرد (به هر دلیلی چه به‌خاطر قانون و چه پیچیدگی یا توسعه سریع)نرم افزار آزاد نیست حالا مهم نیست چه بنیادی یا چه افرادی اون رو نوشته باشند یا GPL باشه یانه!
نرم افزار آزاد یک جنبش هست نه یک تیکه کاغذ پاره(GPL)
حق فهمیدن از حق خوندن مهمتره