پروازی بر دنیای امنیت شبکه (قسمت پانزدهم) – مفاهیم رمزنگاری(بخش اول)

با سلام و عرض خسته‌نباشید خدمت تمامی دوستان خوبم؛ بعد از مدتی دوباره در خدمت شما هستیم با مبحثی جذاب و بسیار کاربردی!؛ در ادامه قسمت قبل از این سری آموزشی که درمورد VPNها صحبت کردیم، در این قسمت میخواهیم که مفاهیم و Conceptهای مربوط به مبحث رمزنگاری (یا همان Cryptography) را برای شما شرح دهیم و ببینیم که داستان از چه قرار است. در این مقاله درمورد تمامی مفاهیم موردنیاز از قبیل الگوریتم‌ها، هَشینگ، Encryption و... صحبت میکنم و سعی میکنم که یک مطلب و مقاله کاملی در این زمینه ارائه‌بدم. پس بامن همراه باشید ;) Cipher and Keysواژه‌شناسی و Terminology یکی از بخش‌های مهم یادگیری یک تکنولوژی میباشد، پس بزارید که قبل‌از شروع، بایکسری از موارد آشنا شویم: Ciphers: به مجموعه‌ای از یکسری قوانین‌خاص، Cipher ویا الگوریتم میگویند، این الگوریتم‌ها به‌ما به نحوه انجام Encryption و Decryption را شرح میدهند. امروزه صدها الگوریتم گوناگون رمزنگاری وجود دارند و بسیاری از آنها برای یسکری از محیطهای خاص ویا موارد خاص استفاده میگردند(مثل موارد دولتی و مربوط به امنیت ملی). از متدهای مرسومی که عموما Cipherها استفاده میکنند، میتوان به موارد ذیل اشاره کرد: ـSubstitution: در این نوع Cipherها، یکسری کاراکترها با یکسری کاراکتر دیگر جایگزین میشوند.ـPolyalphabetic: این روش تقریبا مانند همان روش قبلی میباشد، با این تفاوت که بجای استفاده از یک حرف از حروف الفبا، از چندین حرف و کاراکتر استفاده میگردد.ـTransposition: این روش Optionهای گوناگونی را ارائه میکند، مثل تغییر ترتیب حروف.کلیدها - Keys: کلیدها راهنماها و راهکاری برای reassemble کردن محتوا میباشند؛ بصورتی که در ابتدا محتوا توسط یک کلید مشخص‌شده و یکبار مصرف رمزنگاری میشود، سپس با این کلید که حاوی یکسری کاراکترها میباشد میتوان محتوا را در سَمت فرستنده رمزنگاری کرد و سپس در سمت گیرنده میتوان با همان کلید محتوا را رمزگشایی کرده و به داده اصلی دسترسی یافت.(در این بین فرایندهای بخصوصی هم برای انتقال کلید بین فرستنده و گیرنده انجام میگردد) Block and Stream Ciphersبر اساس نوع Cipher، الگوریتم‌های رمزنگاری(Encryption algorithms) میتوانند بروی قطعه(Block)ای از داده‌ها ویا Bit و Byteهای داده‌ها پیاده‌سازی گردند. به عنوان مثال بگذارید دو نمونه رو مقایسه کنیم. آشنایی با Block Cipher: ـBlock Cipher یک Symmetric Key Cipher میباشد که بروی گروهی‌از بیت‌ها(بلاک‌ها) پیاده‌سازی میگردد؛ یک Block Cipher Encryption algorithm ممکن است که یک بلاک 64بیتی از داده‌خام(Plain) را بگیرد و سپس یک بلاک 64بیتی Cipher Text به شما تحویل‌دهد. در این نوع Encryption از همان کلیدی که برای رمزنگاری استفاده شده است برای رمزگشایی هم استفاده میشود. از Symmetrical block cipher algorithmها میتوان موارد زیر را نام برد: Advanced Encryption Standard - AES Triple Digital Encryption Standard - 3DES BlowfishDigital Encryption Standard - DES International Data Encryption Algorithm - IDEA ـBlock Cipherها ممکن است در زمان‌هایی که بلاک‌ها به اندازه کافی دارای Data نمیباشند مقداری داده‌های موقت به بلاک اضافه کنند تا بتوانند یک بلاک کامل ایجاد کنند و سپس آنرا رمزنگاری کنند؛ به همین دلیل است که گاهی اوقات استفاده از این نوع Cipherها، دارای Overhead نسبتا بیشتری نسبت به دیگر Cipherها میباشد.ـStream Ciphers: ـStream Cipher یک Symmetric key cipher میباشد که در آن داده‌ها بیت‌به‌بیت توسط Key Stream رمزنگاری و Encrypt میشوند و در Output، به‌شما یک Ciphertext stream تحویل‌میدهد. بدلیل آنکه Cipher Stream مثل Block cipher نیازی به اضافه‌کردن داده برای Fitشدنِ‌بلاک ندارد، دارای Overhead کمتری نسبت به Block cipherها میباشد. Symmetric and Asymmetric Algorithms یادگیری دو مفهوم Symmetric و Asymmetric بسیار مهم و حیاتی میباشد، بگذارید قبل از هرچیز به Optionها و خصوصیات هرکدام نگاهی بیندازیم.ـSymmetric: همانطور که اشاره‌شد، یک الگوریتم رمزنگاری Symmetric(که همچنین به آن Symmetrical cipherهم گفته میشود) از یک کلید یکسان برای رمزنگاری و رمزگشایی داده استفاده میکند. هر دو دیوایس متصل‌شده توسط VPN که برای امن‌شدن از الگوریتم رمزنگاری Symmetric استفاده کرده‌اند، برای Encrypt و Decrypt موفقیت‌آمیز داده‌ها، به تمامی Key ویا Keyهای استفاده‌شده نیاز دارند. از الگوریتم‌های رمزنگاری Symmetric میتوان موارد زیر را نام برد: DES3DESAESIDEARC2, RC4, RC5, RC6Blowfishاین روزها، بسیاری از VPNهایی که ازآنها استفاده میکنیم از الگوریتم‌های رمزنگاری Symmetric استفاده میکنند؛ دلیل استفاده از این الگوریتم‌ها سرعت بسیار خوب و CPU Overhead بسیار کمتر آنها نسبت به الگوریتم‌های Asymmetric میباشد؛ باتوجه با ذات رمزنگاری و Encryption، میتوان گفت که هرچقدر که کلید طولانی‌تر و سخت‌تر باشد، به همان نسبت خواندن و متوجه‌شدن داده برای شخصی که دارای کلید نمیباشد سخت‌تر و غیرممکن‌تر میباشد. ما معمولا کلیدهارا با توجه به طول(Length)اشان نام‌گذاری میکنیم، یک کلید طولانی‌تر و بزرگتر به معنی امنیت بیشتر میباشد؛ طول یک کلید عادی عموما بین 112بیت الی 256بیت میباشد؛ برای یک symmetrical encryption algorithmـه امن طول کلید حداقل میبایستی 128بیت باشد تا بتوان گفت که به اندازه کافی Safe است.ـAsymmetric: از نمونه Asymmetric algorithmها میتوان الگوریتم‌های Public Keyرا نام برد؛ این الگوریتم‌ها در نوع خودشان بسیار جالب و جادویی میباشند!؛ در این نوع الگوریتم‌ها بجای استفاده از یک کلید یکسان برای رمزنگاری و رمزگشایی، از دو کلید متفاوت از یکدیگر برای Encryption و Decryption استفاده میکنیم(و نکته اینجاست که این دو کلید ازنظر ریاضی به یکدیگر ارتباط دارند و به عنوان یک Pair(جفت) عمل میکنند). به این جُفت Key pair و به یکی از این کلیدها Public Key(کلید عمومی) و به دیگری Private Key(کلید خصوصی) میگوییم. بذارید که نحوه عملکرد این دو را با یک مثال بررسی کنیم:فرض کنید که یک صدوقچه دارید که دارای یک قفل‌خاص میباشد؛ این قفل دارای دو Keyhole(سوراخ کلید) میباشد که یکی از آنها یک سوراخ‌ها بزرگ و دیگری کوچک میباشد؛ حالا نکته‌ی این قفل جادوئی اینجاست که اگر از سوراخ‌کلید کوچیکتر و کلید مربوط به خودش برای قفل کردن صدوقچه استفاده کنید، تنها راه باز کردن آن قفل، استفاده از Keyholeبزرگترِ و کلیدِ بزرگ مربوط به خودش میباشد و همین روال بصورت بلعکس هم میتواند انجام شود، یعنی اینکه میتوان از کلید بزرگ برای قفل کردن و از کلید کوچک برای بازگشایی آن استفاده کرد. این مثال رابطه‌داخلیِ بین Public key و Private Key را به خوبی توضیح میدهد، اما مشکلی که وجود دارد اینست که مصرف CPU در زمان استفاده از این KeyPairها برای Lock و Unlock داده‌ها بسیار زیاد میباشد و به همین دلیل‌است که در شرایط بسیار خاص از Asymmetric algorithmها استفاده میکنیم.بجای استفاده از آنها برای Encrypt کردن یک تکه‌داده، از آنها برای مواردی مانند "Authentication یک VPN Peer" ویا "ایجاد Keying materialـی برای Symmetrical algorithmهای خودمان" استفاده میکنیم. هردو این موارد نسبت به Encryptکردن کل پکت‌های کاربر، بسیار نادرتر میباشند.یکی از دلایلی که ما به این نوع الگوریتم Public key cryptography میگوییم اینست که ما همیشه اجازه میدهیم که یکی از این دو کلید بصورت عمومی انتشار داده شود و دردسترسی دیگران و هرکسی که میخواهد از آن استفاده کند، قرار بگیرد(Public Key). کلید دیگر ما Private key میباشد که همیشه میبایستی نزد دیوایسی که صاحب این KeyPair است محفوظ بماند. اگر بخواهیم مثالی از Public-Private Keypairها مثالی بزنیم، میتوان سر زدن به یک Secure Website را نام برد(وبسایت‌هایی که امن میباشند و از Https استفاده میکنند)؛ در Background از Public-Private Keypair سرور برای امن کردن Session استفاده میگردد؛ کامپیوتر شما به Public Key دسترسی دارد و سرور تنها دیوایسی است که دارای Private key میباشد؛ داده‌ها در سَمت کامپیوتر شما با استفاده از Public Key رمز میشوند و در سرور با استفاده از Private Key رمزگشایی میگردند. از Asymmetrical algorithmها میتوان موارد زیر را نام برد: ـRSA: که به افتخار ایجادکنندگان این الگوریتم Rivest، Shamir و Adleman از حروف اول نام آنها برای نامگذاری‌اش استفاده کرده‌اند؛ این روزها استفاده اصلی این الگوریتم برای authentication میباشد که البته بهش Public key cryptography standard (به اختصار PKCS)هم گفته میشود؛ طول کلید ممکن‌است بین 512 تا 2048 باشد که عموما برای امنیت نسبتا خوب، حداقل از کلید 1024بیتی استفاده میشود.ـDH: پروتکل Diffie-Hellman key Exchange؛ DH الگوریتمی میباشد که به دو دیوایس اجازه میدهد بر بستر یک شبکه غیرقابل‌اعتماد(Untrusted)، با یکدیگر Negotiate کنند و کلیدها و Secretهای موردنیاز خودرا Establishکنند. نکته جالب DH اینست که اگرچه خود الگوریتم Asymmetric میباشد، اما کلیدهای ایجادشده‌ی آن Symmetrical keyهایی میباشند که میتوانند توسط یک الگوریتم Symmetrical مثل 3DES و AES استفاده شوند.ـElGamal: این سیستم Asymmetrical بر اساس DH Exchange عمل میکند.ـDSA: این الگوریتم که اختصار Digital Signature Algorithm میباشد توسط National Security Agency ایالت‌متحده ایجاد شده است.ـECC: اختصار Elliptic Curve Cryptography میباشد. همانطور که گفته‌شد Asymmetrical algorithmها مصرف CPU Processing بیشتری نسبت به Symmetrical algorithm دارند اما به همان نسبت دارای امنیت بسیار بیشتری هم میباشند و عموما برای امنیت خوب، میتوانند دارای هر طول کلیدی بین 2048 تا 4096بیت باشند. در قسمت بعدی درمورد Hashها و موارد دیگر رمزنگاری صحبت خواهیم کرد...امیدوارم که این پست برای شما مفید واقع شده باشه.موفق باشید.