mirror of
https://github.com/TheAlgorithms/Python.git
synced 2025-01-18 16:27:02 +00:00
Porta cipher (#1550)
* directory_writer * add porta cipher for #1492 * formatting and one line comprehensions * remove directory_writer * indentions * Wrap long lines
This commit is contained in:
parent
8c443ccfad
commit
5452e94528
110
ciphers/porta_cipher.py
Normal file
110
ciphers/porta_cipher.py
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
alphabet = {
|
||||||
|
"A": ("ABCDEFGHIJKLM", "NOPQRSTUVWXYZ"),
|
||||||
|
"B": ("ABCDEFGHIJKLM", "NOPQRSTUVWXYZ"),
|
||||||
|
"C": ("ABCDEFGHIJKLM", "ZNOPQRSTUVWXY"),
|
||||||
|
"D": ("ABCDEFGHIJKLM", "ZNOPQRSTUVWXY"),
|
||||||
|
"E": ("ABCDEFGHIJKLM", "YZNOPQRSTUVWX"),
|
||||||
|
"F": ("ABCDEFGHIJKLM", "YZNOPQRSTUVWX"),
|
||||||
|
"G": ("ABCDEFGHIJKLM", "XYZNOPQRSTUVW"),
|
||||||
|
"H": ("ABCDEFGHIJKLM", "XYZNOPQRSTUVW"),
|
||||||
|
"I": ("ABCDEFGHIJKLM", "WXYZNOPQRSTUV"),
|
||||||
|
"J": ("ABCDEFGHIJKLM", "WXYZNOPQRSTUV"),
|
||||||
|
"K": ("ABCDEFGHIJKLM", "VWXYZNOPQRSTU"),
|
||||||
|
"L": ("ABCDEFGHIJKLM", "VWXYZNOPQRSTU"),
|
||||||
|
"M": ("ABCDEFGHIJKLM", "UVWXYZNOPQRST"),
|
||||||
|
"N": ("ABCDEFGHIJKLM", "UVWXYZNOPQRST"),
|
||||||
|
"O": ("ABCDEFGHIJKLM", "TUVWXYZNOPQRS"),
|
||||||
|
"P": ("ABCDEFGHIJKLM", "TUVWXYZNOPQRS"),
|
||||||
|
"Q": ("ABCDEFGHIJKLM", "STUVWXYZNOPQR"),
|
||||||
|
"R": ("ABCDEFGHIJKLM", "STUVWXYZNOPQR"),
|
||||||
|
"S": ("ABCDEFGHIJKLM", "RSTUVWXYZNOPQ"),
|
||||||
|
"T": ("ABCDEFGHIJKLM", "RSTUVWXYZNOPQ"),
|
||||||
|
"U": ("ABCDEFGHIJKLM", "QRSTUVWXYZNOP"),
|
||||||
|
"V": ("ABCDEFGHIJKLM", "QRSTUVWXYZNOP"),
|
||||||
|
"W": ("ABCDEFGHIJKLM", "PQRSTUVWXYZNO"),
|
||||||
|
"X": ("ABCDEFGHIJKLM", "PQRSTUVWXYZNO"),
|
||||||
|
"Y": ("ABCDEFGHIJKLM", "OPQRSTUVWXYZN"),
|
||||||
|
"Z": ("ABCDEFGHIJKLM", "OPQRSTUVWXYZN"),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def generate_table(key):
|
||||||
|
"""
|
||||||
|
>>> generate_table('marvin') # doctest: +NORMALIZE_WHITESPACE
|
||||||
|
[('ABCDEFGHIJKLM', 'UVWXYZNOPQRST'), ('ABCDEFGHIJKLM', 'NOPQRSTUVWXYZ'),
|
||||||
|
('ABCDEFGHIJKLM', 'STUVWXYZNOPQR'), ('ABCDEFGHIJKLM', 'QRSTUVWXYZNOP'),
|
||||||
|
('ABCDEFGHIJKLM', 'WXYZNOPQRSTUV'), ('ABCDEFGHIJKLM', 'UVWXYZNOPQRST')]
|
||||||
|
"""
|
||||||
|
return [alphabet[char] for char in key.upper()]
|
||||||
|
|
||||||
|
|
||||||
|
def encrypt(key, words):
|
||||||
|
"""
|
||||||
|
>>> encrypt('marvin', 'jessica')
|
||||||
|
'QRACRWU'
|
||||||
|
"""
|
||||||
|
cipher = ""
|
||||||
|
count = 0
|
||||||
|
table = generate_table(key)
|
||||||
|
for char in words.upper():
|
||||||
|
cipher += get_opponent(table[count], char)
|
||||||
|
count = (count + 1) % len(table)
|
||||||
|
return cipher
|
||||||
|
|
||||||
|
|
||||||
|
def decrypt(key, words):
|
||||||
|
"""
|
||||||
|
>>> decrypt('marvin', 'QRACRWU')
|
||||||
|
'JESSICA'
|
||||||
|
"""
|
||||||
|
return encrypt(key, words)
|
||||||
|
|
||||||
|
|
||||||
|
def get_position(table, char):
|
||||||
|
"""
|
||||||
|
>>> table = [
|
||||||
|
... ('ABCDEFGHIJKLM', 'UVWXYZNOPQRST'), ('ABCDEFGHIJKLM', 'NOPQRSTUVWXYZ'),
|
||||||
|
... ('ABCDEFGHIJKLM', 'STUVWXYZNOPQR'), ('ABCDEFGHIJKLM', 'QRSTUVWXYZNOP'),
|
||||||
|
... ('ABCDEFGHIJKLM', 'WXYZNOPQRSTUV'), ('ABCDEFGHIJKLM', 'UVWXYZNOPQRST')]
|
||||||
|
>>> get_position(table, 'A')
|
||||||
|
(None, None)
|
||||||
|
"""
|
||||||
|
if char in table[0]:
|
||||||
|
row = 0
|
||||||
|
else:
|
||||||
|
row = 1 if char in table[1] else -1
|
||||||
|
return (None, None) if row == -1 else (row, table[row].index(char))
|
||||||
|
|
||||||
|
|
||||||
|
def get_opponent(table, char):
|
||||||
|
"""
|
||||||
|
>>> table = [
|
||||||
|
... ('ABCDEFGHIJKLM', 'UVWXYZNOPQRST'), ('ABCDEFGHIJKLM', 'NOPQRSTUVWXYZ'),
|
||||||
|
... ('ABCDEFGHIJKLM', 'STUVWXYZNOPQR'), ('ABCDEFGHIJKLM', 'QRSTUVWXYZNOP'),
|
||||||
|
... ('ABCDEFGHIJKLM', 'WXYZNOPQRSTUV'), ('ABCDEFGHIJKLM', 'UVWXYZNOPQRST')]
|
||||||
|
>>> get_opponent(table, 'A')
|
||||||
|
'A'
|
||||||
|
"""
|
||||||
|
row, col = get_position(table, char.upper())
|
||||||
|
if row == 1:
|
||||||
|
return table[0][col]
|
||||||
|
else:
|
||||||
|
return table[1][col] if row == 0 else char
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
import doctest
|
||||||
|
|
||||||
|
doctest.testmod() # Fist ensure that all our tests are passing...
|
||||||
|
"""
|
||||||
|
ENTER KEY: marvin
|
||||||
|
ENTER TEXT TO ENCRYPT: jessica
|
||||||
|
ENCRYPTED: QRACRWU
|
||||||
|
DECRYPTED WITH KEY: JESSICA
|
||||||
|
"""
|
||||||
|
key = input("ENTER KEY: ").strip()
|
||||||
|
text = input("ENTER TEXT TO ENCRYPT: ").strip()
|
||||||
|
cipher_text = encrypt(key, text)
|
||||||
|
|
||||||
|
print(f"ENCRYPTED: {cipher_text}")
|
||||||
|
print(f"DECRYPTED WITH KEY: {decrypt(key, cipher_text)}")
|
Loading…
Reference in New Issue
Block a user