How to Encrypt and Decrypt Text using chaocipher in Console Application

Description:-

In this Article we will encrypt and Decrypt Text using cipher Encryption in Console Application. Here you can insert your Cipher Text for Encrypt and Decrypt your Text Data in Cipher text.

How does the cipher work?

For full details of how the cipher is applied, you should consult Mr Rubin's paper which, by cryptographic standards, is very easy to read and understand.
Briefly, the idea is that you start with two alphabets: a 'left' alphabet (for ciphertext) and a 'right' alphabet (for plaintext).

You then convert each letter in the plaintext to ciphertext by looking up the index of the former in the right alphabet and then using that index of read off the corresponding ciphertext letter from the left alphabet.

However, unlike a normal substitution cipher, you then make some permutations to both the left and right alphabets before encrypting the next letter. Similar operations are carried out after encrypting each letter until the plaintext is exhausted.

Decryption follows a similar pattern except that the permutations used are slightly different from those used in encryption.

This is a clever idea which is known as an 'autokey' cipher in cryptography because the next key is generated from the previous one. Clearly, the permutations used need to be such that they can be easily reversed by the decryption process.

C# Implementation

Although a C# implementation is said to exist, I could not find it on the internet and so have written my own.

The following console application is based on the algorithm described in Mr Rubin's paper and uses the example which he gives so we can check that it is working correctly. The resulting ciphertext is then decrypted back to the plaintext.

No attempt has been made to optimize the code though, for a large piece of plaintext, performance could almost certainly be improved by using unsafe code and pointers to manipulate the character arrays.

Step 1: Create Console Application and Code below to understand how it works.

        static void Main(string[] args)
        {
            string plainText = "UMESHPATELAHMEDABAD";
            Console.WriteLine("The original plainText is : {0}", plainText);
            Console.WriteLine("\nThe left and right alphabets after each permutation during encryption are\n");
            string cipherText = Chao.Encrypt(plainText);
            Console.WriteLine("\nThe ciphertext is {0}\n", cipherText);
            string plainText2 = Chao.Decrypt(cipherText);
            Console.WriteLine("\nThe recovered plaintext is {0}", plainText2);
            Console.ReadKey();
        }

        static class Chao
        {
            private static string lAlphabet = "HXUCZVAMDSLKPEFJRIGTWOBNYQ";
            private static string rAlphabet = "PTLNBQDEOYSFAVZKGJRIHWXUMC";

            public static string Encrypt(string plainText)
            {
                char[] left = lAlphabet.ToCharArray();
                char[] right = rAlphabet.ToCharArray();
                char[] pText = plainText.ToCharArray();
                char[] cText = new char[pText.Length];
                char[] temp = new char[26];
                int index;
                char store; 
                for (int i = 0; i < pText.Length; i++)
                {
                    Console.WriteLine("{0}  {1}", new string(left), new string(right)); 
                    index = Array.IndexOf(right, pText[i]);
                    cText[i] = left[index];
                    if (i == pText.Length - 1) break; 
                    // permute left 
                    for (int j = index; j < 26; j++) temp[j - index] = left[j];
                    for (int j = 0; j < index; j++) temp[26 - index + j] = left[j];
                    store = temp[1];
                    for (int j = 2; j < 14; j++) temp[j - 1] = temp[j];
                    temp[13] = store;
                    temp.CopyTo(left, 0); 
                    // permute right 
                    for (int j = index; j < 26; j++) temp[j - index] = right[j];
                    for (int j = 0; j < index; j++) temp[26 - index + j] = right[j];
                    store = temp[0];
                    for (int j = 1; j < 26; j++) temp[j - 1] = temp[j];
                    temp[25] = store;
                    store = temp[2];
                    for (int j = 3; j < 14; j++) temp[j - 1] = temp[j];
                    temp[13] = store;
                    temp.CopyTo(right, 0);
                } 
                return new string(cText);
            }

            public static string Decrypt(string cipherText)
            {
                char[] left = lAlphabet.ToCharArray();
                char[] right = rAlphabet.ToCharArray();
                char[] cText = cipherText.ToCharArray();
                char[] pText = new char[cText.Length];
                char[] temp = new char[26];
                int index;
                char store; 
                for (int i = 0; i < cText.Length; i++)
                {
                    Console.WriteLine("{0}  {1}", new string(left), new string(right)); 
                    index = Array.IndexOf(left, cText[i]);
                    pText[i] = right[index];
                    if (i == cText.Length - 1) break; 
                    // permute left 
                    for (int j = index; j < 26; j++) temp[j - index] = left[j];
                    for (int j = 0; j < index; j++) temp[26 - index + j] = left[j];
                    store = temp[1];
                    for (int j = 2; j < 14; j++) temp[j - 1] = temp[j];
                    temp[13] = store;
                    temp.CopyTo(left, 0); 
                    // permute right 
                    for (int j = index; j < 26; j++) temp[j - index] = right[j];
                    for (int j = 0; j < index; j++) temp[26 - index + j] = right[j];
                    store = temp[0];
                    for (int j = 1; j < 26; j++) temp[j - 1] = temp[j];
                    temp[25] = store;
                    store = temp[2];
                    for (int j = 3; j < 14; j++) temp[j - 1] = temp[j];
                    temp[13] = store;
                    temp.CopyTo(right, 0);
                } 
                return new string(pText);
            }
        }

My Output looks like below image.

The print out of the left and right alphabets after each permutation during the decryption process has been suppressed as the output would otherwise have exceeded the length of a maximized console window on my machine.

I am not sure how strong this cipher is by modern cryptographic standards but clearly, relative to the effort needed to implement it, it is very strong indeed!

Although the present implementation only covers upper-case letters, it would be easy to adapt it to deal with larger character sets and, for those interested in developing their own ciphers, it should make an excellent starting point.

Related Posts

Previous
Next Post »

Thanks for comments.....