首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TripleDes类解密问题

TripleDes类解密问题
EN

Stack Overflow用户
提问于 2012-08-06 14:38:46
回答 1查看 1.8K关注 0票数 1

我已经创建了一个类似这样的TripleDes类:

代码语言:javascript
复制
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);
}

}

我用的是:

代码语言:javascript
复制
    private void button1_Click(object sender, EventArgs e)
    {
        TripleDes_Crypto tdes = new TripleDes_Crypto("passwordDR0wSS@P6660juht", "password");
        File.WriteAllText(@"encrypted", tdes.Encrypt("Hey TEST DATA"));
        MessageBox.Show(tdes.Decrypt(File.ReadAllText(@"encrypted")));
    }

加密方法运行良好,但解密方法有问题,因为当我使用decrypt时,它会生成一些随机数据,而它应该输出:嘿,测试数据。

提前感谢您的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-06 14:41:16

这就是你的问题:

代码语言:javascript
复制
return ASCIIEncoding.ASCII.GetString(enc);
...
byte[] data = Encoding.ASCII.GetBytes(Data);

您正在将加密数据视为ASCII文本。事实并非如此。你正在丢失数据。

要在不丢失文本的情况下表示任意二进制数据,几乎总是应该使用Base64:

代码语言:javascript
复制
return Convert.ToBase64String(enc);
...
byte[] data = Convert.FromBase64String(Data);

此外,我建议使用ASCII码以外的方法将key/iv文本转换为字节,并遵循.NET的参数命名约定。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11823557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档