87 lines
No EOL
2.5 KiB
Python
87 lines
No EOL
2.5 KiB
Python
def generate_playfair_matrix(key):
|
|
key = ''.join(sorted(set(key.upper()), key=key.upper().index))
|
|
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
matrix = []
|
|
|
|
for char in key:
|
|
if char not in matrix and char != 'J':
|
|
matrix.append(char)
|
|
|
|
for char in alphabet:
|
|
if char not in matrix and char != 'J':
|
|
matrix.append(char)
|
|
|
|
playfair_matrix = [matrix[i:i+5] for i in range(0, len(matrix), 5)]
|
|
return playfair_matrix
|
|
|
|
def find_pos(matrix, char):
|
|
for row_idx, row in enumerate(matrix):
|
|
if char in row:
|
|
col_idx = row.index(char)
|
|
return row_idx, col_idx
|
|
return None
|
|
|
|
def prepare_text(text):
|
|
text = ''.join(filter(str.isalpha, text.upper()))
|
|
text = text.replace('J', 'I')
|
|
pairs = []
|
|
i = 0
|
|
while i < len(text):
|
|
if i + 1 < len(text) and text[i] != text[i+1]:
|
|
pairs.append(text[i:i+2])
|
|
i += 2
|
|
else:
|
|
pairs.append(text[i]+'X')
|
|
i += 1
|
|
return pairs
|
|
|
|
def playfair_en(ptext, pfk):
|
|
matrix = generate_playfair_matrix(pfk)
|
|
ptext_pairs = prepare_text(ptext)
|
|
|
|
ctext = []
|
|
for pair in ptext_pairs:
|
|
r1, c1 = find_pos(matrix, pair[0])
|
|
r2, c2 = find_pos(matrix, pair[1])
|
|
|
|
if r1 == r2:
|
|
ctext.append(matrix[r1][(c1 + 1) % 5] + matrix[r2][(c2 + 1) % 5])
|
|
elif c1 == c2:
|
|
ctext.append(matrix[(r1 + 1) % 5][c1] + matrix[(r2 + 1) % 5][c2])
|
|
else:
|
|
ctext.append(matrix[r1][c2] + matrix[r2][c1])
|
|
|
|
return ''.join(ctext)
|
|
|
|
def playfair_de(ctext, pfk):
|
|
matrix = generate_playfair_matrix(pfk)
|
|
ctext_pairs = prepare_text(ctext)
|
|
|
|
ptext = []
|
|
for pair in ctext_pairs:
|
|
r1, c1 = find_pos(matrix, pair[0])
|
|
r2, c2 = find_pos(matrix, pair[1])
|
|
|
|
if r1 == r2:
|
|
ptext.append(matrix[r1][(c1 - 1) % 5] + matrix[r2][(c2 - 1) % 5])
|
|
elif c1 == c2:
|
|
ptext.append(matrix[(r1 - 1) % 5][c1] + matrix[(r2 - 1) % 5][c2])
|
|
else:
|
|
ptext.append(matrix[r1][c2] + matrix[r2][c1])
|
|
|
|
return ''.join(ptext)
|
|
|
|
def main():
|
|
ptext = input("Kindly enter your desired plaintext: ")
|
|
pfk = input("Kindly enter the Playfair Key: ")
|
|
|
|
print("Welcome to the Playfair cipher system.")
|
|
print("Plaintext: ", ptext)
|
|
print("Playfair Key: ", pfk)
|
|
ctext = playfair_en(ptext, pfk)
|
|
print("Ciphertext: ", ctext)
|
|
decrypted_text = playfair_de(ctext, pfk)
|
|
print("Decrypted Text: ", decrypted_text)
|
|
|
|
if __name__ == '__main__':
|
|
main() |