#!/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()
