رمزگذاری فایل‌ها با GnuPG

رمزگذاری استفاده از تکنیک‌های ریاضی، برای برقراری امنیت اطلاعات است. در این مطلب یک رمزگذاری قدرتمند در ترمینال گنو/لینوکس را به شما آموزش می‌دهم تا بتوانید فایل‌هایتان را با امنیت بسیار بالا حتی در بسترهایی که دارای امنیت پایینی هستند نیز به اشتراک گذاشته یا ذخیره سازی کنید.

بنابراین اگر به امنیت اطلاعات خود اهمیت می‌دهید این مطلب را از دست ندهید.

در این مطلب به رمزگذاری و رمزگشایی فایل‌ها با GnuPG خواهم پرداخت …


۱. معرفی

رمزگذاری (Encryption) فرآیند تبدیل و ذخیره اطلاعات به صورتی امن می‌باشد و رمزگشایی (Decryption) فرآیند تبدیل فایل‌های رمزگذاری شده به حالت بدون رمز و عادی می‌باشد. اولین چیزی که برای امنیت رمزگذاری واجب است، شخصی بودن آن رمزگذاری می‌باشد. بنابراین شما به یک الگوریتم رمز و یک کلید رمز برای استفاده و دسترسی به آن الگوریتم نیاز دارید.

وقتی که این دو را ایجاد کنیم شما می‌توانید هر فایلی را رمزنگاری و رمزگشایی کنید.

اما این پایان کار نیست و گاهی اوقات شما می‌خواهید یک فایل را برای دیگران به اشتراک بگذارید و این عاقلانه و امن نیست که شما کلید رمز خودتان را به آن شخص بدهید زیرا در اینصورت دیگران نیز می‌توانند بجای شما و با الگوریتم رمزنگاری شما فایل‌ها را رمزنگاری کنند که امنیت شما را بشدت کاهش می‌دهد، در ادامه شما را با کلید خصوصی و کلید عمومی آشنا می‌کنم:

۱-۱. انواع رمزگذاری

الگوریتم‌های رمزگذاری از نظر استفاده از کلید رمز به دو دسته کلی تقسیم می‌شوند. الگوریتم‌های دارای کلید متقارن، از یک کلید هم برای رمزگذاری و هم برای رمزگشایی استفاده می‌کنند. نسل جدیدتر الگوریتم‌ها، الگوریتم‌های دارای کلید نامتقارن هستند که از یک جفت کلید (یکی برای رمزگذاری و یکی برای رمزگشایی) استفاده می‌کنند. یکی از این کلیدها (کلید عمومی) در اختیار همه قرار می‌گیرد تا بتوانند پیامشان را رمزگذاری کنند و به گیرنده بفرستند. کلید دیگر (کلید خصوصی) تنها در اختیار گیرنده قرار دارد و با استفاده از آن می‌توان پیام را رمزگشایی کرد.

قطعا نوع دوم یعنی الگوریتم‌های دارای کلید نامتقارن دارای امنیت بسیار بالاتری می‌باشند که در ادامه به آن خواهیم پرداخت.

این کار در زندگی روزمره و صحبت‌هایمان نیز رایج است، گاهی اوقات دو نفر در جمع از واژه‌ها و اصطلاحاتی خاص استفاده می‌کنند که فقط خودشان اطلاع دارند. برای مثال یک نام مستعار برای یک شخص یا مکان انتخاب می‌کنند و در جمع از آن نام مستعار استفاده می‌کنند. در این صورت شخص گوینده حرف‌هایش را برای یک یا عده‌ای خاص رمزگذاری کرده و آن اشخاص می‌توانند با دانستن مفهوم آن واژه یا اصطلاح متوجه صحبت‌های شخص گوینده شوند.

۱-۲. الگوریتم‌های دارای کلید نامتقارن

ابتدا با چند اصطلاح شما را آشنا می‌کنم سپس مراحل این رمگذاری را نشان می‌دهم.

  • Encrypt: رمزگذاری
  • Data: فایلی که می‌خواهیم رمزگذاری کنیم.
  • Random Key: کلید تصادفی
  • Encrypted Key: کلید رمزگذاری شده
  • Encrypted Message: پیام رمزگذاری شده
  • Decrypt: رمزگشایی

