在C#中实现DES

本文关键字:DES 实现 | 更新日期: 2023-09-27 18:29:23

在Microsoft页面上,他们有一个如何使用内置库使用DES的教程:

private static void EncryptData(String inName, String outName, byte[] desKey, byte[] desIV)
{
    //Create the file streams to handle the input and output files.
    FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read);
    FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write);
    fout.SetLength(0);
    //Create variables to help with read and write. 
    byte[] bin = new byte[100]; //This is intermediate storage for the encryption. 
    long rdlen = 0;              //This is the total number of bytes written. 
    long totlen = fin.Length;    //This is the total length of the input file. 
    int len;                     //This is the number of bytes to be written at a time.
    DESCryptoServiceProvider des = new DESCryptoServiceProvider();
    CryptoStream encStream = new CryptoStream(fout, des.CreateEncryptor(desKey, desIV), CryptoStreamMode.Write);
    Console.WriteLine("Encrypting...");
    //Read from the input file, then encrypt and write to the output file. 
    while (rdlen < totlen)
    {
        len = fin.Read(bin, 0, 100);
        encStream.Write(bin, 0, len);
        rdlen = rdlen + len;
        Console.WriteLine("{0} bytes processed", rdlen);
    }
    encStream.Close();
    fout.Close();
    fin.Close();
}

我充分利用了它,但我不明白什么是desIV,以及如何调用函数来测试它。。有人能帮忙吗?

在C#中实现DES

这可能不是一个非常技术性的解释,但我想理解这一点的一个很好的方法是考虑密码。

想象一下,攻击者可以下载你的整个登录数据库,并可以检索每个人的密码及其电子邮件帐户。但在此之前,他决定创建一些帐户(使用一些他知道的密码)。

如果加密只使用了一个密钥,也许有人可以通过一些未加密密码和加密密码的样本对(使用他之前创建的帐户)来尝试"解码"你的密钥,然后使用密钥+算法来解密整个数据库中的每个密码。更糟糕的情况是,具有相同密码的几个用户具有相同的加密结果——攻击者甚至不需要解密密钥就可以使用其他帐户。他只需要是一个很好的"已知密码"猜测者。

现在,让我们假设您可以在加密/解密时引入一些"ramdom"代码。I.E.:当用户选择密码"12345"而不是加密此密码时,您会加密他的电子邮件,也会连接"test@gmail.test12345',然后加密。由于不可能有两个不同的登录电子邮件,即使很多用户选择使用相同的密码,加密结果也会有所不同。此外,攻击者永远不会知道你输入了什么样的伪随机信息。这叫做"腌制"。

Salting和初始化向量没有太大区别,但使用了不同的约定——这是一个字节数组,但它意味着一个字符串。一些工程师甚至生成随机字符串作为salt,并将其与加密密码一起存储。盐是不可复制的,同样难以解密。