Выходные данные шифрования всегда разные, даже с одним и тем же ключом

StackOverflow https://stackoverflow.com/questions/118599

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

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;
    }
}
Это было полезно?

Решение

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

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

Другие советы

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

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

Это сделает зашифрованный текст каждый раз разным.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top