Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for Playfair Cipher by kurosawa4434
from string import ascii_lowercase, digits
SMALL_X = 'x'
SMALL_Z = 'z'
def make_cv_table(key):
cv_string = ''.join([k for i, k in enumerate(key) if k not in key[:i]]
+ [x for x in ascii_lowercase+digits if x not in key])
return [cv_string[6 * x: 6 * x + 6] for x in range(6)]
def search_chr(ch, cv_table):
for i in range( len(cv_table)):
if ch in cv_table[i]:
return i, cv_table[i].index(ch)
def encode(message, key):
cv_table = make_cv_table(key)
cv_chr_list = [x for x in message.lower()[::-1] if x in ascii_lowercase+digits]
cv_message = ''
wk_chr = ''
while cv_chr_list:
wk_chr += cv_chr_list.pop()
if len(wk_chr) == 2:
if wk_chr[0] == wk_chr[1]:
cv_chr_list.append(wk_chr[1])
cv_message += wk_chr[0] + (SMALL_X if wk_chr[0] != SMALL_X else SMALL_Z)
else:
cv_message += wk_chr
wk_chr = ''
else :
if not cv_chr_list:
cv_message += wk_chr[0] + (SMALL_Z if wk_chr[0] != SMALL_Z else SMALL_X)
result = ''
for i in range(len(cv_message) // 2):
a_j, a_k = search_chr(cv_message[i * 2], cv_table)
b_j, b_k = search_chr(cv_message[i * 2 + 1], cv_table)
if a_j != b_j and a_k != b_k:
result += cv_table[a_j][b_k]
result += cv_table[b_j][a_k]
if a_j != b_j and a_k == b_k:
result += cv_table[a_j + 1 if a_j < 5 else 0][a_k]
result += cv_table[b_j + 1 if b_j < 5 else 0][b_k]
if a_j == b_j and a_k != b_k:
result += cv_table[a_j][a_k + 1 if a_k < 5 else 0]
result += cv_table[b_j][b_k + 1 if b_k < 5 else 0]
return result
def decode(secret_message, key):
cv_table = make_cv_table(key)
result = ''
for i in range(len(secret_message) // 2):
a_j, a_k = search_chr(secret_message[i * 2], cv_table)
b_j, b_k = search_chr(secret_message[i * 2 + 1], cv_table)
if a_j != b_j and a_k != b_k:
result += cv_table[a_j][b_k]
result += cv_table[b_j][a_k]
if a_j != b_j and a_k == b_k:
result += cv_table[a_j - 1 if a_j > 0 else 5][a_k]
result += cv_table[b_j - 1 if b_j > 0 else 5][b_k]
if a_j == b_j and a_k != b_k:
result += cv_table[a_j][a_k - 1 if a_k > 0 else 5]
result += cv_table[b_j][b_k - 1 if b_k > 0 else 5]
return result
July 16, 2016
Comments: