即使使用相同的密钥,加密输出也总是不同

时间:2008-09-23 01:19:00

标签: c# encryption cryptography

我正在尝试将密码存储在我想要检索以供日后使用的文件中。 Hashing不是一个选项,因为我需要密码才能连接到远程服务器以供日后使用。

以下代码运行良好,但每次创建不同的输出,即使密钥相同。这很糟糕,因为当应用程序关闭并重新启动时,我将无法再检索到我的密码。如何将密码存储在文件中并在以后检索它们?

public class EncyptDecrypt {

    static System.Security.Cryptography.TripleDESCryptoServiceProvider keyProv = new System.Security.Cryptography.TripleDESCryptoServiceProvider();

    public static System.Security.Cryptography.TripleDESCryptoServiceProvider KeyProvider {
        get {
            keyProv.Key = new byte[] { /* redacted with prejudice */ };
            return keyProv;
        }
    }

    public static string Encrypt(string text, SymmetricAlgorithm key) {

        if (text.Equals(string.Empty)) return text;

        // Create a memory stream.
        MemoryStream ms = new MemoryStream();

        // Create a CryptoStream using the memory stream and the
        // CSP DES key.
        CryptoStream encStream = new CryptoStream(ms, key.CreateEncryptor(), CryptoStreamMode.Write);

        // Create a StreamWriter to write a string
        // to the stream.
        StreamWriter sw = new StreamWriter(encStream);

        // Write the plaintext to the stream.
        sw.WriteLine(text);

        // Close the StreamWriter and CryptoStream.
        sw.Close();
        encStream.Close();

        // Get an array of bytes that represents
        // the memory stream.
        byte[] buffer = ms.ToArray();

        // Close the memory stream.
        ms.Close();

        // Return the encrypted byte array.
        return System.Convert.ToBase64String(buffer);
    }

    // Decrypt the byte array.
    public static string Decrypt(string cypherText, SymmetricAlgorithm key) {

        if (cypherText.Equals(string.Empty)) return cypherText;

        string val;

        try {
            // Create a memory stream to the passed buffer.
            MemoryStream ms = new MemoryStream(System.Convert.FromBase64String(cypherText));

            // Create a CryptoStream using the memory stream and the
            // CSP DES key.
            CryptoStream encStream = new CryptoStream(ms, key.CreateDecryptor(), CryptoStreamMode.Read);

            // Create a StreamReader for reading the stream.
            StreamReader sr = new StreamReader(encStream);

            // Read the stream as a string.
            val = sr.ReadLine();

            // Close the streams.
            sr.Close();
            encStream.Close();
            ms.Close();
        }
        catch (System.Exception) {

            return string.Empty;
        }

        return val;
    }
}

3 个答案:

答案 0 :(得分:8)

我相信正在发生的事情是加密提供商正在随机生成IV。指定它,它应该不再有差异。

编辑:您可以通过设置IV属性在“keyProvider”中执行此操作。

答案 1 :(得分:3)

根据CreateEncryptor的文档:

  

如果当前的IV属性为null   引用(在Visual Basic中没有任何内容),   调用GenerateIV方法   创建一个新的随机IV。

这将使密文每次都不同。

注意:讨论here的方法我建议您可以在mac前面加上明文...然后第一个密文块实际上是IV,但它都是可重复的

答案 2 :(得分:2)

即使生成随机数,也需要指定IV(初始化向量)。如果您使用随机IV,则必须将其与密文一起存储,以便稍后在解密时使用它,或者您可以从其他一些数据中获取IV(例如,如果您正在加密密码,则可以从中获取IV用户名)。