رمزنگاری؛ یک الگوریتم ساده
خب قبل از اینکه به بررسی الگوریتم های موجود در دنیای رمزنگاری بپردازیم قصد داریم یک مدل ساده از رمز کردن رو با هم بررسی کنیم .
قبل از هر چیزی باید این رو گفت که کار با رشته ها در پایتون بسیار کمک میکنه ٬ همچنین تبدیل هایی مانند مبنای ۸ و ۱۶ نیز مورد استفاده هستند . البته ممکن هست جز هکس و دسیمال از مبنای عددی دیگر مانند ۷ و … نیز استفاده شود .
خب به سراغ کد میریم :
def encode(str): cipher = "" for i in range(len(str)): cipher += chr(ord(str[i])^(ord("S"))) return cipher.encode('hex') def decode(hex): plain = "" cipher = hex.decode('hex') for i in range(len(cipher)): plain += chr(ord(cipher[i])^(ord("S"))) return plain string = "standardacademy" print "Plain Text : " , string.encode('hex') print "Encrypted : " , encode(string) print "Decrypted : " , decode(encode(string))
توضیحات کد :
دوتابع encrypt , decrypt در کد بالا مشاهده میشه .. همونطور که از اسامی دو تابع معلوم هست encrypt وظیفه کد کردن و decode وظیفه دقیقا برعکس encode رو دارند . مشاهده میشه که در هر دو تابع رشته ای که به عنوان ورودی به تابع داده شده به وسیله یک حلقه پیمایش میشه و هر حرف در زمان پیمایش با حرف “S” یای منطقی 🙂 (XOR) میشه . نکته ای که اینجا هست مشابه بودن این قسمت از کد برای هر دوتابع هست . یعنی هم در زمان اینکد و هم در زمان دیکد ما حرف رو با یک عملگر ریاضی و به شکل مشابه تغییر میدیم . دلیل شباهت این قسمت از کد خاصیت XOR هست که بهش اشاره خواهیم کرد . همچنین عملگر ^ وظیفه XOR کردن رو به عهده داره .
پایه ریاضی :
همونطور که گفته شد این موضوع که دو تابع عکس هم هستند ولی از یک فرمول ریاضی برای کار خود استفاده میکنند از خاصیت XOR نشات گرفته .به معادله های زیر توجه کنید .
>>> 0 ^ 0 0 >>> 0 ^ 1 1 >>> 1 ^ 0 1 >>> 1 ^ 1 0
احتمالا با توجه به قسمت آخر متوجه شدید که XOR خاصیت برگشت پذیری داره . به این صورت که اگر جواب عملگر روی ۲ عدد دوباره با یکی از ۲ عدد ورودی XOR بشه ٬ عددی که در بین ورودی ها نیست بدست میاد . به مثال زیر توجه کنید :
>>> a = "S" >>> b = "X" >>> f = ord(a)^ord(b) >>> f^ord(a) == ord(b) True >>> f^ord(b) == ord(a) True
مشاهده میشه در جواب معادله ها مقدار بولین True برگشت داده شده که حکایت از برقرای تساوی دارد . این خاصیت بسیار در الگوریتم های مختلف و مد های مختلفی XOR مانند CBC , EBC و .. استفاده داره که حتما در آینده در مورد اون ها هم بحث میکنیم .
خروجی کد رو در ادامه مشاهده میکنید :
parsa@xored:~/Desktop$ python enc.py Plain Text : 7374616e6461726461636164656d79 Encrypted : 2027323d3732213732303237363e2a Decrypted : standardacademy
باید توجه داشت که برای عملگر XOR حتما نیاز به دو عدد دارید . تابع ord کد اسکی هر کارکتر رو برمیگردونه و همچنین تایع chr دقیقا عمل عکس ord رو انجام میده . این دو تابع استفاده های خیلی زیادی برای ما دارند .
در مورد خروجی Plain Text مقدار “standardacademy” در مبنای ۱۶ (Hex) هنستش همچنین خروجی Encrypted هم به همین صورت هست چون ممکنه خروجی تابع از محدوده قابل نمایش ۳۲ تا ۱۲۶ خارج بشه .
در مورد امنیت این روش هم حرفی نیست و اصلا امن نیست به این دلیل که طول کلید که همون S باشه خیلی کوتاه هست و حتی اگر اون رو نداشته باشیم هم میشه با آزمون و خطا کار رشته اصلی رو بازیابی کرد .
مطالب زیر را حتما مطالعه کنید
آشنایی با Bloom Filter
احراز هویت توسط JWT
آشنایی با توابع در پایتون
راه اندازی Django به همراه Postgresql، Nginx و Gunicorn
آشنایی با حلقه ها در پایتون
آسیب پذیری DDE مایکروسافت
2 Comments
Join the discussion and tell us your opinion.
دیدگاهتان را بنویسید لغو پاسخ
برای نوشتن دیدگاه باید وارد بشوید.
سلام اگه میشه در مورد عملگر های بیتی و به خصوص XOR یه ویدیو یا پست بزارید هر چقدر هم سرچ کردم به جایی نرسیدم
سلام
آموزش های موجود در لینک زیر احتمالا پاسخگو باشند :
https://www.khanacademy.org/computing/computer-science/cryptography
https://www.khanacademy.org/computing/computer-science/cryptography/ciphers/a/xor-bitwise-operation