简体   繁体   中英

Encryption & Decryption in C#

Here is my code blocks, I assume Decrypt method is not functioning, it returns some garbage value. I am new to this.

public string Encrypt(string toEncrypt, string key, bool useHashing)
{
    byte[] keyArray;
    byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);

    if (useHashing)
    {
        MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
        keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
    }
    else
        keyArray = UTF8Encoding.UTF8.GetBytes(key);

    TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
    tdes.Key = keyArray;
    tdes.Mode = CipherMode.CBC;
    tdes.Padding = PaddingMode.Zeros;
    ICryptoTransform cTransform = tdes.CreateEncryptor();
    byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

    return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}

public string Decrypt(string toDecrypt, string key, bool useHashing)
{
    byte[] keyArray;
    byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);

    if (useHashing)
    {
        MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
        keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
    }
    else
        keyArray = UTF8Encoding.UTF8.GetBytes(key);

    TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
    tdes.Key = keyArray;
    tdes.Mode = CipherMode.CBC;
    tdes.Padding = PaddingMode.Zeros;

    ICryptoTransform cTransform = tdes.CreateDecryptor();
    byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

    return UTF8Encoding.UTF8.GetString(resultArray);
}



        String key = "ShHhd8a08JhJiho98ayslcjh";
    string tmp = "My Name Is Tanmoy Mitra";
    string encryptStr = Encrypt(tmp,key,false);
    Debug.Log("Encrypt Text:"+encryptStr);
    Debug.Log("Decrypt Text:"+Decrypt(encryptStr,key,false));

But it returns 2 cU:EIs Tanmoy Mitra It works with //CipherMode.ECB mode, but I want to know why this CBC mode is not working in this case.Please help me on this.

You're not specifying an IV (initialization vector). The encryption and decryption need to use the same IV. For example, one bad way of doing it would be:

tdes.IV = new byte[tdes.BlockSize / 8];

... in both encryption and decryption. Better would be to generate a random IV once when encrypting (it's done automatically when you create the crypto service provider) and remember it for when you decrypt.

From the IV property documentation (emphasis mine):

The classes that derive from the SymmetricAlgorithm class use a chaining mode called cipher block chaining (CBC), which requires a key and an initialization vector to perform cryptographic transformations on data. To decrypt data that was encrypted using one of the SymmetricAlgorithm classes, you must set the Key property and IV property to the same values that were used for encryption.

Try this...

[Serializable]
public class CriptoEngine
{

    #region Variables

    private string key;
    byte[] keyArray;
    byte[] arrayDecypt;
    byte[] resultArray;
    byte[] arrayEncrypt;

    #endregion

    #region Metodos Publicos

    public CriptoEngine(string user)
    {
        key = user;
    }
    public TDecrypData SetEncriptar<TEncr, TDecrypData>(TEncr objEncrypt)
    {
        object tEncr;
        arrayEncrypt = UTF8Encoding.UTF8.GetBytes(Convert.ToString(objEncrypt));
        MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
        keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
        hashmd5.Clear();
        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        tdes.Key = keyArray; tdes.Mode = CipherMode.ECB;
        tdes.Padding = PaddingMode.PKCS7;
        ICryptoTransform cTransform = tdes.CreateEncryptor();
        resultArray = cTransform.TransformFinalBlock(arrayEncrypt, 0, arrayEncrypt.Length);
        tdes.Clear();
        Type t = typeof(TDecrypData);
        switch (t.Name)
        {
            case "Byte[]":
                tEncr = resultArray;
                break;
            default:
                tEncr = Convert.ToBase64String(resultArray, 0, resultArray.Length);
                break;
        }            
        return (TDecrypData)tEncr;

    }

    public TEncryptData GetDescr<TDesc, TEncryptData>(TDesc objDecry)
    {
        arrayDecypt = Convert.FromBase64String(objDecry.ToString());
        MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
        keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
        hashmd5.Clear();
        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        tdes.Key = keyArray;
        tdes.Mode = CipherMode.ECB;
        tdes.Padding = PaddingMode.PKCS7;
        ICryptoTransform cTransform = tdes.CreateDecryptor();
        resultArray = cTransform.TransformFinalBlock(arrayDecypt, 0, arrayDecypt.Length);
        tdes.Clear();
        object crypto = UTF8Encoding.UTF8.GetString(resultArray);
        return (TEncryptData)crypto;
    }

    #endregion
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM