Вывод шифрования всегда различен даже с одним и тем же ключом - PullRequest
4 голосов
/ 23 сентября 2008

Я пытаюсь сохранить пароль в файле, который я хотел бы получить позже. Хеширование не вариант, так как мне нужен пароль для подключения к удаленному серверу на потом.

Следующий код работает хорошо, но каждый раз создает разные выходные данные, даже если ключ тот же. Это плохо, так как, когда приложение закрывается и перезапускается, я больше не смогу восстановить свой пароль. Как я могу сохранить пароли в файле и восстановить их позже?

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 ]

8 голосов
/ 23 сентября 2008

Я считаю, что происходит то, что провайдер криптографии случайным образом генерирует IV. Укажите это, и оно больше не должно отличаться.

Редактировать: Вы можете сделать это в вашем keyProvider, установив свойство IV.

3 голосов
/ 23 сентября 2008

Согласно документам CreateEncryptor:

Если текущее свойство IV является нулевым ссылка (ничего в Visual Basic), метод GenerateIV вызывается для создать новый случайный IV.

Это зашифрует текст каждый раз.

Примечание: обсуждается способ обойти это здесь , где я полагаю, что вы можете добавить в начало текст с помощью Mac ... тогда первый блок зашифрованного текста - это фактически IV, но все это повторяется

2 голосов
/ 21 января 2009

Вам нужно указать IV (вектор инициализации), даже если вы генерируете случайный. Если вы используете случайный IV, тогда вы должны сохранить его вместе с зашифрованным текстом, чтобы вы могли использовать его позже при расшифровке, или вы можете получить IV из некоторых других данных (например, если вы шифруете пароль, вы можете получить IV из имя пользователя).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...