#!/usr/bin/python """ An implementation of the ChaoCipher, a 1918 rotor cipher invented by John Byrne http://www.mountainvistasoft.com/chaocipher/ActualChaocipher/Chaocipher-Revealed-Algorithm.pdf (C) 2010 Jack Lloyd Use and distribution as specified by the MIT license (http://www.opensource.org/licenses/mit-license.php) """ def permute_left(disc, idx): disc = disc[idx:len(disc)] + disc[0:idx] # rotate zenith_1 = disc[1] del disc[1] disc.insert(13, zenith_1) return disc def permute_right(disc, idx): disc = disc[idx:len(disc)] + disc[0:idx] # rotate disc.append(disc.pop(0)) # rotate once more zenith_2 = disc[2] del disc[2] disc.insert(13, zenith_2) return disc def chaocipher_encrypt(pt_disc, ct_disc, plaintext): ct_disc = [c for c in ct_disc] pt_disc = [c for c in pt_disc] ciphertext = '' for c in plaintext: idx = pt_disc.index(c) ciphertext += ct_disc[idx] ct_disc = permute_left(ct_disc, idx) pt_disc = permute_right(pt_disc, idx) return ciphertext def chaocipher_decrypt(pt_disc, ct_disc, ciphertext): ct_disc = [c for c in ct_disc] pt_disc = [c for c in pt_disc] plaintext = '' for c in ciphertext: idx = ct_disc.index(c) plaintext += pt_disc[idx] ct_disc = permute_left(ct_disc, idx) pt_disc = permute_right(pt_disc, idx) return plaintext def main(): pt_disc = 'PTLNBQDEOYSFAVZKGJRIHWXUMC' ct_disc = 'HXUCZVAMDSLKPEFJRIGTWOBNYQ' ct = chaocipher_encrypt(pt_disc, ct_disc, 'WELLDONEISBETTERTHANWELLSAID') print ct print chaocipher_decrypt(pt_disc, ct_disc, ct) if __name__ == '__main__': main()