From badd50233151ab9138753569d8d827261388ad34 Mon Sep 17 00:00:00 2001 From: Student Date: Tue, 19 Aug 2025 09:23:21 +0530 Subject: [PATCH] shortened pf --- IS/Lab/Lab1/q3_playfair.py | 111 +++++++++++++------------------------ 1 file changed, 38 insertions(+), 73 deletions(-) diff --git a/IS/Lab/Lab1/q3_playfair.py b/IS/Lab/Lab1/q3_playfair.py index 1fb4ddd..b304ecb 100644 --- a/IS/Lab/Lab1/q3_playfair.py +++ b/IS/Lab/Lab1/q3_playfair.py @@ -1,81 +1,46 @@ -def generate_playfair_matrix(key): - key = ''.join(sorted(set(key.upper()), key=key.upper().index)) - alphabet = "ABCDEFGHIKLMNOPQRSTUVWXYZ" # J omitted - unique = [] - for ch in key: - if ch != 'J' and ch not in unique: - unique.append(ch) - for ch in alphabet: - if ch not in unique: - unique.append(ch) - return [unique[i:i+5] for i in range(0, 25, 5)] +def keymat(k): + k = k.upper().replace('J', 'I') + seen = set(); seq = [] + for ch in (k + "ABCDEFGHIKLMNOPQRSTUVWXYZ"): + if ch.isalpha() and ch not in seen: + seen.add(ch); seq.append(ch) + return [seq[i:i+5] for i in range(0, 25, 5)] -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(ch for ch in text.upper() if ch.isalpha()).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]) +def pairs(s, prep=True): + s = ''.join(ch for ch in s.upper() if ch.isalpha()) + if prep: + s = s.replace('J', 'I') + p = []; i = 0 + while i < len(s): + a = s[i]; b = s[i+1] if i+1 < len(s) else 'X' + if a == b: + p.append(a + 'X'); i += 1 + else: + p.append(a + b); i += 2 + return p + return [s[i:i+2] for i in range(0, len(s), 2)] +def playfair(text, key, enc=True): + m = keymat(key) + pos = {m[r][c]: (r, c) for r in range(5) for c in range(5)} + out = [] + for a, b in pairs(text, prep=enc): + r1, c1 = pos[a]; r2, c2 = pos[b] if r1 == r2: - ctext.append(matrix[r1][(c1 + 1) % 5] + matrix[r2][(c2 + 1) % 5]) + out.append(m[r1][(c1 + (1 if enc else -1)) % 5] + + m[r2][(c2 + (1 if enc else -1)) % 5]) elif c1 == c2: - ctext.append(matrix[(r1 + 1) % 5][c1] + matrix[(r2 + 1) % 5][c2]) + out.append(m[(r1 + (1 if enc else -1)) % 5][c1] + + m[(r2 + (1 if enc else -1)) % 5][c2]) else: - ctext.append(matrix[r1][c2] + matrix[r2][c1]) + out.append(m[r1][c2] + m[r2][c1]) + return ''.join(out) - 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) +enc = lambda pt, k: playfair(pt, k, True) +dec = lambda ct, k: playfair(ct, k, False) if __name__ == '__main__': - main() \ No newline at end of file + pt = input("Plaintext: ") + k = input("Key: ") + ct = enc(pt, k); print("Ciphertext:", ct) + print("Decrypted:", dec(ct, k)) \ No newline at end of file