在VB.NET中加密,在PHP中解密

在VB.NET中加密,在PHP中解密,php,vb.net,encryption,tripledes,Php,Vb.net,Encryption,Tripledes,我正在尝试用PHP和VB.NET编写一个函数,用于双向传递加密数据。问题是,当我试图用PHP解密在VB.NET中加密的字符串时,我收到一条错误消息,说IV的块大小必须匹配 我在VB.NET中编写的类如下所示,它可以完美地对自己的块进行加密和解密,功能齐全 Imports System Imports System.Text Imports System.IO Imports System.Security.Cryptography Public Clas

我正在尝试用PHP和VB.NET编写一个函数,用于双向传递加密数据。问题是,当我试图用PHP解密在VB.NET中加密的字符串时,我收到一条错误消息,说IV的块大小必须匹配

我在VB.NET中编写的类如下所示,它可以完美地对自己的块进行加密和解密,功能齐全

    Imports System
    Imports System.Text
    Imports System.IO
    Imports System.Security.Cryptography

    Public Class Cipher

        Dim method As TripleDESCryptoServiceProvider
        Dim key As Byte()

        Public Property Password() As String
            Get
                Return System.Text.Encoding.Unicode.GetString(Key)
            End Get
            Set(value As String)
                key = System.Text.Encoding.Unicode.GetBytes(value)
            End Set
        End Property

        Public Function Encrypt(data As String) As String
            Dim ms As New System.IO.MemoryStream

            ' Create the encoder to write to the stream.
            Dim dataBytes() As Byte = System.Text.Encoding.Unicode.GetBytes(data)
            Dim encStream As New CryptoStream(ms, method.CreateEncryptor(), System.Security.Cryptography.CryptoStreamMode.Write)

            ' Use the crypto stream to write the byte array to the stream.
            encStream.Write(dataBytes, 0, dataBytes.Length)
            encStream.FlushFinalBlock()

            ' IV and Ciphered string are each Base64'd and seperated by a comma, then the whole result is Base64'd
            Return Convert.ToBase64String(System.Text.Encoding.Unicode.GetBytes(Convert.ToBase64String(method.IV) & "," & Convert.ToBase64String(ms.ToArray)))
        End Function

        Public Function Decrypt(data As String) As String
            ' Convert the encrypted text string to a byte array.

            Dim partDecoded As String = System.Text.Encoding.Unicode.GetString(Convert.FromBase64String(data))
            Dim dataBytes() As Byte

            If InStr(partDecoded, ",") > 0 Then

                Dim parts() As String = Split(partDecoded, ",")

                ' Get IV from first part
                method.IV = Convert.FromBase64String(parts(0))

                ' Get ciphered data from second part
                dataBytes = Convert.FromBase64String(parts(1))

                ' Create the stream.
                Dim ms As New System.IO.MemoryStream
                ' Create the decoder to write to the stream.
                Dim decStream As New CryptoStream(ms, method.CreateDecryptor(), System.Security.Cryptography.CryptoStreamMode.Write)

                ' Use the crypto stream to write the byte array to the stream.
                decStream.Write(dataBytes, 0, dataBytes.Length)
                decStream.FlushFinalBlock()

                ' Convert the plaintext stream to a string.
                Return System.Text.Encoding.Unicode.GetString(ms.ToArray)
            Else
                Return False
            End If

        End Function

        Public Sub New()
            method = New TripleDESCryptoServiceProvider
            method.Mode = CipherMode.CFB
            method.GenerateIV()
        End Sub
    End Class
上述类的示例用法

    Dim c As New Cipher
    c.Password = "12345"

    Dim encrypted As String = c.Encrypt("hello")
    Debug.Print(encrypted)

    Dim decrypted As String = c.Decrypt(encrypted)
    Debug.Print(decrypted)
现在我还有下面的PHP代码,它本身也可以工作

PHP示例用法

    $c = new Cipher("12345");
    $encrypted = $c->encrypt("hello");
    echo 'Encrypted: ' . $encrypted . '<br />';

    $decrypted = $c->decrypt($encrypted);
    echo 'Decrypted: ' . $decrypted . '<br />';

    $vb = "MwBOAEoAOQBjAEgAcQAyAC8ASABzAD0ALABmAEUAOQBaAHYAVwBzAFUAYQB3AFYARwBGAHUANABLAGUAVgB3AFcAaABRAD0APQA=";
    echo 'VB.NET Dec: ' . $c->decrypt($vb);
