Created
March 3, 2018 23:57
-
-
Save AO8/3a89ba7c8f032c7a1ff505baa3ce970e to your computer and use it in GitHub Desktop.
Simple Caesar Cipher Python decryption function.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import string | |
from time import sleep | |
alphabet = string.ascii_lowercase # "abcdefghijklmnopqrstuvwxyz" | |
def decrypt(): | |
print("Welcome to Caesar Cipher Decryption.\n") | |
encrypted_message = input("Enter the message you would like to decrypt: ").strip() | |
print() | |
key = int(input("Enter key to decrypt: ")) | |
decrypted_message = "" | |
for c in encrypted_message: | |
if c in alphabet: | |
position = alphabet.find(c) | |
new_position = (position - key) % 26 | |
new_character = alphabet[new_position] | |
decrypted_message += new_character | |
else: | |
decrypted_message += c | |
print("\nDecrypting your message...\n") | |
sleep(2) # give an appearance of doing something complicated | |
print("Stand by, almost finished...\n") | |
sleep(2) # more of the same | |
print("Your decrypted message is:\n") | |
print(decrypted_message) | |
decrypt() |
thanks
this ^
cool, but I have another solution
you do not have to enter the key
the system tries to guess the right key
Example
Call:
result = decrypt('KYZJ ZJ R MVIP TFFC DVJJRXV')
Output:
Message: THIS IS A VERY COOL MESSAGE => Point: 6022 => Key{1..25}: 17
Impilimentation
# import words from linux dictionary
dicts = []
with open('/usr/share/dict/words') as f:
dicts = f.readlines()
class Item:
def __init__(self, word, point, key):
self.word = word
self.point = point
self.key = key
def is_charachter(ch):
return ch.upper() != ch.lower()
def caesar(word, key=3):
if key < 0:
key += 26
if key > 26:
key = key % 26
encrypted = ''
A = ord('A')
for ch in word.upper():
if is_charachter(ch):
code = ord(ch) - A
encrypted += chr(((code + key)%26)+A)
else:
encrypted += ch
return encrypted
def in_dict(word):
if word.lower()+"\n" in dicts:
return True
def decrypt(words):
result = []
for i in range(25):
decrypted = caesar(words, i)
sentense = decrypted.split(' ')
point = 0
for word in sentense:
if in_dict(word):
point+=1000 + len(word)
result.append( Item(decrypted, point, 26 - i))
return result
result = decrypt(caesar("This is a very cool message", 17))
#or result = decrypt('KYZJ ZJ R MVIP TFFC DVJJRXV')
#return top 10 result
for item in sorted(result, key=lambda x: x.point, reverse=True )[:10]:
print( "Message: ", item.word , " => Point: ",item.point," => Key{1..25}: " , item.key)
# OUTPUT
# >> Message: THIS IS A VERY COOL MESSAGE => Point: 6022 => Key{1..25}: 17
```PYTHON
Thanks for the code
what about without importing?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
thanks