Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Decrypt an encrypted text

Tags:

c#

encryption

I got a textbox and a 'decrypt' button in my Windows Form Application where I put an encrypted string in there and try to decrypt it but the problem is this. First, I got this class code called DataEncryptor from a guy on this website:

public class DataEncryptor
{
    TripleDESCryptoServiceProvider symm;

    #region Factory
    public DataEncryptor()
    {
        this.symm = new TripleDESCryptoServiceProvider();
        this.symm.Padding = PaddingMode.PKCS7;
    }
    public DataEncryptor(TripleDESCryptoServiceProvider keys)
    {
        this.symm = keys;
    }

    public DataEncryptor(byte[] key, byte[] iv)
    {
        this.symm = new TripleDESCryptoServiceProvider();
        this.symm.Padding = PaddingMode.PKCS7;
        this.symm.Key = key;
        this.symm.IV = iv;
    }

    #endregion

    #region Properties
    public TripleDESCryptoServiceProvider Algorithm
    {
        get { return symm; }
        set { symm = value; }
    }
    public byte[] Key
    {
        get { return symm.Key; }
        set { symm.Key = value; }
    }
    public byte[] IV
    {
        get { return symm.IV; }
        set { symm.IV = value; }
    }

    #endregion

    #region Crypto

    public byte[] Encrypt(byte[] data) { return Encrypt(data, data.Length); }
    public byte[] Encrypt(byte[] data, int length)
    {
        try
        {
            // Create a MemoryStream.
            var ms = new MemoryStream();

            // Create a CryptoStream using the MemoryStream 
            // and the passed key and initialization vector (IV).
            var cs = new CryptoStream(ms,
                symm.CreateEncryptor(symm.Key, symm.IV),
                CryptoStreamMode.Write);

            // Write the byte array to the crypto stream and flush it.
            cs.Write(data, 0, length);
            cs.FlushFinalBlock();

            // Get an array of bytes from the 
            // MemoryStream that holds the 
            // encrypted data.
            byte[] ret = ms.ToArray();

            // Close the streams.
            cs.Close();
            ms.Close();

            // Return the encrypted buffer.
            return ret;
        }
        catch (CryptographicException ex)
        {
            Console.WriteLine("A cryptographic error occured: {0}", ex.Message);
        }
        return null;
    }

    public string EncryptString(string text)
    {
        return Convert.ToBase64String(Encrypt(Encoding.UTF8.GetBytes(text)));
    }

    public byte[] Decrypt(byte[] data) { return Decrypt(data, data.Length); }
    public byte[] Decrypt(byte[] data, int length)
    {
        try
        {
            // Create a new MemoryStream using the passed 
            // array of encrypted data.
            MemoryStream ms = new MemoryStream(data);

            // Create a CryptoStream using the MemoryStream 
            // and the passed key and initialization vector (IV).
            CryptoStream cs = new CryptoStream(ms,
                symm.CreateDecryptor(symm.Key, symm.IV),
                CryptoStreamMode.Read);

            // Create buffer to hold the decrypted data.
            byte[] result = new byte[length];

            // Read the decrypted data out of the crypto stream
            // and place it into the temporary buffer.
            cs.Read(result, 0, result.Length);
            return result;
        }
        catch (CryptographicException ex)
        {
            Console.WriteLine("A cryptographic error occured: {0}", ex.Message);
        }
        return null;
    }

    public string DecryptString(string data)
    {
        return Encoding.UTF8.GetString(Decrypt(Convert.FromBase64String(data))).TrimEnd('\0');
    }

    #endregion

}

And he gave the usage of it:

string message="A very secret message here.";
DataEncryptor keys=new DataEncryptor();
string encr=keys.EncryptString(message);

// later
string actual=keys.DecryptString(encr);

I copied his code and works at encrypting and decrypting:

//my code
private void proceedED(string data)
{
    DataEncryptor key = new DataEncryptor();
    string encr = key.EncryptString(data);
    string actual = key.DecryptString(encr);
    encryptedLabel.Text = encr;
    decryptedLabel.Text = actual;     
}

Then I created a method like this:

private void proceedDecrypt(string data) 
{
    DataEncryptor key = new DataEncryptor();
    string decr = key.DecryptString(data);
    decryptedData.Text = decr;
}

The problem is that it crashes when I submit and I don't know why. I think it should be a true encrypted string because it's just a normal string. How do I fix this?

like image 634
2 revs, 2 users 98% Avatar asked Mar 09 '26 03:03

2 revs, 2 users 98%


1 Answers

Each instance of DataEncryptor generates new keys. You need to use the same keys which encrypted the string to decrypt. If this is done in the same process then keep a reference to DataEncryptor key. Otherwise you need to initialize using the DataEncryptor(byte[] key, byte[] iv) constructor.

Try code like this:

class Program
{
    static void Main(string[] args)
    {
        string key, iv;

        var plain="A very secret message.";
        var cipher=EncryptString(plain, out key, out iv);

        // Later ...

        var message=DecryptString(cipher, key, iv);
    }

    public static string EncryptString(string plain, out string key, out string iv)
    {
        var crypto=new DataEncryptor();
        iv=Convert.ToBase64String(crypto.IV);
        key=Convert.ToBase64String(crypto.Key);
        return crypto.EncryptString(plain);
    }

    public static string DecryptString(string cipher, string key, string iv)
    {
        var crypto=new DataEncryptor(
            Convert.FromBase64String(key), 
            Convert.FromBase64String(iv));

        return crypto.DecryptString(cipher);
    }
}
like image 187
John Alexiou Avatar answered Mar 10 '26 15:03

John Alexiou



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!