Dancing with Caesar Cipher [Python]

Hello Ladies …..

ဒီတစ္ခါေတာ့ က်ေနာ္တို့ေတြ ေနာက္တစ္မ်ိုးေလ့လာျကည့္ျကတာေပါ့ ။ Invent with Python ဆိုတဲ့စာအုပ္တစ္အုပ္ကို က်ေနာ္ MSF ထဲက ဘရိုတစ္ေယာက္ L0V3R က ဖတ္ျကည့္ဖို့အျခားတစ္ေယာက္ကိုအျကံေပးတာေတြ့တာနဲ့ပဲ ဒါေလးေတြေရးလို့ျဖစ္လာခဲ့တာပါ။ ဦးစြာပထမအေနနဲ့ ခုလိုစာအုပ္ကိုအျကံေပးခဲ့တဲ့အတြက္ကိုေက်းဇူးတင္ေျကာင္းေျပာခ်င္ပါတယ္။ ေနာက္ျပီးေတာ့ python ဗ်။ ဒါကိုေတာ့က်ေနာ္က ဖိုရမ္ထဲမွာပဲ python အေျကာင္းနွံ့နွံ့စပ္စပ္သိတဲ့ Hades.y2k ကိုသြားေမးတယ္ အေျခခံကိုဘယ္လိုေလ့လာရမလဲေပါ့။ သူေျပာျပခဲ့တာေလးအရမ္းေကာင္းပါတယ္။ ေျပာရဦးမယ္ အေရးျကီးတာေလးတစ္ခုေလာက္။ ဒါကေတာ့ ဘာလို့ python ကိုက်ေနာ္ေရြးခ်ယ္ခဲ့တယ္ဆိုတာေလးေပါ့။ တကယ္ေတာ့က်ေနာ္အျမင္ က်ေနာ့္ယူဆခ်က္ဆိုပါေတာ့။ က်ေနာ္မ်ားေသာအားျဖင့္ CTF ေတြကိုလိုက္ျကည့္ပါတယ္။ Crypto Challenge ေတာ္ေတာ္မ်ားမ်ားကို C (or) Python ကိုသံုးျပီးေျဖျကတာမ်ားပါတယ္။ ဒါေျကာင့္ က်ေနာ္ကေတာ့ python ကိုေရြးခ်ယ္လိုက္ရျခင္းျဖစ္ပါတယ္။ တျခား programming ေလ့လာျပီးတဲ့သူတစ္ေယာက္ကေတာ့ python ကို တကူးတကလိုက္လုပ္ေနဖို့မလိုပါဘူး။ ကိုယ္ရထားတဲ့အရာနဲ့လည္းေျဖရွင္းနုိင္ပါတယ္။

ဒါေပမယ့္ က်ေနာ္ကေတာ့ က်ေနာ္ဒီ Crypto ေတြအတြက္ရည္ရြယ္ျပီး python basic ကိုပဲေလ့လာထားတာေျကာင့္ python နဲ့ပဲေလ့လာရတာေပါ့။ ေနာက္ျပီးေတာ့က်ေနာ့္မွာလည္း ဟိုတစ္ေယာက္ေပးထားတဲ့စာအုပ္က python ပဲသံုးထားတာကိုး ။ အဲဒီ original link ကိုေတာ့ ေအာက္မွာေဖာ္ျပထားေပးပါတယ္။ က်ေနာ္ရွင္းတာနားမလည္ဘူးဆို သြားဖတ္နိုင္ေအာင္လုိ့ပါ။ က်ေနာ္ကေတာ့ထံုးစံအတိုင္းကိုယ္လည္းမွတ္မိ သူမ်ားလည္းဖတ္ခ်င္ဖတ္လို့ရေအာင္ေရးထားလိုက္ျပီ။

Why old cipher?

