shortened pf
This commit is contained in:
		
							parent
							
								
									de98ad4268
								
							
						
					
					
						commit
						badd502331
					
				
					 1 changed files with 38 additions and 73 deletions
				
			
		|  | @ -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() | ||||
|     pt = input("Plaintext: ") | ||||
|     k  = input("Key: ") | ||||
|     ct = enc(pt, k); print("Ciphertext:", ct) | ||||
|     print("Decrypted:", dec(ct, k)) | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue