رمزنگاری کلید عمومی در پایتون – تولید کلید، رمزنگاری و رمزگشایی با PyCryptodome در Python

0 143
۵/۵ - (۶ امتیاز)

فهرست

در این آموزش از سری آموزش های امنیت اطلاعات و برنامه نویسی آکادمی ترجنس قصد داریم به سراغ استفاده از API های ارائه شده در زبان پایتون، برای تولید کلید، رمزنگاری و رمزگشایی بر پایه سیستم های رمزنگاری کلید عمومی برویم. این آموزش برای پروژه هایی که نیاز به استفاده از رمزنگاری کلید عمومی در روال کار خود دارند مفید می باشد. با آموزش رمزنگاری کلید عممی در پایتون همراه باشید.

برنامه نویسی با استفاده از API های رمزنگاری کلید عمومی در پایتون

قبلا در مورد ریشه رمزنگاری کلید عمومی، یعنی پروتکل تبادل کلید دیفی-هلمن صحبت شده است. همچنین در مورد پیاده سازی سیستم های رمزنگاری و ملاحظات آن ها نیز به صورت مختصر صحبت کرده ایم. گفتیم که پیاده سازی کتابخانه ها و الگوریتم های رمزنگاری، علاوه بر برنامه نویسی نیاز به دانش عمیق رمزنگاری دارد و بزرگان این علم پیشنهاد کرده اند این الگوریتم ها را بهتر است برنامه نویسان، بدون داشتن دانش عمیق رمزنگاری پیاده سازی نکنند و بهتر است تحت یک کنسرسیوم یا گروه استاندارد این کار انجام شود. یک مقاله بسیار خوب نیز در مورد سیستم رمزنگاری کلید عمومی RSA در آکادمی ترجنس ارائه شده است.
گاهی استفاده از ابزارهایی مثل OpenSSL نیاز ما را برآورده نمی کنند و باید بتوانیم ابزارهای خود را توسعه دهیم. در زبان های برنامه نویسی مختلف کتابخانه هایی برای کار با سیستم های رمزنگاری وجود دارند که به صورت اصولی موارد مربوط به پایه های سطح پایین رمزنگاری را  پیاده سازی کرده اند. 
از آن جایی که در بسیاری از پروژه ها لازم است رمزنگاری استفاده شود، در این آموزش قصد داریم چگونگی کار با API های استاندارد ارائه شده در زمینه رمزنگاری کلید عمومی در پایتون را بررسی کنیم و برای این هدف به سراغ معروفترین سیستم رمزنگاری کلید عمومی یعنی RSA می رویم. این آموزش می تواند برای افرادی که قصد دارند پایان نامه خود که حاوی الگوریتم های رمزنگاری است را شبیه سازی کنند مفید باشد.
پایتون به صورت پیش فرض کتابخانه ای برای رمزنگاری ندارد اما پکیج های مختلفی برای پیاده سازی پایه های سطح پایین رمزنگاری در آن ارائه شده است. در این آموزش قصد داریم از پکیج PyCryptodome استفاده کنیم. مستندات مربوط به این کتابخانه در اینجا موجود است.

تولید کلید یا Key Generation در پایتون

در این بخش به تولید جفت کلیدهای RSA در پایتون با استفاده از کتابخانه PyCryptodome می رویم.
ابتدا موارد مورد نیاز را import کرده و سپس به تولید جفت کلید می پردازیم:

from Crypto.PublicKey import RSA

key = RSA.generate(2048)

تابع generate از کلاس RSA یک جفت کلید RSA تولید می کند. این تابع طول کلید را به عنوان آرگمان دریافت می کند. در این مثال کلید را ۲۰۴۸ بیتی انتخاب کرده ایم. توجه شود که مقدار پیش فرض برای e در اینجا ۶۵۵۳۷ (برای سرعت و کارایی) است که می توان با ارسال مقدار در آرگمان e این مقدار را تغییر داد (برای اطلاعات بیشتر به این مقاله مراجعه کنید).
برای ذخیره کلید لازم است تا آن را به جریانی از بایت ها تبدیل کنیم. با توجه به اینکه کلید RSA دارای ساختار خاصی است که لازم است این ساختار حفظ شود باید از روشی استفاده کنیم که این ساختار را بتواند مستقیم به جریانی از بایت ها تبدیل کند. به این کار سریال سازی یا Serialization می گویند. استانداردی که برای معرفی ساختار داده هایی که می توان آن ها را سریال سازی کرد ASN.1 است که به طور وسیع در شبکه و رمزنگاری به کار می رود. در ادامه عمل سریال سازی و ذخیره در فایل را انجام می دهیم:

pem = key.export_key(format='PEM', passphrase='password')
f = open('pv.pem', 'wb')
f.write(pem)
f.close()