တခ်ို့ကေစာဒကတက္ခ်င္တက္နိုင္တယ္ဘာေျကာင့္ အေဟာင္းေတြနဲ့လုပ္ရတာလဲေပါ့ ။ ဟုတ္တယ္ က်ေနာ္ကေတာ့အေဟာင္းေတြကပဲစတယ္။ အေဟာင္းေတြကအရမ္းရိုးရွင္းပါတယ္။ နားလည္လြယ္တယ္ မခက္ေသးလို့ေလ။ ဒီလိုပဲ ေအာက္ကေနတက္မွရမယ္လို့ယူဆတယ္။ ေအာက္ေျခပိုင္ခဲ့ရင္ ဒီထပ္ခက္ခဲတဲ့အရာေတြက်က်ေနာ္တို့ သူမ်ားထက္စာရင္ နားလည္လြယ္မွာပါ။ Logic ကိုသိေနတာကိုး။ ျမန္မာလိုဆို အထာေတြသိေနတယ္ေပါ့ ။

Crypto Day 1 မွာ Caesar Cipher အေျကာင္းေျပာထားခဲ့ျပီးပါျပီ။ Shifted Cipher လို့လည္းေခါ္ပါတယ္။ Code အေျကာင္းအဓိက ေလ့လာမွာမလို့ Theroy ေတြသိပ္မေျပာေတာ့ဘူး။ စလိုက္ျကရေအာင္ စလိုက္ျကရေအာင္ (J-me အသံျဖင့္) ……

Python Requirements

·         The import statement

·         Constants

·         The upper() string method

·         for loops

·         if, elif, and else statements

·         The in and not in operators

·         The find() string method

ဒီ သင္ခန္းစာကိုေလ့လာဖို့အတြက္က်ေနာ္တို့ python နဲ့ ပတ္သတ္ျပီး အေပါ္က ဟာေလးေတြကိုသိထားဖို့ေတာ့လိုပါတယ္။

Source Code for Caesar Cipher

1. # Caesar Cipher

 2. # http://inventwithpython.com/hacking (BSD Licensed)

 3.

 4. import pyperclip

 5.

 6. # the string to be encrypted/decrypted

 7. message = ‘This is my secret message.’

 8.

 9. # the encryption/decryption key

10. key = 13

11.

12. # tells the program to encrypt or decrypt

13. mode = ‘encrypt’ # set to ‘encrypt’ or ‘decrypt’

14.

15. # every possible symbol that can be encrypted

16. LETTERS = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’

17.

18. # stores the encrypted/decrypted form of the message

19. translated = ”

20.

21. # capitalize the string in message

22. message = message.upper()

23.

24. # run the encryption/decryption code on each symbol in the message string

25. for symbol in message:

26.     if symbol in LETTERS:

27.         # get the encrypted (or decrypted) number for this symbol

28.         num = LETTERS.find(symbol) # get the number of the symbol

29.         if mode == ‘encrypt’:

30.             num = num + key

31.         elif mode == ‘decrypt’:

32.             num = num – key

33.

34.         # handle the wrap-around if num is larger than the length of

35.         # LETTERS or less than 0

36.         if num >= len(LETTERS):

37.             num = num – len(LETTERS)

38.         elif num < 0:

39.             num = num + len(LETTERS)

40.

41.         # add encrypted/decrypted number’s symbol at the end of translated

42.         translated = translated + LETTERS[num]

43.

44.     else:

45.         # just add the symbol without encrypting/decrypting

46.         translated = translated + symbol

47.

48. # print the encrypted/decrypted string to the screen

49. print(translated)

50.

51. # copy the encrypted/decrypted string to the clipboard

52. pyperclip.copy(translated)

ဒါေလးကေတာ့ Original Source Code ပဲျဖစ္ပါတယ္။ ဒီ code ကို အလုပ္လုပ္ဖုိ့အတြက္ pyperclip ဆိုတဲ့ module ကို download ခ်ရမွာျဖစ္ပါတယ္။ http://invpy.com/pyperclip.py မွာလုပ္ပါ။