۱-۲-۱. رمزگذاری نامتقارن

ابتدا مراحل رمزگذاری را با هم بررسی می‌کنیم:

  • در ابتدا یک فایل (Data) برای رمزگذاری داریم و یک کلید تصادفی (Random Key) که ایجاد می‌شود.
  • سپس فایل به کمک کلید تصادفی رمزگذاری می‌شود.
  • کلید تصادفی با استفاده از کلید عمومی فرد دریافت کننده رمزگذاری می‌شود.
  • و حالا فایل با کلید رمزگذاری ده ترکیب می‌شوند و یک پیام رمزگذاری شده را ایجاد می‌کنند.

۱-۲-۲. رمزگشایی نامتقارن

و حالا مراحل رمزگشایی را با هم بررسی می‌کنیم:

  • کلید رمزگذاری شده با استفاده از کلید خصوصی دریافت کننده پیام، رمزگشایی می‌شود و به کلید تصادفی می‌رسیم.
  • سپس فایل رمزگذاری شده با با کلید تصادفی، به کمک کلید تصادفی (که در مرحله قبل رمزگشایی شد) رمزگشایی می‌شود.

به اینصورت یک فایل در الگوریتم رمزگذاری نامتقارن، رمزگذاری و رمزگشایی می‌شود.

۱-۳. معرفی GnuPG

GnuPG یا GPG مخفف عبارت Gnu Privacy Guard می‌باشد. GnuPG یک بخش از پروژه گنو می‌باشد و کمک مالی بزرگی از دولت آلمان دریافت کرده است. GnuPG از زمان معرفی آن در سال 1997 یک نرم افزار آزاد و رایگان است و با زبان C نوشته شده است.

همانطور که در ابتدا گفتم GnuPG یک نرم‌افزار جهت رمزگذاری فایل‌ها می‌باشد. از توضیحات بیشتر صرف نظر می‌کنم ولی برای اطلاعات بیشتر می‌توانید به سایت رسمی GnuPG سر بزنید.

۲. نصب در اوبونتو

کافیست کد زیر را در محیط ترمینال سیستم خود وارد کرده و نصب کنید:

sudo apt install gnupg

۳. آموزش GnuPG

GnuPG بسیار گسترده است، در این آموزش مطالب اصلی آن را سعی کردم بگویم اما اگر مطالب گفته شده برای شما کافی نبود به آموزش رسمی سایت GnuPG مراجعه کنید یا از دستور man gpg $ استفاده کنید.

۳-۱. ایجاد کلید

برای شروع کار باید کلید خصوصی و عمومی خود را ایجاد کنید، برای این کار کد زیر را وارد کنید:

gpg --full-generate-key

سپس از شما تعدادی سوال پرسیده می‌شود که شرح آن بصورت زیر است:

  • Please select what kind of key you want: در اینجا از شما می‌خواهد نوع کلید را انتخاب کنید که گزینه اول یعنی حالت پیش‌فرض را انتخاب کنید.
  • Key is valid for? (0): از شما می‌خواهد مدت زمانی که می‌خواهید این کلید وجود داشته باشد را انتخاب کنید. (عدد 0 به معنی دائمی بودن می‌باشد)
  • Is this correct? (y/N): سپس می‌پرسد که مطمئن هستید که می‌خواهید این کلید دائمی باشد؟ که گزینه y را برای تأیید انتخاب کنید.
  • Real name: نام خود را وارد کنید.
  • Email address: آدرس ایمیل خود را وارد کنید.
  • Comment: یک کامنت وارد کنید.
  • Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit: اگر اطلاتی که وارد کرده‌اید اشتباه است می‌توانید آن‌ها را عوض کنید (N برای تغییر نام، C برای تغییر کامنت، E برای تغییر ایمیل)، اگر کاملا منصرف شده‌اید Q را وارد کنید و اگر همه چیز درست است O را وارد کنید.
  • در اینجا یک صفحه باز می‌شود و از شما می‌خواهد یک عبارت عبور برای کلید خصوصی خود وارد کنید، این قسمت ضعیف‌ترین بخش رمزگذاری شماست بنابراین تا می‌توانید از عبارت عبور قوی‌تری استفاده کنید.