$c=新密码(“12345”);
$encrypted=$c->encrypt(“hello”);
回显“加密:”$加密的。”
; $decrypted=$c->decrypt($encrypted); echo“已解密:”$解密。”
; $vb=“mwboaeoaoqbjageacqayac8asabzad0alabauaoqbahyavwbzafuayqb3afyarwbgauauanabagavagb3afcaaaabrad0apqa=”; echo“VB.NET Dec:”$c->解密($vb);
上面我在PHP用法中包含的是用VB.NET生成的字符串,它在VB.NET中作为变量$VB进行了完美的解码


这让我非常恼火,因为代码是正确的,而且功能性很强——在这两种情况下——那么我遗漏了什么,你能指出/修复这个问题吗。我不想使用或探索其他密码方法,因为这是一种已经成熟的方法,可以在多台设备(iOS、Android、Windows、Linux等)上本机工作。

由于没有人能够提供功能齐全的双向解决方案,因此我在本文中冒昧地为社区提供了一种解决方案

问题是,PHP不符合标准,它强制填充字符串以匹配。目前,如果是在.NET和PHP之间随机生成的,则没有可靠的方法通过IV(如果您确实发现了如何更改,请随时修改)

以下是使用Triple-DES加密数据的完整解决方案,其方式与.NET和PHP兼容,允许双向Triple-DES加密通信。此方法还与Java、Delphi、Objective-C和许多其他语言兼容,但此处不提供此类代码,因为这不是问题的解决方案


