2012-08-06 100 views
1

我创建了一个TripleDes的类这样的:TripleDes的类解密问题

class TripleDes_Crypto 
{ 
    // Key Lenght must be 24 
    string Key = string.Empty; 
    // IV Lenght must be 8 
    string IV = string.Empty; 

public TripleDes_Crypto(string KEY, string IV) 
{ 
    this.Key = KEY; 
    this.IV = IV; 
} 

public string Encrypt(string Data) 
{ 
    byte[] key = Encoding.ASCII.GetBytes(Key); 
    byte[] iv = Encoding.ASCII.GetBytes(IV); 
    byte[] data = Encoding.ASCII.GetBytes(Data); 
    byte[] enc = new byte[0]; 

    TripleDES tdes = TripleDES.Create(); 
    tdes.IV = iv; 
    tdes.Key = key; 
    tdes.Mode = CipherMode.CBC; 
    tdes.Padding = PaddingMode.Zeros; 

    // encryption 
    ICryptoTransform ict = tdes.CreateEncryptor(); 
    enc = ict.TransformFinalBlock(data, 0, data.Length); 

    return ASCIIEncoding.ASCII.GetString(enc); 
} 

public string Decrypt(string Data) 
{ 
    byte[] key = Encoding.ASCII.GetBytes(Key); 
    byte[] iv = Encoding.ASCII.GetBytes(IV); 
    byte[] data = Encoding.ASCII.GetBytes(Data); 
    byte[] dec = new byte[0]; 

    TripleDES tdes = TripleDES.Create(); 
    tdes.IV = iv; 
    tdes.Key = key; 
    tdes.Mode = CipherMode.CBC; 
    tdes.Padding = PaddingMode.Zeros; 

    // decryption 
    ICryptoTransform ict = tdes.CreateDecryptor(); 
    dec = ict.TransformFinalBlock(data, 0, data.Length); 

    return ASCIIEncoding.ASCII.GetString(dec); 
} 

}

,我用:

private void button1_Click(object sender, EventArgs e) 
    { 
     TripleDes_Crypto tdes = new TripleDes_Crypto("[email protected]", "password"); 
     File.WriteAllText(@"encrypted", tdes.Encrypt("Hey TEST DATA")); 
     MessageBox.Show(tdes.Decrypt(File.ReadAllText(@"encrypted"))); 
    } 

那么加密方法工作正常,但解密方法问题,因为当我使用解密它会产生一些随机数据,而它应该输出:嘿测试数据。

感谢您的帮助。

回答

3

这是你的问题:

return ASCIIEncoding.ASCII.GetString(enc); 
... 
byte[] data = Encoding.ASCII.GetBytes(Data); 

,好像它是ASCII文本你处理加密数据。不是。你正在丢失数据。

表示任意的二进制数据,而无需在文本损失,你应该总是使用Base64编码:

return Convert.ToBase64String(enc); 
... 
byte[] data = Convert.FromBase64String(Data); 

此外,我建议使用ASCII以外的东西键/ IV文本转换成字节 - 也遵循.NET命名约定的参数。

+0

非常感谢你的工作,你会建议使用UTF8而不是ASCII码吗? – 2012-08-06 06:43:51

+0

@ R.Vector:对于密钥/ IV数据?也许 - 理想情况下,两者应该真的是字节数组开始;他们来自哪里? – 2012-08-06 06:48:34

+0

关键和IV是正常的文字。 – 2012-08-06 06:50:27