Update caesar_cipher.py

This commit is contained in:
Pranav Singh 2023-10-09 10:20:02 +05:30 committed by GitHub
parent ed19b1cf0c
commit 7015729091
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -5,25 +5,25 @@ from string import ascii_letters
def encrypt(input_string: str, key: int, alphabet: str | None = None) -> str: def encrypt(input_string: str, key: int, alphabet: str | None = None) -> str:
""" """
encrypt encrypt:
======= =======
Encodes a given string with the caesar cipher and returns the encoded Encodes a given string with the caesar cipher and returns the encoded
message message.
Parameters: Parameters:
----------- -----------
* input_string: the plain-text that needs to be encoded * input_string: the plain-text that needs to be encoded.
* key: the number of letters to shift the message by * key: the number of letters to shift the message by.
Optional: Optional:
* alphabet (None): the alphabet used to encode the cipher, if not * alphabet (None): the alphabet used to encode the cipher, if not
specified, the standard english alphabet with upper and lowercase specified, the standard english alphabet with upper and lowercase
letters is used letters is used.
Returns: Returns:
* A string containing the encoded cipher-text * A string containing the encoded cipher-text.
More on the caesar cipher More on the caesar cipher:
========================= =========================
The caesar cipher is named after Julius Caesar who used it when sending The caesar cipher is named after Julius Caesar who used it when sending
secret military messages to his troops. This is a simple substitution cipher secret military messages to his troops. This is a simple substitution cipher
@ -37,7 +37,7 @@ def encrypt(input_string: str, key: int, alphabet: str | None = None) -> str:
And our alphabet is made up of lower and uppercase letters: And our alphabet is made up of lower and uppercase letters:
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
And our shift is "2" And our shift is "2".
We can then encode the message, one letter at a time. "H" would become "J", We can then encode the message, one letter at a time. "H" would become "J",
since "J" is two letters away, and so on. If the shift is ever two large, or since "J" is two letters away, and so on. If the shift is ever two large, or
@ -46,11 +46,11 @@ def encrypt(input_string: str, key: int, alphabet: str | None = None) -> str:
Our final message would be "Jgnnq, ecrvckp" Our final message would be "Jgnnq, ecrvckp"
Further reading Further reading:
=============== ===============
* https://en.m.wikipedia.org/wiki/Caesar_cipher * https://en.m.wikipedia.org/wiki/Caesar_cipher
Doctests Doctests:
======== ========
>>> encrypt('The quick brown fox jumps over the lazy dog', 8) >>> encrypt('The quick brown fox jumps over the lazy dog', 8)
'bpm yCqks jzwEv nwF rCuxA wDmz Bpm tiHG lwo' 'bpm yCqks jzwEv nwF rCuxA wDmz Bpm tiHG lwo'
@ -83,24 +83,24 @@ def encrypt(input_string: str, key: int, alphabet: str | None = None) -> str:
def decrypt(input_string: str, key: int, alphabet: str | None = None) -> str: def decrypt(input_string: str, key: int, alphabet: str | None = None) -> str:
""" """
decrypt decrypt:
======= =======
Decodes a given string of cipher-text and returns the decoded plain-text Decodes a given string of cipher-text and returns the decoded plain-text.
Parameters: Parameters:
----------- -----------
* input_string: the cipher-text that needs to be decoded * input_string: the cipher-text that needs to be decoded.
* key: the number of letters to shift the message backwards by to decode * key: the number of letters to shift the message backwards by to decode.
Optional: Optional:
* alphabet (None): the alphabet used to decode the cipher, if not * alphabet (None): the alphabet used to decode the cipher, if not
specified, the standard english alphabet with upper and lowercase specified, the standard english alphabet with upper and lowercase
letters is used letters is used.
Returns: Returns:
* A string containing the decoded plain-text * A string containing the decoded plain-text.
More on the caesar cipher More on the caesar cipher:
========================= =========================
The caesar cipher is named after Julius Caesar who used it when sending The caesar cipher is named after Julius Caesar who used it when sending
secret military messages to his troops. This is a simple substitution cipher secret military messages to his troops. This is a simple substitution cipher
@ -115,7 +115,7 @@ def decrypt(input_string: str, key: int, alphabet: str | None = None) -> str:
And our alphabet is made up of lower and uppercase letters: And our alphabet is made up of lower and uppercase letters:
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
And our shift is "2" And our shift is "2".
To decode the message, we would do the same thing as encoding, but in To decode the message, we would do the same thing as encoding, but in
reverse. The first letter, "J" would become "H" (remember: we are decoding) reverse. The first letter, "J" would become "H" (remember: we are decoding)
@ -125,11 +125,11 @@ def decrypt(input_string: str, key: int, alphabet: str | None = None) -> str:
Our final message would be "Hello, captain" Our final message would be "Hello, captain"
Further reading Further reading:
=============== ===============
* https://en.m.wikipedia.org/wiki/Caesar_cipher * https://en.m.wikipedia.org/wiki/Caesar_cipher
Doctests Doctests:
======== ========
>>> decrypt('bpm yCqks jzwEv nwF rCuxA wDmz Bpm tiHG lwo', 8) >>> decrypt('bpm yCqks jzwEv nwF rCuxA wDmz Bpm tiHG lwo', 8)
'The quick brown fox jumps over the lazy dog' 'The quick brown fox jumps over the lazy dog'
@ -148,26 +148,26 @@ def decrypt(input_string: str, key: int, alphabet: str | None = None) -> str:
def brute_force(input_string: str, alphabet: str | None = None) -> dict[int, str]: def brute_force(input_string: str, alphabet: str | None = None) -> dict[int, str]:
""" """
brute_force brute_force:
=========== ===========
Returns all the possible combinations of keys and the decoded strings in the Returns all the possible combinations of keys and the decoded strings in the
form of a dictionary form of a dictionary.
Parameters: Parameters:
----------- -----------
* input_string: the cipher-text that needs to be used during brute-force * input_string: the cipher-text that needs to be used during brute-force.
Optional: Optional:
* alphabet: (None): the alphabet used to decode the cipher, if not * alphabet: (None): the alphabet used to decode the cipher, if not
specified, the standard english alphabet with upper and lowercase specified, the standard english alphabet with upper and lowercase
letters is used letters is used.
More about brute force More about brute force:
====================== ======================
Brute force is when a person intercepts a message or password, not knowing Brute force is when a person intercepts a message or password, not knowing
the key and tries every single combination. This is easy with the caesar the key and tries every single combination. This is easy with the caesar
cipher since there are only all the letters in the alphabet. The more cipher since there are only all the letters in the alphabet. The more
complex the cipher, the larger amount of time it will take to do brute force complex the cipher, the larger amount of time it will take to do brute force.
Ex: Ex:
Say we have a 5 letter alphabet (abcde), for simplicity and we intercepted the Say we have a 5 letter alphabet (abcde), for simplicity and we intercepted the
@ -179,11 +179,11 @@ def brute_force(input_string: str, alphabet: str | None = None) -> dict[int, str
ecd... and so on, until we reach a combination that makes sense: ecd... and so on, until we reach a combination that makes sense:
"cab" "cab"
Further reading Further reading:
=============== ===============
* https://en.wikipedia.org/wiki/Brute_force * https://en.wikipedia.org/wiki/Brute_force
Doctests Doctests:
======== ========
>>> brute_force("jFyuMy xIH'N vLONy zILwy Gy!")[20] >>> brute_force("jFyuMy xIH'N vLONy zILwy Gy!")[20]
"Please don't brute force me!" "Please don't brute force me!"