VB.NET三重DES类
VB.NET三重DES类的用法
PHP三重DES类
为什么不是rijandel?速度慢,而且并非所有平台都是100%。那篇文章中也有一些不真实的东西,例如由于3次DES?…而减少了位加密。。。。算法本身比同一机制的3个过程要复杂一些。不管怎样,tripledes实际上是——rijandel不是。用Rijandel替换这个可能解决一个问题,但会造成其他十几个问题。我需要一个解决这个问题的办法。。。三倍。为什么它在这两种情况下都能完美地工作,但是,即使他们声称遵循RFC——而不是彼此。一个是没有遵循的,我打赌它是PHP.utility和working。然而,
mcrypt
将在将来从PHP中删除(已经在下一系列发行版中,即7.2),如何使用
openssl\u decrypt
方法进行解密呢?@W.M.鉴于7.x因其中断的应用程序数量太多而在逐步引入方面很慢,社区需要一些时间才能赶上(cPanel、IonCube等)。我正在寻找一种更健壮的方法来加密传输中的数据,因为我不喜欢3des(几年前很好)。可以说,3des比不加密原始数据要好。需要记住处理(客户端/服务器)和质量。Openssl的方法(php)问题是这个方法是唯一一个(似乎)在ios、droid、.net、php上工作的本地方法(没有第三方垃圾)contd--…这在每个平台上都是可以理解的。可以将.net上的A加密为B,并在ios/droid/php上解密B以再次获得A。大多数方法在跨越语言边界时在翻译方面似乎有一些怪癖(我认为不应该是这样,因为作为这些密码标准的数学和协议是应该遵循的,如果每个密码都是这样,那么他们应该能够翻译[解密]其他密码)谢谢。我正在研究这个问题,因为我不希望我的应用程序因为将来从
PHP
中删除
mcrypt
而变得不起作用。必须承认,交叉编程语言加密/解密的问题似乎很复杂。@W.M.-我有一种方法,可以使用证书对来自服务器使用私钥,客户端使用公钥解密。请参阅解决方案中的调整以提高性能。希望这有帮助:)
    $c = new Cipher("12345");
    $encrypted = $c->encrypt("hello");
    echo 'Encrypted: ' . $encrypted . '<br />';

    $decrypted = $c->decrypt($encrypted);
    echo 'Decrypted: ' . $decrypted . '<br />';

    $vb = "MwBOAEoAOQBjAEgAcQAyAC8ASABzAD0ALABmAEUAOQBaAHYAVwBzAFUAYQB3AFYARwBGAHUANABLAGUAVgB3AFcAaABRAD0APQA=";
    echo 'VB.NET Dec: ' . $c->decrypt($vb);
    Imports System
    Imports System.Text
    Imports System.IO
    Imports System.Security.Cryptography

    Public Class TripleDES

        Private bPassword As Byte()
        Private sPassword As String

        Public Sub New(Optional ByVal Password As String = "password")
            ' On Class Begin
            Me.Password = Password
        End Sub

        Public ReadOnly Property PasswordHash As String
            Get
                Dim UTF8 As System.Text.UTF8Encoding = New System.Text.UTF8Encoding
                Return UTF8.GetString(bPassword)
            End Get
        End Property

        Public Property Password() As String
            Get
                Dim UTF8 As System.Text.UTF8Encoding = New System.Text.UTF8Encoding
                Return sPassword
            End Get
            Set(value As String)
                Dim UTF8 As System.Text.UTF8Encoding = New System.Text.UTF8Encoding
                Dim HashProvider As MD5CryptoServiceProvider = New MD5CryptoServiceProvider()
                bPassword = HashProvider.ComputeHash(UTF8.GetBytes(value))
                sPassword = value
            End Set
        End Property

    #Region "Encrypt"

        ' Encrypt using Password from Property Set (pre-hashed)
        Public Function Encrypt(ByVal Message As String) As String
            Dim Results() As Byte
            Dim UTF8 As System.Text.UTF8Encoding = New System.Text.UTF8Encoding
            Using HashProvider As MD5CryptoServiceProvider = New MD5CryptoServiceProvider()
                Dim TDESKey() As Byte = bPassword
                Using TDESAlgorithm As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider() With {.Key = TDESKey, .Mode = CipherMode.ECB, .Padding = PaddingMode.PKCS7}
                    Dim DataToEncrypt() As Byte = UTF8.GetBytes(Message)
                    Try
                        Dim Encryptor As ICryptoTransform = TDESAlgorithm.CreateEncryptor
                        Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length)
                    Finally
                        TDESAlgorithm.Clear()
                        HashProvider.Clear()
                    End Try
                End Using
            End Using
            Return Convert.ToBase64String(Results)
        End Function

        ' Encrypt using Password as byte array
        Private Function Encrypt(ByVal Message As String, ByVal Password() As Byte) As String
            Dim Results() As Byte
            Dim UTF8 As System.Text.UTF8Encoding = New System.Text.UTF8Encoding
            Using HashProvider As MD5CryptoServiceProvider = New MD5CryptoServiceProvider()
                Dim TDESKey() As Byte = HashProvider.ComputeHash(UTF8.GetBytes(UTF8.GetString(Password)))
                Using TDESAlgorithm As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider() With {.Key = TDESKey, .Mode = CipherMode.ECB, .Padding = PaddingMode.PKCS7}
                    Dim DataToEncrypt() As Byte = UTF8.GetBytes(Message)
                    Try
                        Dim Encryptor As ICryptoTransform = TDESAlgorithm.CreateEncryptor
                        Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length)
                    Finally
                        TDESAlgorithm.Clear()
                        HashProvider.Clear()
                    End Try
                End Using
            End Using
            Return Convert.ToBase64String(Results)
        End Function

        ' Encrypt using Password as string
        Public Function Encrypt(ByVal Message As String, ByVal Password As String) As String
            Dim Results() As Byte
            Dim UTF8 As System.Text.UTF8Encoding = New System.Text.UTF8Encoding
            ' Step 1. We hash the Passphrase using MD5
            ' We use the MD5 hash generator as the result is a 128 bit byte array
            ' which is a valid length for the Triple DES encoder we use below
            Using HashProvider As MD5CryptoServiceProvider = New MD5CryptoServiceProvider()
                Dim TDESKey() As Byte = HashProvider.ComputeHash(UTF8.GetBytes(Password))

                ' Step 2. Create a new TripleDESCryptoServiceProvider object

                ' Step 3. Setup the encoder
                Using TDESAlgorithm As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider() With {.Key = TDESKey, .Mode = CipherMode.ECB, .Padding = PaddingMode.PKCS7}
                    ' Step 4. Convert the input string to a byte[]

                    Dim DataToEncrypt() As Byte = UTF8.GetBytes(Message)

                    ' Step 5. Attempt to encrypt the string
                    Try
                        Dim Encryptor As ICryptoTransform = TDESAlgorithm.CreateEncryptor
                        Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length)
                    Finally
                        ' Clear the Triple Des and Hashprovider services of any sensitive information
                        TDESAlgorithm.Clear()
                        HashProvider.Clear()
                    End Try
                End Using
            End Using

            ' Step 6. Return the encrypted string as a base64 encoded string
            Return Convert.ToBase64String(Results)
        End Function
    #End Region

    #Region "Decrypt"
        ' Decrypt using Password from Property (pre-hashed)
        Public Function Decrypt(ByVal Message As String) As String
            Dim Results() As Byte
            Dim UTF8 As System.Text.UTF8Encoding = New System.Text.UTF8Encoding
            Using HashProvider As MD5CryptoServiceProvider = New MD5CryptoServiceProvider()
                Dim TDESKey() As Byte = Me.bPassword
                Using TDESAlgorithm As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider() With {.Key = TDESKey, .Mode = CipherMode.ECB, .Padding = PaddingMode.PKCS7}
                    Dim DataToDecrypt() As Byte = Convert.FromBase64String(Message)
                    Try
                        Dim Decryptor As ICryptoTransform = TDESAlgorithm.CreateDecryptor
                        Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length)
                    Finally
                        TDESAlgorithm.Clear()
                        HashProvider.Clear()
                    End Try
                End Using
            End Using
            Return UTF8.GetString(Results)
        End Function

        ' Decrypt using Password as Byte array
        Public Function Decrypt(ByVal Message As String, ByVal Password() As Byte) As String
            Dim Results() As Byte
            Dim UTF8 As System.Text.UTF8Encoding = New System.Text.UTF8Encoding
            Using HashProvider As MD5CryptoServiceProvider = New MD5CryptoServiceProvider()
                Dim TDESKey() As Byte = HashProvider.ComputeHash(UTF8.GetBytes(UTF8.GetString(Password)))
                Using TDESAlgorithm As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider() With {.Key = TDESKey, .Mode = CipherMode.ECB, .Padding = PaddingMode.PKCS7}
                    Dim DataToDecrypt() As Byte = Convert.FromBase64String(Message)
                    Try
                        Dim Decryptor As ICryptoTransform = TDESAlgorithm.CreateDecryptor
                        Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length)
                    Finally
                        TDESAlgorithm.Clear()
                        HashProvider.Clear()
                    End Try
                End Using
            End Using
            Return UTF8.GetString(Results)
        End Function


        ' Decrypt using Password as string
        Public Function Decrypt(ByVal Message As String, ByVal Password As String) As String
            Dim Results() As Byte
            Dim UTF8 As System.Text.UTF8Encoding = New System.Text.UTF8Encoding

            ' Step 1. We hash the pass phrase using MD5
            ' We use the MD5 hash generator as the result is a 128-bit byte array
            ' which is a valid length for the Triple DES encoder we use below
            Using HashProvider As MD5CryptoServiceProvider = New MD5CryptoServiceProvider()
                Dim TDESKey() As Byte = HashProvider.ComputeHash(UTF8.GetBytes(Password))

                ' Step 2. Create a new TripleDESCryptoServiceProvider object
                ' Step 3. Setup the decoder
                Using TDESAlgorithm As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider() With {.Key = TDESKey, .Mode = CipherMode.ECB, .Padding = PaddingMode.PKCS7}

                    ' Step 4. Convert the input string to a byte[]
                    Dim DataToDecrypt() As Byte = Convert.FromBase64String(Message)
                    ' Step 5. Attempt to decrypt the string
                    Try
                        Dim Decryptor As ICryptoTransform = TDESAlgorithm.CreateDecryptor
                        Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length)
                    Finally

                        ' Clear the Triple Des and Hash provider services of any sensitive information
                        TDESAlgorithm.Clear()
                        HashProvider.Clear()
                    End Try
                End Using
            End Using

            ' Step 6. Return the decrypted string in UTF8 format
            Return UTF8.GetString(Results)
        End Function

    #End Region

    End Class
    Dim tdes As New TripleDES("12345")
    Dim vbEncrypted = tdes.Encrypt("Encrypted using VB.NET")
    Dim phpEncrypted = "5Ittyr0+jiI7QQmPrvSVnMc9MEWQCjAN"

    Debug.Print("PHP Encrypted: " & phpEncrypted)
    Debug.Print("VB Encrypted: " & vbEncrypted)
    Debug.Print("PHP Encrypted (decrypted result): " & tdes.Decrypt(phpEncrypted))
    Debug.Print("VB Encrypted (decrypted result): " & tdes.Decrypt(vbEncrypted))
    class TripleDES {
        private $bPassword;
        private $sPassword;

        function __construct($Password) {
            $this->bPassword  = md5(utf8_encode($Password),TRUE);
            $this->bPassword .= substr($this->bPassword,0,8);
            $this->sPassword - $Password;
        }

        function Password($Password = "") {
            if($Password == "") {
                return $this->sPassword;
            } else {
                $this->bPassword  = md5(utf8_encode($Password),TRUE);
                $this->bPassword .= substr($this->bPassword,0,8);
                $this->sPassword - $Password;
            }
        }

        function PasswordHash() {
            return $this->bPassword;
        }

        function Encrypt($Message, $Password = "") {
            if($Password <> "") { $this->Password($Password); }
            $size=mcrypt_get_block_size('tripledes','ecb');
            $padding=$size-((strlen($Message)) % $size);
            $Message .= str_repeat(chr($padding),$padding);
            $encrypt  = mcrypt_encrypt('tripledes',$this->bPassword,$Message,'ecb');
            return base64_encode($encrypt);
        }

        function Decrypt($message, $Password = "") {
            if($Password <> "") { $this->Password($Password); }
            return trim(mcrypt_decrypt('tripledes', $this->bPassword, base64_decode($message), 'ecb'), ord(2));
        }

    }
    $tdes = new TripleDES("12345");

    $phpEncrypted = $tdes->encrypt("Encrypted using PHP");
    $vbEncrypted = "5Ittyr0+jiI7QQmPrvSVnP3s2CeoTJmF"; // Encrypted using VB.NET

    echo "PHP Encrypted: " . $phpEncrypted . '<br />';
    echo "VB Encrypted: " . $vbEncrypted . '<br />';
    echo "PHP Encrypted (decrypted result): " . $tdes->Decrypt($phpEncrypted) . '<br />';
    echo "VB Encrypted (decrypted result): " . $tdes->Decrypt($vbEncrypted) . '<br />';