caesar.py ဆိုျပီး အေပါ္က ကုတ္ကို သိမ္းထားလိုက္မယ္။ pyperclip ကိုလည္း directory တစ္ခုထဲမွာထားေပးဖို့လိုအပ္ပါတယ္။

 1. # Caesar Cipher

 2. # http://inventwithpython.com/hacking (BSD Licensed)

 3.

 4. import pyperclip

အေျခခံရျပီးသားလို့ေတာ့ယူဆပါတယ္။ import က python မွာ module ေတြကိုေခါ္သံုးတယ္ဆိုတာသိျပီးသားျဖစ္မွာပါ။ pyperclip ကိုေခါ္သံုးရတဲ့အေျကာင္းရင္းကေတာ့ copy / paste နဲ့ဆိုင္တဲ့ functions ေတြပါလို့ပဲျဖစ္ပါတယ္။ ေအာက္ဆံုးမွာ pyperclip.copy(translated) ဒီလုိမ်ိုးျပန္သံုးဖို့အတြက္ဆိုပါေတာ့။

 6. # the string to be encrypted/decrypted

 7. message = ‘This is my secret message.’

 8.

 9. # the encryption/decryption key

10. key = 13

11.

12. # tells the program to encrypt or decrypt

13. mode = ‘encrypt’ # set to ‘encrypt’ or ‘decrypt’

ဒီအပိုင္းမွာကေတာ့ variable ေတြကိုေျကညာထားတာေတြ့ရမွာပါ။ ဟုတ္ပါတယ္။ က်ေနာ္တို့မွာ အဓိကအခ်က္သံုးခ်က္ပဲရွိပါတယ္။ Message ရယ္ shifted လုပ္ထားတဲ့ key ရယ္ decrypt or encrypt ဒါပဲရွိပါတယ္။ ဒီေတာ့ ကိုယ္ထည့္ခ်င္တဲ့စာသားကို message variable ထဲကုိထည့္ခဲ့တယ္။ key = 13 ဆိုေတာ့ 13 shifted လုပ္မယ္ဆိုတဲ့သေဘာပါ။ ေနာက္တစ္ခုကေတာ့ encrypt or decrypt ျကိုက္နွစ္သက္ရာကို ထားခဲ့နိုင္တယ္။

LETTERS = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’

ဒီအေျကာင္းကေတာ့ ကိန္းေသထားခဲ့တဲ့သေဘာပါ။ character 26 လံုးကို letters ဆိုတဲ့ variable ထဲကိုထားခဲ့တယ္။

18. # stores the encrypted/decrypted form of the message

19. translated = ”

20.

21. # capitalize the string in message

22. message = message.upper()

translated ဆိုတဲ့ variable ကိုေတာ့ encrypt 0r decrypt လုပ္ျပီးရမယ့္ဟာကို သိမ္းဖို့ေဆာက္ခဲ့ပါတယ္။ ခုေတာ့ဘာမွမရွိေသးဘူးဆိုပါေတာ့။ က်ေနာ္တို့က LETTERS ဆိုတဲ့ ထဲမွာ စာလံုးအျကီးေတြခ်ည္းပဲသိမ္းခဲ့တာျဖစ္လို့ က်ေနာ္တို့ message ထဲက စာေတြကိုလည္း စာလံုးအျကီးေတြေျပာင္းေပးဖို့လိုပါတယ္။ upper() / lower() ဆိုတဲ့ string method က python မွာေတာ့ စာလံုးအျကီး အေသးခ်ိန္းတဲ့ေနရာမွာသံုးပါတယ္။

for symbol in message:

image002

for loop ကိုအသံုးျပုထားတာပါ။ for loop ရဲ့ဥပမာေလးကိုျကည့္လိုက္ရင္နားလည္မွာပါ။

>>> for letter in ‘Howdy’:

…     print(‘The letter is ‘ + letter)

The letter is H

