type Chaocipher:Mode enum int ENCRYPT, DECRYPT end type Chaocipher text L_ALPHABET = "HXUCZVAMDSLKPEFJRIGTWOBNYQ" text R_ALPHABET = "PTLNBQDEOYSFAVZKGJRIHWXUMC" fun exec = text by text value, Chaocipher:Mode mode, logic showSteps ^|since texts are mutable, we can operate directly on them without the need of Lists|^ text left = *L_ALPHABET # by using the valueOf operator we are sure that the string is copied text right = *R_ALPHABET text eText = text(" ", value.length) text temp = text(" ", 26) for int i = 0; i < value.length; ++i if showSteps do writeLine(left + " " + right) end int index = 0 if mode == Chaocipher:Mode.ENCRYPT index = right.find(value[i]) eText[i] = left[index] else index = left.find(value[i]) eText[i] = right[index] end if i == value.length - 1 do break end # permute left for int j = index; j < 26; ++j do temp[j - index] = left[j] end for int j = 0; j < index; ++j do temp[26 - index + j] = left[j] end var store = temp[1] for int j = 2; j < 14; ++j do temp[j - 1] = temp[j] end temp[13] = store left = *temp # permute right for int j = index; j < 26; ++j do temp[j - index] = right[j] end for int j = 0; j < index; ++j do temp[26 - index + j] = right[j] end store = temp[0] for int j = 1; j < 26; ++j do temp[j - 1] = temp[j] end temp[25] = store store = temp[2] for int j = 3; j < 14; ++j do temp[j - 1] = temp[j] end temp[13] = store right = *temp end return eText end var plainText = "WELLDONEISBETTERTHANWELLSAID" writeLine("The original plaintext is : " + plainText) writeLine(EOL + "The left and right alphabets after each permutation during encryption are :" + EOL) var cipherText = exec(plainText, Chaocipher:Mode.ENCRYPT, true) writeLine(EOL + "The ciphertext is : " + cipherText) var plainText2 = exec(cipherText, Chaocipher:Mode.DECRYPT, false) writeLine(EOL + "The recovered plaintext is : " + plainText2)