using System;
using System.Security.Cryptography;

public class TripleDES {

    private byte[] bPassword;

    private string sPassword;
    public TripleDES( string Password = "password" ) {
        // On Class Begin
        this.Password = Password;
    }

    public string PasswordHash {
        get {
            System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
            return UTF8.GetString( bPassword );
        }
    }

    public string Password {
        get {
            System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
            return sPassword;
        }
        set {
            System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
            MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
            bPassword = HashProvider.ComputeHash( UTF8.GetBytes( value ) );
            sPassword = value;
        }
    }

    #region "Encrypt"

    // Encrypt using Password from Property Set (pre-hashed)
    public string Encrypt( string Message ) {
        byte[] Results = null;
        System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
        using ( MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider() ) {
            byte[] TDESKey = bPassword;
            using ( TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider { Key = TDESKey, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 } ) {
                byte[] DataToEncrypt = UTF8.GetBytes( Message );
                try {
                    ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor();
                    Results = Encryptor.TransformFinalBlock( DataToEncrypt, 0, DataToEncrypt.Length );
                } finally {
                    TDESAlgorithm.Clear();
                    HashProvider.Clear();
                }
            }
        }
        return Convert.ToBase64String( Results );
    }

    // Encrypt using Password as byte array
    private string Encrypt( string Message, byte[] Password ) {
        byte[] Results = null;
        System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
        using ( MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider() ) {
            byte[] TDESKey = HashProvider.ComputeHash( UTF8.GetBytes( UTF8.GetString( Password ) ) );
            using ( TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider { Key = TDESKey, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 } ) {
                byte[] DataToEncrypt = UTF8.GetBytes( Message );
                try {
                    ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor();
                    Results = Encryptor.TransformFinalBlock( DataToEncrypt, 0, DataToEncrypt.Length );
                } finally {
                    TDESAlgorithm.Clear();
                    HashProvider.Clear();
                }
            }
        }
        return Convert.ToBase64String( Results );
    }