تابع export_key ابتدا کلید را با استفاده از ASN.1 سریال سازی می کند. حال این نتیجه باینری باید قبل از ذخیره در فایل انکد شود. شماهای DER و PEM دو شمای استاندارد و معروف برای انکد کردن در رمزنگاری هستند که ما در اینجا از PEM استفاده کرده ایم که در این شما از Base64 استفاده می شود. آرگمان دوم هم که مربوط به کلمه عبوری است که برای حفاظت از کلید ارسال می شود (برای اطلاعات بیشتر به این آموزش مراجعه کنید). در ادامه هم که کلید را در فایلی به نام pv.pem ذخیره کرده ایم.
در ادامه کلید عمومی را از کلید تولید شده استخراج می کنیم:

pub = key.publicKey()
public_pem = pub.export_key(format='PEM')
f = open('pub.pem', 'wb')
f.write(public_pem)
f.close()

توصیحی که در اینجا لازم است تنها مربوط به خط اول است. این API کلید عمومی را از کلید تولید شده در مرحله قبلی استخراج می کند. باقی موارد مشابه مرحله قبل است.

رمزنگاری یا Encryption در پایتون

برای رمزنگاری یک پیام اول باید تصمیم بگیریم چه شمایی برای پدینگ (Padding) استفاده کنیم. برای امنیت بیشتر، ما در این آموزش از شمای OAEP استفاده می کنیم:

from Crypto.Cipher import PKCS1_OAEP
from Crypto.PublicKey import RSA

message = b'this is a secret message'

key = RSA.importKey(open('pub.pem').read())

در ابتدا پیامی که قصد داریم آن را رمز کنیم را در متغیر باینری message مشخص کرده ایم. پس از آن کلید را برای رمزنگاری import می کنیم (می خوانیم). طبیعی است که این کلید باید کلید عمومی باشد چرا که عملیات رمزنگاری با استفاده از کلید عمومی انجام می شود. در ادامه شمای Padding را مشخص می کنیم و در شئ cipher قرار می دهیم و سپس با استفاده از این شئ پیام را رمز می کنیم:

cipher = PKCS1_OAEP.new(key)
ciphertext = cipher.encrypt(message)
f = open(ciphertext, 'wb')
f.write(ciphertext)
f.close()

تابع encrypt با دریافت متن رمز نشده به عنوان آرگمان آن را با الگوریتم رمزنگاری RSA رمزنگاری می کند. سپس متن رمز شده را در فایلی ذخیره می کنیم.

رمزگشایی یا Decryption در پایتون

در این بخش پیام رمز شده در بخش قبلی را رمزگشایی می کنیم. روال کار مشابه روال قبلی است با این تفاوت که برای رمزگشایی باید از کلید خصوصی استفاده شود و بنابراین باید کلمه عبوری که در مرحله ساخت کلید مشخص کردیم را نیز ارسال کنیم:

from Crypto.Cipher import PKCS1_OAEP
from Crypto.PublicKey import RSA

ciphertext = open('ciphertext', 'rb').read()

pv_pem = open('pv.pem').read()
pv = RSA.importKey('pv_pem', passphrase='password')
cipher = PKCS1_OAEP.new(pv)
message = cipher.decrypt(ciphertext)
print(message)

توجه کنید که چون در مرحله تولید کلید کلمه عبوری انتخاب کردیم، اینجا هم هنگام import کردم کلید لازم است کلمه عبور را به عنوان آرگمانی ارائه کنیم. در نهایت تابع decrypt اقدام به رمزگشایی پیام رمزشده توسط الگوریتم رمزگشایی RSA می کند.

توجه!

از الگوریتم های رمزنگاری کلید عمومی برای رمز کردن پیام یا فایل های بزرگ استفاده نمی شود چرا که این الگوریتم به دلیل استفاده از ریاضیات پیچیده و سنگین در محاسبه بسیار کند هستند. از الگوریتم های کلید عمومی عمدتا برای ساخت کلید جلسه (سشن) یا Session Key استفاده می شود. اگر این مقاله را بخوانید متوجه می شود که طول پیامی که قصد داریم آن را رمز کنیم باید کمتر از پیمانه مورد استفاده در RSA باشد. بنابراین این نکته را مورد نظر قرار دهید که برای پیام ها و فایل های بزرگ بهتر است با استفاده از RSA یک کلید جلسه به اشتراک بگذارید و پس از آن از الگوریتم های سریع تر مثل AES استفاده کنید. بعدا این مورد را در پیاده سازی ارتباط امن TLS مورد بررسی قرار می دهیم.

سخن پایانی

در این آموزش از سری آموزش های امنیت اطلاعات و برنامه نویسی آکادمی ترجنس استفاده از API های رمزنگاری در زبان پایتون (رمزنگاری کلید عمومی در پایتون) را بررسی کردیم. در مقالات بعدی قصد داریم چگونگی تولید کلید جلسه و رمزنگاری کارا روی یک ارتباط امن را به صورت عملی مورد بررسی قرار دهیم.

درباره ما

ترجنس | thregence.ir
آکادمی ترجنس | edu.thregence.ir
دوره‌های آکادمی ترجنس | courses.thregence.ir
اینستاگرام | instagram.com/thregence
تلگرام | t.me/thregence
یوتوب | https://bit.ly/30mGowo
آپارات | aparat.com/thregence

ارسال یک پاسخ