The GUI is designed with the GUI designer Stetic in Monodevelop, for developing GTK#-applications. We can choose the Mode of the cryptographic algorithm, default here is Cipher Block Chaining. We can also set the padding of the cryptographic algorithm. Note that not all combinations are legal. I have tested with Rijndael, Cipher Block Chaining and padding set to Zeros, which seems to be working ok. You can use the demo here to test out other combinations. You can also generate different Initialization Vectors and Keys to use with the algorithm.
The code to achieve the encryption and decryption is listed below:
using System; using System.Security.Cryptography; using Gtk; using System.IO; public partial class MainWindow: Gtk.Window { private SymmetricAlgorithm _symmetricAlgorithm; private byte[] _intializationVector; private byte[] _key; private byte[] _cipherBytes; public MainWindow () : base (Gtk.WindowType.Toplevel) { Build (); } protected void OnDeleteEvent (object sender, DeleteEventArgs a) { Application.Quit (); a.RetVal = true; } protected void btnGenerateIVClick (object sender, EventArgs e) { _symmetricAlgorithm = CreateSymmetricAlgorithm (); _symmetricAlgorithm.GenerateIV (); _intializationVector = _symmetricAlgorithm.IV; lbInitializationVector.Text = Convert.ToBase64String(_symmetricAlgorithm.IV); // MessageDialog msgBox = new MessageDialog (null, DialogFlags.Modal, // MessageType.Info, ButtonsType.Ok, "Why hello world!"); // msgBox.Run (); // msgBox.Destroy (); } protected void btnEncrypt_Click (object sender, EventArgs e) { _symmetricAlgorithm = CreateSymmetricAlgorithm (); //ensure that we use the selected algorithm _cipherBytes = Encrypt(textviewPlainText.Buffer.Text); textviewCipher.Buffer.Text = Convert.ToBase64String(_cipherBytes); } private byte[] Encrypt(string text){ byte[] encrypted; ICryptoTransform encryptor = _symmetricAlgorithm.CreateEncryptor (_key, _intializationVector); using (MemoryStream msEncrypt = new MemoryStream ()) { using (CryptoStream csEncrypt = new CryptoStream (msEncrypt, encryptor, CryptoStreamMode.Write)) { using (StreamWriter swWriter = new StreamWriter (csEncrypt)) { swWriter.Write (text); } encrypted = msEncrypt.ToArray (); } } return encrypted; } private string Decrypt(byte[] cipherBytes){ try { ICryptoTransform decryptor = _symmetricAlgorithm.CreateDecryptor (_key, _intializationVector); using (MemoryStream msEncrypt = new MemoryStream (cipherBytes)) { using (CryptoStream csEncrypt = new CryptoStream (msEncrypt, decryptor, CryptoStreamMode.Read)) { using (StreamReader sReader = new StreamReader (csEncrypt)) { string decrypted = sReader.ReadToEnd(); return decrypted; } } } } catch (Exception err) { Console.WriteLine (err.Message); } return string.Empty; } private SymmetricAlgorithm CreateSymmetricAlgorithm(){ SymmetricAlgorithm sa = null; if (rbDES.Active) sa = DESCryptoServiceProvider.Create (); if (rbThreeDES.Active) sa = TripleDESCryptoServiceProvider.Create (); if (rbRijndael.Active) sa = RijndaelManaged.Create (); if (sa == null) sa = DESCryptoServiceProvider.Create (); if (_intializationVector != null) sa.IV = _intializationVector; if (_key != null) sa.Key = _key; sa.Mode = GetCipherMode (); sa.Padding = GetPadding (); return sa; } private PaddingMode GetPadding(){ if (rbPaddingNone.Active) return PaddingMode.None; if (rbPaddingZeros.Active) return PaddingMode.PKCS7; if (rbPaddingAnsiX923.Active) return PaddingMode.ANSIX923; if (rbPaddingISO1126.Active) return PaddingMode.ISO10126; return PaddingMode.Zeros; } private CipherMode GetCipherMode(){ if (rbCBC.Active) return CipherMode.CBC; if (rbCFB.Active) return CipherMode.CFB; if (rbCTS.Active) return CipherMode.CTS; if (rbECB.Active) return CipherMode.ECB; if (rbOFB.Active) return CipherMode.OFB; return CipherMode.CBC; } protected void btnKeyClick (object sender, EventArgs e) { _symmetricAlgorithm = CreateSymmetricAlgorithm (); _symmetricAlgorithm.GenerateKey (); _key = _symmetricAlgorithm.Key; lblKey.Text = Convert.ToBase64String (_symmetricAlgorithm.Key); } protected void btnDecryptClick (object sender, EventArgs e) { _symmetricAlgorithm = CreateSymmetricAlgorithm (); //ensure that we use the selected algorithm string decrypted = Decrypt(Convert.FromBase64String(textviewCipher.Buffer.Text)); textviewDecrypted.Buffer.Text = decrypted; } }
To open up this sample, I have uploaded the MonoDevelop project as a tar.bz2 file available for download here: Sample project Monodevelop in this article To unzip the tar bunzip2 file, just the following command:
tar xjvf Symmetric.tar.bz2 Just so you know: tar - Tape ARchiver And the options: x - extract v - verbose output (lists all files as they are extracted) j - deal with bzipped file f - read from a file, rather than a tape device "tar --help" will give you more options and info After unpacking, just open the solution in MonoDevelop.