    // Encrypt using Password as string
    public string Encrypt( string Message, string Password ) {
        byte[] Results = null;
        System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
        // Step 1. We hash the Passphrase using MD5
        // We use the MD5 hash generator as the result is a 128 bit byte array
        // which is a valid length for the Triple DES encoder we use below
        using ( MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider() ) {
            byte[] TDESKey = HashProvider.ComputeHash( UTF8.GetBytes( Password ) );

            // Step 2. Create a new TripleDESCryptoServiceProvider object

            // Step 3. Setup the encoder
            using ( TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider { Key = TDESKey, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 } ) {
                // Step 4. Convert the input string to a byte[]

                byte[] DataToEncrypt = UTF8.GetBytes( Message );

                // Step 5. Attempt to encrypt the string
                try {
                    ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor();
                    Results = Encryptor.TransformFinalBlock( DataToEncrypt, 0, DataToEncrypt.Length );
                } finally {
                    // Clear the Triple Des and Hashprovider services of any sensitive information
                    TDESAlgorithm.Clear();
                    HashProvider.Clear();
                }
            }
        }

        // Step 6. Return the encrypted string as a base64 encoded string
        return Convert.ToBase64String( Results );
    }
    #endregion

    #region "Decrypt"
    // Decrypt using Password from Property (pre-hashed)
    public string Decrypt( string Message ) {
        byte[] Results = null;
        System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
        using ( MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider() ) {
            byte[] TDESKey = this.bPassword;
            using ( TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider { Key = TDESKey, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 } ) {
                byte[] DataToDecrypt = Convert.FromBase64String( Message );
                try {
                    ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();
                    Results = Decryptor.TransformFinalBlock( DataToDecrypt, 0, DataToDecrypt.Length );
                } finally {
                    TDESAlgorithm.Clear();
                    HashProvider.Clear();
                }
            }
        }
        return UTF8.GetString( Results );
    }