The letter is o

The letter is w

The letter is d

The letter is y

>>

for symbol in message: ဆိုတေတာ့ symbol ထဲမွာ က်ေနာ္တို့ message variable ထဲကစာသားေတြဟာ အထက္ကဥပမာလိုမ်ိုးျဖစ္ေနျပီေပါ့။

if symbol in LETTERS:

27.         # get the encrypted (or decrypted) number for this symbol

28.         num = LETTERS.find(symbol) # get the number of the symbol

29.         if mode == ‘encrypt’:

30.             num = num + key

31.         elif mode == ‘decrypt’:

32.             num = num – key

33.

34.         # handle the wrap-around if num is larger than the length of

35.         # LETTERS or less than 0

36.         if num >= len(LETTERS):

37.             num = num – len(LETTERS)

38.         elif num < 0:

39.             num = num + len(LETTERS)

40.

41.         # add encrypted/decrypted number’s symbol at the end of translated

42.         translated = translated + LETTERS[num]

43.

44.     else:

45.         # just add the symbol without encrypting/decrypting

46.         translated = translated + symbol

ဒါေတာ့ ဒီ ကုတ္တစ္ခုလံုးမွာနည္းနည္းရွုပ္တဲ့အပိုင္းေလးေပါ့။ အေပါ္တစ္ပိုင္းကေတာ့ LETTERS ဆိုတဲ့ variable ထဲက က်ေနာ္တို့ထည့္ခဲ့တဲ့ character 26 လံုးထဲမွာ လက္ရွိ symbol ထဲေရာက္ေနတဲ့ character ေလးပါခဲ့ရင္ဆိုတဲ့အပိုင္းပါ။ ေနာက္တစ္ပိုင္းကေတာ့ အဲလိုမွမဟုတ္ရင္ေပါ့ ။

space , numbers , symbol ေတြကလြဲရင္ က်ိန္းေသတာကေတာ့ Character 26 လံုးထဲကပဲဆိုေတာ့ ပထမအပိုင္းစအလုပ္လုပ္ေတာ့မွာေပါ့ ။

num = LETTERS.find(symbol) ဒါေလးစျပီးအလုပ္လုပ္တယ္။ num ဆိုတဲ့ variable ထဲကို LETTERS ထဲမွာ symbol ရဲ့ ေရာက္ေနတဲ့ number ကို find() method ကိုသံုးျပီးေတာ့ရွာျပီးထည့္ခဲ့မယ္။ ဥပမာ symbol > i ဆိုရင္ လက္ရွိ num ထဲမွာ 9 ျဖစ္ေနျပီ။

ဒီေနရမွာမွာ ေနာက္ထပ္ condition တစ္ခုလာျပီ ။ if mode == ‘encrypt’:

mode ဟာ encrypt နဲ့ညီေနမယ္ဆိုရင္ num = num + key ဆိုရင္ဆိုတဲ့အေျခေနမွာ (e.g . i) num ဟာ 9 key = 13 ျဖစ္တာေျကာင့္ အခုဆို num ထဲမွာ 22 ျဖစ္သြားျပီ။

elif mode == ‘decrypt’:

       num = num – key

ဒီအေျခေနမွာဆိုရင္ေတာ့ num = 9-13 ျဖစ္သြားမယ္။ တန္ဖိုးက -4 ျဖစ္သြားျပီ။

36.         if num >= len(LETTERS):

37.             num = num – len(LETTERS)

38.         elif num < 0:

39.             num = num + len(LETTERS)

ဒီအပိုင္းကေတာ့ num ဟာ 1 to 26 အတြင္းဆိုဘာျပသနာမွမရွိေပမယ့္ 26 ထက္ျကီးသြားတယ္။ 0 ထက္ငယ္သြားတယ္ဆိုရင္ေတာ့ ဒီအပိုင္းကလိုအပ္လာပါျပီ။ len(LETTERS) ဆိုတာ LETTERS ရဲ့ 26 ကိုဆိုလိုတာပါ။ အေပါ္မွာတုန္းကလို အနွုတ္ ၄ ရျပီဆိုရင္ num = -4 + 26 >>> num = 22

