2014-01-22 97 views
1

这里是我的代码块, 我假设Decrypt方法不起作用,它返回一些垃圾值。我是新来的。加密和解密在C#

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)); 

但它返回��2�cU:EIs Tanmoy Mitra 它与//CipherMode.ECB模式,但我想知道为什么这CBC模式是不是在这个case.Please工作帮我在这。

回答

2

您没有指定IV(初始化向量)。加密和解密需要使用相同的IV。举例来说,这样做的一个方法是:

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

...在加密和解密。更好的办法是在加密时创建一次随机IV(在创建加密服务提供程序时自动完成),并在解密时记住它。

IV property documentation(重点煤矿):

从SymmetricAlgorithm类派生使用称为密码块链接(CBC)一个链接模式,这需要一个密钥和一个初始化向量以执行密码变换的类数据。 要解密使用SymmetricAlgorithm类之一加密的数据,必须将Key属性和IV属性设置为用于加密的相同值。

0

尝试......

[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 
}