    // Decrypt using Password as Byte array
    public string Decrypt( string Message, byte[] Password ) {
        byte[] Results = null;
        System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
        using ( MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider() ) {
            byte[] TDESKey = HashProvider.ComputeHash( UTF8.GetBytes( UTF8.GetString( Password ) ) );
            using ( TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider { Key = TDESKey, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 } ) {
                byte[] DataToDecrypt = Convert.FromBase64String( Message );
                try {
                    ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();
                    Results = Decryptor.TransformFinalBlock( DataToDecrypt, 0, DataToDecrypt.Length );
                } finally {
                    TDESAlgorithm.Clear();
                    HashProvider.Clear();
                }
            }
        }
        return UTF8.GetString( Results );
    }


    // Decrypt using Password as string
    public string Decrypt( string Message, string Password ) {
        byte[] Results = null;
        System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();

        // Step 1. We hash the pass phrase using MD5
        // We use the MD5 hash generator as the result is a 128-bit byte array
        // which is a valid length for the Triple DES encoder we use below
        using ( MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider() ) {
            byte[] TDESKey = HashProvider.ComputeHash( UTF8.GetBytes( Password ) );

            // Step 2. Create a new TripleDESCryptoServiceProvider object
            // Step 3. Setup the decoder
            using ( TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider { Key = TDESKey, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 } ) {

                // Step 4. Convert the input string to a byte[]
                byte[] DataToDecrypt = Convert.FromBase64String( Message );
                // Step 5. Attempt to decrypt the string
                try {
                    ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();
                    Results = Decryptor.TransformFinalBlock( DataToDecrypt, 0, DataToDecrypt.Length );

                } finally {
                    // Clear the Triple Des and Hash provider services of any sensitive information
                    TDESAlgorithm.Clear();
                    HashProvider.Clear();
                }
            }
        }

        // Step 6. Return the decrypted string in UTF8 format
        return UTF8.GetString( Results );
    }

    #endregion
}