This is an implementation of VIGENRE in C# using only basic operations and compatible with .NET 2.0.
#region using System; #endregion namespace Vigenere { internal class Program { private static void Main(string[] args) { Console.WriteLine(wasEncryptVigenere("It is a good day!", "was")); Console.WriteLine(wasDecryptVigenere("Et ao a ykov zaq!", "was")); Console.ReadKey(); } ////////////////////////////////////////////////////////////////////////// // Copyright (C) Wizardry and Steamworks 2014 - License: GNU GPLv3 // /////////////////////////////////////////////////////////////////////////// /// <summary> /// Permutes an array in reverse a given number of times. /// </summary> /// <typeparam name="T">the array type</typeparam> /// <param name="input">the array</param> /// <param name="times">the number of times to permute</param> /// <returns>the array with the elements permuted</returns> private static T[] wasReversePermuteArrayElements<T>(T[] input, int times) { if (times.Equals(0)) return input; T[] slice = new T[input.Length]; Array.Copy(input, 1, slice, 0, input.Length - 1); Array.Copy(input, 0, slice, input.Length - 1, 1); return wasReversePermuteArrayElements(slice, --times); } /////////////////////////////////////////////////////////////////////////// // Copyright (C) Wizardry and Steamworks 2014 - License: GNU GPLv3 // /////////////////////////////////////////////////////////////////////////// /// <summary> /// Expand the VIGENRE key to the length of the input. /// </summary> /// <param name="input">the input to expand to</param> /// <param name="enc_key">the key to expand</param> /// <returns>the expanded key</returns> private static string wasVigenereExpandKey(string input, string enc_key) { string exp_key = ""; int i = 0, j = 0; do { char p = input[i]; if (!char.IsLetter(p)) { exp_key += p; ++i; continue; } int m = j%enc_key.Length; exp_key += enc_key[m]; ++j; ++i; } while (i < input.Length); return exp_key; } /////////////////////////////////////////////////////////////////////////// // Copyright (C) Wizardry and Steamworks 2014 - License: GNU GPLv3 // /////////////////////////////////////////////////////////////////////////// /// <summary> /// Encrypt using VIGENERE. /// </summary> /// <param name="input">the input to encrypt</param> /// <param name="enc_key">the key to encrypt with</param> /// <returns>the encrypted input</returns> private static string wasEncryptVigenere(string input, string enc_key) { char[] a = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' }; enc_key = wasVigenereExpandKey(input, enc_key); string result = ""; int i = 0; do { char p = input[i]; if (!char.IsLetter(p)) { result += p; ++i; continue; } char q = wasReversePermuteArrayElements(a, Array.IndexOf(a, enc_key[i]))[ Array.IndexOf(a, char.ToLowerInvariant(p))]; if (char.IsUpper(p)) { q = char.ToUpperInvariant(q); } result += q; ++i; } while (i < input.Length); return result; } /////////////////////////////////////////////////////////////////////////// // Copyright (C) Wizardry and Steamworks 2014 - License: GNU GPLv3 // /////////////////////////////////////////////////////////////////////////// /// <summary> /// Decrypt using VIGENERE. /// </summary> /// <param name="input">the input to decrypt</param> /// <param name="enc_key">the key to decrypt with</param> /// <returns>the decrypted input</returns> private static string wasDecryptVigenere(string input, string enc_key) { char[] a = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' }; enc_key = wasVigenereExpandKey(input, enc_key); string result = ""; int i = 0; do { char p = input[i]; if (!char.IsLetter(p)) { result += p; ++i; continue; } char q = a[ Array.IndexOf(wasReversePermuteArrayElements(a, Array.IndexOf(a, enc_key[i])), char.ToLowerInvariant(p))]; if (char.IsUpper(p)) { q = char.ToUpperInvariant(q); } result += q; ++i; } while (i < input.Length); return result; } } }