translated = translated + LETTERS[num]

ဒါကေတာ့ translated ဆိုတဲ့ var ထဲကို translated + LETTERS[num] ဆုိေတာ့ကာ translated ထဲကို အစတည္းကရွိေနတဲ့ translated value ရယ္ LETTERS var ထဲက num တန္ဖိုးေရာက္ေနတဲ့ character ရယ္ထပ္ထပ္ေပါင္းသြားမယ္လို့ဆိုလိုပါတယ္။ ဒါဆိုအေပါ္တစ္ပိုင္းကျပီးျပီ။

ေအာက္တစ္ပိုင္းကေတာ့

44.     else:

45.         # just add the symbol without encrypting/decrypting

46.         translated = translated + symbol

ဆိုေတာ့ကာ ဘာမွထူးထူးျခားျခားမလုပ္ခ်င္ဘူးလို့ဆိုပါတယ္။လက္ရွိေရာက္ေနတဲ့အတိုင္းျပန္ထုတ္ေပးလိုက္တာ။ ဒီေနရာမွာက်ေနာ္တို့ဟာ white space ေလးတာထုတ္ေပးလိုက္ရင္ပိုေကာင္းသြားမလားပဲ။

48. # print the encrypted/decrypted string to the screen

49. print(translated)

50.

51. # copy the encrypted/decrypted string to the clipboard

52. pyperclip.copy(translated)

ေနာက္ဆံုးမွာေတာ့ translated ကို print ထုတ္ေပးလိုက္ရင္ရပါျပီ။

pyperclip ကိုေတာ့ clipboard မွာ translated ကို copy ကူးဖို့အတြက္ သံုးထားပါတယ္။

ျပီးေတာ့ က်ေနာ္နည္းနည္းေလးျပင္လိုက္ပါတယ္ ။ တတ္သေလာက္မွတ္သေလာက္ေလးေပ့ါ။ နည္းနည္းေလး user friendly ျဖစ္ေအာင္ေျပာမလား။

My code :

#!/usr/bin/python

import pyperclip

print “Enter your secret message”
message = raw_input(‘>>’)

key = 13

print “Enter your method (encrypt or decrypt)”
mode = raw_input(‘>>’)

LETTERS = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’

translated = ”

message = message.upper()

for symbol in message:
if symbol in LETTERS:
num = LETTERS.find(symbol)
if mode == ‘encrypt’:
num = num + key
elif mode == ‘decrypt’:
num = num – key

if num > len(LETTERS):
num = num -len(LETTERS)
elif num < 0:
num = num +len(LETTERS)

translated = translated + LETTERS[num]

else :
translated = translated + symbol

print “Cipher text for %r >> %r” %(message,translated)

pyperclip.copy(translated)

Screenshots :

1

2

3

4

6

Thanks for the Reading

Best Regard , Thin Ba Shane

Refrence :

http://inventwithpython.com/hacking/chapter6.html

Advertisements

2 thoughts on “Dancing with Caesar Cipher [Python]

  1. key ကို ကိန္းေသ မထားပဲနဲ့
    “key = int(raw_input(‘Type Secret Key : ‘))”
    ဆိုပိုေကာင္းမလားလို့
    တစ္ခ်ို့ challenge ေတြက်ေတာ့ rot က ဘယ္ေလာက္မွန္းမသိဘူးေလ အဲ့ေတာ့
    1-25 ကို bruteforce တိုက္သလိုလုပ္ရင္ပိုေကာင္းမယ္ အကို

    for key in range(0, 26):
    (tab) translated = ''
    (tab) message = message.upper() 
    (tab) for symbol in message:
    (tab) other code
    

    Keep Moving Bro 😀

    Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s