/// /// DES3 encryption and decryption /// public class Des3 { #region CBC mode ** /// /// DES3 CBC mode encryption /// /// key /// IV /// byte array plaintext /// byte array ciphertext public static byte [] Des3EncodeCBC (byte [] key, byte [] iv, byte [] data) { // Copy on MSDN try { // Create a MemoryStream. MemoryStream mStream = new MemoryStream (); TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider (); tdsp.Mode = CipherMode.CBC; // Default tdsp.Padding = PaddingMode.PKCS7; // Default // Create a CryptoStream using the MemoryStream // And the passed key and initialization vector (IV). CryptoStream cStream = new CryptoStream (mStream, tdsp.CreateEncryptor (key, iv), CryptoStreamMode.Write); // Write the byte array to the crypto stream and flush it. cStream.Write (data, 0, data.Length); cStream.FlushFinalBlock (); // Get an array of bytes from the // MemoryStream that holds the // Encrypted data. byte [] ret = mStream.ToArray (); // Close the streams. cStream.Close (); mStream.Close (); // Return the encrypted buffer. return ret; } catch (CryptographicException e) { Console.WriteLine ("A Cryptographic error occurred: {0}", e.Message); return null; } } /// /// DES3 CBC mode decryption /// /// key /// IV /// byte array ciphertext /// byte array plaintext public static byte [] Des3DecodeCBC (byte [] key, byte [] iv, byte [] data) { try { // Create a new MemoryStream using the passed // Array of encrypted data. MemoryStream msDecrypt = new MemoryStream (data); TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider (); tdsp.Mode = CipherMode.CBC; tdsp.Padding = PaddingMode.PKCS7; // Create a CryptoStream using the MemoryStream // And the passed key and initialization vector (IV). CryptoStream csDecrypt = new CryptoStream (msDecrypt, tdsp.CreateDecryptor (key, iv), CryptoStreamMode.Read); // Create buffer to hold the decrypted data. byte [] fromEncrypt = new byte; // Read the decrypted data out of the crypto stream // And place it into the temporary buffer. csDecrypt.Read (fromEncrypt, 0, fromEncrypt.Length); // Convert the buffer into a string and return it. return fromEncrypt; } catch (CryptographicException e) { Console.WriteLine ("A Cryptographic error occurred: {0}", e.Message); return null; } } #endregion #region ECB mode /// /// DES3 ECB mode encryption /// /// key /// IV (when the mode ECB, IV useless) /// plaintext byte array /// byte array ciphertext public static byte [] Des3EncodeECB (byte [] key, byte [] iv, byte [] data) { try { // Create a MemoryStream. MemoryStream mStream = new MemoryStream (); TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider (); tdsp.Mode = CipherMode.ECB; tdsp.Padding = PaddingMode.PKCS7; // Create a CryptoStream using the MemoryStream // And the passed key and initialization vector (IV). CryptoStream cStream = new CryptoStream (mStream, tdsp.CreateEncryptor (key, iv), CryptoStreamMode.Write); // Write the byte array to the crypto stream and flush it. cStream.Write (data, 0, data.Length); cStream.FlushFinalBlock (); // Get an array of bytes from the // MemoryStream that holds the // Encrypted data. byte [] ret = mStream.ToArray (); // Close the streams. cStream.Close (); mStream.Close (); // Return the encrypted buffer. return ret; } catch (CryptographicException e) { Console.WriteLine ("A Cryptographic error occurred: {0}", e.Message); return null; } } /// /// DES3 ECB decryption mode /// /// key /// IV (when the mode ECB, IV useless) /// byte array ciphertext /// byte array plaintext public static byte [] Des3DecodeECB (byte [] key, byte [] iv, byte [] data) { try { // Create a new MemoryStream using the passed // Array of encrypted data. MemoryStream msDecrypt = new MemoryStream (data); TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider (); tdsp.Mode = CipherMode.ECB; tdsp.Padding = PaddingMode.PKCS7; // Create a CryptoStream using the MemoryStream // And the passed key and initialization vector (IV). CryptoStream csDecrypt = new CryptoStream (msDecrypt, tdsp.CreateDecryptor (key, iv), CryptoStreamMode.Read); // Create buffer to hold the decrypted data. byte [] fromEncrypt = new byte; // Read the decrypted data out of the crypto stream // And place it into the temporary buffer. csDecrypt.Read (fromEncrypt, 0, fromEncrypt.Length); // Convert the buffer into a string and return it. return fromEncrypt; } catch (CryptographicException e) { Console.WriteLine ("A Cryptographic error occurred: {0}", e.Message); return null; } } #endregion /// /// Class Testing /// public static void Test () { System.Text.Encoding utf8 = System.Text.Encoding.UTF8; // Key is abcdefghijklmnopqrstuvwx of Base64 encoding byte [] key = Convert.FromBase64String ("YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4"); byte [] iv = new byte [] {1, 2, 3, 4, 5, 6, 7, 8}; // When the mode when the ECB, IV useless byte [] data = utf8.GetBytes ("China ABCabc123"); System.Console.WriteLine ("ECB mode:"); byte [] str1 = Des3.Des3EncodeECB (key, iv, data); byte [] str2 = Des3.Des3DecodeECB (key, iv, str1); System.Console.WriteLine (Convert.ToBase64String (str1)); System.Console.WriteLine (System.Text.Encoding.UTF8.GetString (str2)); System.Console.WriteLine (); System.Console.WriteLine ("CBC mode:"); byte [] str3 = Des3.Des3EncodeCBC (key, iv, data); byte [] str4 = Des3.Des3DecodeCBC (key, iv, str3); System.Console.WriteLine (Convert.ToBase64String (str3)); System.Console.WriteLine (utf8.GetString (str4)); System.Console.WriteLine (); } }