تمامی مراحل بالا بصورت یک عکس در زیر آمده است:

در انتهای این تصویر اطلاعاتی از کلیدی که ساختید نمایش داده شده که شامل آی‌دی (متنی که پس‌زمینه سفید دارد) شما می‌باشد که باید آن را ذخیره کنید.

۳-۲. ایجاد گواهی لغو

اگر هرگونه نقض امنیتی (برای مثال ممکن است کاید خصوصی خود را از دست دهید یا کلید خصوصی شما لو برود و …) برای کلید‌هایتان بوجود آید به گواهی لغو برای از بین بردن جفا کلید خود نیاز دارید.

شما باید این گواهی لغو را به محض ایجاد کلید‌ها ایجاد کنید نه در زمانی که به آن‌ها نیاز دارید. از آنجایی که وجود این گواهی ضرری ندارد (البته اگر از آن به درستی حفاظت کنید) توصیه می‌کنم حتما این گواهی را ایجاد کنید تا درصورت بروز نقض امنیتی راهی برای رفع آن داشته باشید.

برای ایجاد این گواهی کد زیر را وارد کنید:

gpg --output ~/revocation.crt --gen-revoke YourEmail@address.com

سپس از شما تعدادی سوال پرسیده می‌شود که شرح آن بصورت زیر است:

  • Create a revocation certificate for this key? (y/N): برای تأیید ایجاد گواهی لغو y و برای عدم تأیید N را وارد کنید.
  • Your decision?: دلیل ایجاد گواهی لغو را بنویسید. از آن‌جایی که شاید هنوز نمی‌دانید به چه دلیل به این گواهی نیاز پیدا خواهید کرد می‌توانید از گزینه 0 (No reason specified) استفاده کنید.
  • Enter an optional description; end it with an empty line: یک توضیح نوشته و دو بار کلید enter را از روی کیبورد خود فشار دهید.
  • Is this okay? (y/N): از شما می‌پرسد که آیا همه چیز درست وارد شده؟ اگر درست است y و اگر نیست N را وارد کنید.

در پایان از شما می‌خواهید این گواهی را در جایی امن نگهداری کنید. (گواهی شما فایلی به نام revocation.crt است که در محل آدرس فعلی شما قرار دارد.)

تمامی مراحل بالا بصورت یک عکس در زیر آمده است:

توصیه می‌شود گواهی خود را بصورت فیزیکی چاپ کنید، اما اگر آن را در سیستم خود نگهداری می‌کنید بهتر است دسترسی سایر کاربرها به آن را لغو کنید. برای این کار از کد زیر استفاده کنید:

chmod 600 ~/revocation.crt

تا این‌جا یاد گرفتیم چگونه کلید خصوصی و عمومی بسازیم و برای آن‌ها یک گواهی لغو ایجاد کنیم. همانطور که در ابتدا توضیح دادم، در رمزگذاری نامتقارن شما برای رمزگذاری یک پیام برای شخص دیگر از کلید عمومی آن شخص استفاده می‌کنید. حال بیایید به وارد کردن کلید عمومی دیگران بپردازیم.

۳-۳. وارد کردن کلید عمومی

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

gpg --import name_of_pub_key_file

ممکن است کلید عمومی مورد نظر روی سرورهای ذخیره سازی کلید عمومی باشد. یکی از بهترین‌های این زمینه سرور دانشگاه ام‌آی‌تی می‌باشد.

می‌توانید کلید عمومی را با استفاده از نام یا ایمیل آدرس شخص مورد نظر در لینک زیر جست‌ و جو کنید:

https://pgp.mit.edu

همینطور می‌توانید در محیط ترمینال به کمک GPG این کار را انجام دهید:

gpg --keyserver pgp.mit.edu --search-keys Name_or_Email

در این قسمت نیز با نوشتن نام یا ایمیل آدرس شخص مورد نظر به جای واژه Name_or_Email می‌توانید کلید عمومی را جست و جو کنید.

۳-۴. تایید و امضاء کردن کلید عمومی

چگونه از صحت یک کلید عمومی مطمئن شویم؟

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

