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):
|
def keymat(k):
|
||||||
key = ''.join(sorted(set(key.upper()), key=key.upper().index))
|
k = k.upper().replace('J', 'I')
|
||||||
alphabet = "ABCDEFGHIKLMNOPQRSTUVWXYZ" # J omitted
|
seen = set(); seq = []
|
||||||
unique = []
|
for ch in (k + "ABCDEFGHIKLMNOPQRSTUVWXYZ"):
|
||||||
for ch in key:
|
if ch.isalpha() and ch not in seen:
|
||||||
if ch != 'J' and ch not in unique:
|
seen.add(ch); seq.append(ch)
|
||||||
unique.append(ch)
|
return [seq[i:i+5] for i in range(0, 25, 5)]
|
||||||
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 find_pos(matrix, char):
|
def pairs(s, prep=True):
|
||||||
for row_idx, row in enumerate(matrix):
|
s = ''.join(ch for ch in s.upper() if ch.isalpha())
|
||||||
if char in row:
|
if prep:
|
||||||
col_idx = row.index(char)
|
s = s.replace('J', 'I')
|
||||||
return row_idx, col_idx
|
p = []; i = 0
|
||||||
return None
|
while i < len(s):
|
||||||
|
a = s[i]; b = s[i+1] if i+1 < len(s) else 'X'
|
||||||
def prepare_text(text):
|
if a == b:
|
||||||
text = ''.join(ch for ch in text.upper() if ch.isalpha()).replace('J', 'I')
|
p.append(a + 'X'); i += 1
|
||||||
pairs, i = [], 0
|
else:
|
||||||
while i < len(text):
|
p.append(a + b); i += 2
|
||||||
if i + 1 < len(text) and text[i] != text[i + 1]:
|
return p
|
||||||
pairs.append(text[i:i + 2])
|
return [s[i:i+2] for i in range(0, len(s), 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 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:
|
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:
|
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:
|
else:
|
||||||
ctext.append(matrix[r1][c2] + matrix[r2][c1])
|
out.append(m[r1][c2] + m[r2][c1])
|
||||||
|
return ''.join(out)
|
||||||
|
|
||||||
return ''.join(ctext)
|
enc = lambda pt, k: playfair(pt, k, True)
|
||||||
|
dec = lambda ct, k: playfair(ct, k, False)
|
||||||
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__':
|
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