A ROT-13 implementation in CSharp

ROT-13 is a simple substitution cipher where the current character is rotated by 13 characters, which finds its symmetrical opposite in the modern English alphabet. This property allows the cipher to be reciprocal and therefore it can be used to obfuscate a clear text string and also transform the obfuscated string back into its original clear text equivalent.

I use the term obfuscation in the previous paragraph to emphasize the fact that the ROT-13 cipher is not secure and any obfuscated strings can be easily reversed simply by knowing that a ROT-13 cipher has been used.

The Implementation

The implementation of the cipher is really simple and there are many approaches that one can use to achieve the same outcome. The one I chose is based on a lookup table that I initially build and then use many times. This is basically the same approach used in the Python module this (enter import this on a python prompt). You can see the implementation by finding the this.py file that comes with your python implementation.

The lookup table that I use is implemented using a generic dictionary. When the Rot13 function is called, I check if the lookup table exists and if it doesn't, I'll build it. I use the seeds 65 and 97, which are the ASCII values for A and a respectively, and from there I move 26 values to the right while applying a modulo 26, which tells me if I need to wrap-around to the beginning.

Once the lookup table is built, I can use it by simply going over the string parameter passed into Rot13, and substituting each character in the string by the corresponding value in the lookup table. This is what it looks like:

private Dictionary<char, char> d = null;

public string Rot13(string s) {
    if (d == null || d.Count == 0) {         // build the lookup table
        d = new Dictionary<char, char>();    //  if needed
        int[] sr = { 65, 97 };               // A=65; a=97; ASCII Codes
        foreach (int c in sr) {
            for (int i = 0; i < 26; i++) {   // 26 alpha chars
                d.Add((char)(i + c), (char)((i + 13) % 26 + c));
            }
        }
    }

    StringBuilder sb = new StringBuilder();
    foreach (var item in s.ToCharArray()) {
        if (d.ContainsKey(item))             // Worry only about alpha characters
            sb.Append(d[item]);              //  leave number, etc. untouched
        else
            sb.Append(item);
    }

    return sb.ToString();
}

Using the Algorithm

To use the ROT-13 cipher algorithm above, you simply have to call the Rot13 function and send it a string parameter which represents the string you want to obfuscate. In the example code below the Main function uses a command line argument passed in:

static void Main(string[] args) {
    if (args.Length == 0) {
        WL("Please provide a string to obfuscate using the ROT 13 cypher.");
        Environment.Exit(0);
    }

    Program p = new Program();

    WL(String.Format("Original String: {0}", args[0]));
    WL(String.Format("Obfuscated String: {0}", p.Rot13(args[0])));
    WL(String.Format("De-Obfuscated String: {0}", p.Rot13(p.Rot13(args[0]))));

    WL("\nPress enter to continue...");
    RL();
}

static Func<string> RL = () => Console.ReadLine();
static Action<Object> WL = obj => Console.WriteLine(obj);</pre>

If you call the Rot13.exe program like this:

H:\>Rot13.exe HELLO

Your output will be the following:

Original String: HELLO
Obfuscated String: URYYB
De-Obfuscated String: HELLO
Press enter to continue...

Conclusion

I am teaching myself cryptography and security concepts and I am using this venue to write my notes and solidify my ideas on this topic. I will be filing these under the crypto and security tags.

Comments

Comments powered by Disqus