اما اگر کلید عمومی را بصورت مجازی دریافت می‌کنید و یا از صحت آن اطمینان ندارید می‌توانید با استفاده از قابلیت اثرانگشت این کار را انجام دهید:

gpg --fingerprint PersonEmail@address.com
#Output
pub   rsa4096 2019-04-07 [SC]
      ((AA3A 05F7 3B7E A97D 01EB  7CAF 97OB BA78 F687 38C0))
uid           [ultimate] test_user <test_user@address.com>
sub   rsa4096 2019-04-07 [E]

پس از گرفتن اثرانگشت با استفاده از کد بالا (اثر انگشت می‌شود آن قسمتی که بین دو پرانتز باز و بسته قرار دارد)، آن را با کد اثر انگشتی که از آن شخص گرفته‌اید مطابقت دهید، اگر یکسان بود یعنی کلید عمومی دریافت شده متعلق به همان شخص می‌باشد.

اگر مطمئن شدید که یک کلید عمومی متعلق به همان شخصی است که ادعای مالکیتش را دارد، می‌توانید آن کلید عمومی را امضاء کنید. وقتی کلیدی را امضا می‌کنید، به این معنی است که شما تأیید می‌کنید که به شخص آن اعتماد دارید و این به بقیه کمک می‌کند تا به آن شخص اعتماد کنند یا نه.

با استفاده از کد زیر می‌توانید یک کلید عمومی را امضاء کنید:

gpg --sign-key PersonEmail@address.com

۳-۵. انتشار کلید عمومی

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

برای دریافت کلید عمومی خود کد زیر را وارد کنید:

gpg --output ~/mygpg_pub.key --armor --export your_email@address.com

خروجی یک فایل با نام mygpg_pub.key خواهد بود که شما می‌توانید آن را برای دیگران بفرستید.

اگر این فایل را باز کنید خروجی مانند زیر مشاهده خواهید کرد. (نسخه مورد استفاده 2.1 می‌باشد)

#Output

-----BEGIN PGP PUBLIC KEY BLOCK-----

mQINBFJPCuABEACiog/sInjg0O2SqgmG1T8n9FroSTdN74uGsRMHHAOuAmGLsTse
9oxeLQpN+r75Ko39RVE88dRcW710fPY0+fjSXBKhpN+raRMUKJp4AX9BJd00YA/4
EpD+8cDK4DuLlLdn1x0q41VUsznXrnMpQedRmAL9f9bL6pbLTJhaKeorTokTvdn6
5VT3pb2o+jr6NETaUxd99ZG/osPar9tNThVLIIzG1nDabcTFbMB+w7wOJuhXyTLQ
JBU9xmavTM71PfV6Pkh4j1pfWImXc1D8dS+jcvKeXInBfm2XZsfOCesk12YnK3Nc
u1Xe1lxzSt7Cegum4S/YuxmYoh462oGZ7FA4Cr2lvAPVpO9zmgQ8JITXiqYg2wB3
. . .

-----END PGP PUBLIC KEY BLOCK-----

به اینصورت شما می‌توانید کلید عمومی خود را برای هرکسی ارسال کرده و یا لینک دانلود آن را روی سایت، وبلاگ و … خود قرار دهید.

اما همچنین شما می‌توانید کلید عمومی خود را در یک مخزن ذخیره سازی کلید (key server) عمومی ذخیره کنید.

برای اینکار ابتدا نیاز به کد کلید (key ID) خود دارید:

gpg --list-keys your_email@address.com
#Output

pub   rsa4096 2019-04-07
      ((AA3A05F73C7EA07D00CB7CAF97FBBA78F63738C0))
uid           [ultimate] test_user <test_user@address.com>
sub   rsa4096 2019-04-07

قسمتی که درون دو پرانتز باز و بسته می‌باشد کد کلید (key ID) شماست.

حالا با وارد کردن کد زیر می‌توانید کلید عومی خود را روی key server دانشگاه MIT یا هر مخزن دیگری ذخیره کنید.

gpg --send-keys --keyserver pgp.mit.edu key_ID

۳-۶. رمزگذاری و رمزگشیایی کردن