4

後で取得したいファイルにパスワードを保存しようとしています。後でリモートサーバーに接続するためのパスワードが必要なため、ハッシュはオプションではありません。

次のコードはうまく機能しますが、キーが同じであっても毎回異なる出力が作成されます。アプリケーションがシャットダウンして再起動すると、パスワードを取得できなくなるため、これは悪いことです。パスワードをファイルに保存し、後で取得するにはどうすればよいですか?

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;
    }
}
4

3 に答える 3

8

暗号プロバイダーがランダムに IV を生成していると考えられます。これを指定すると、もはや違いはありません。

編集: IV プロパティを設定することにより、「keyProvider」でこれを行うことができます。

于 2008-09-23T01:22:56.960 に答える
3

CreateEncryptor のドキュメントによると:

現在の IV プロパティが null 参照 (Visual Basic では Nothing) の場合、GenerateIV メソッドが呼び出されて新しいランダム IV が作成されます。

これにより、暗号文が毎回異なります。

注: これを回避する方法については、こちらで説明しています。平文の先頭に mac を追加することをお勧めします。暗号文の最初のブロックは事実上 IV ですが、すべて繰り返し可能です。

于 2008-09-23T01:27:18.993 に答える
2

ランダムなものを生成する場合でも、IV (初期化ベクトル) を指定する必要があります。ランダム IV を使用する場合は、暗号文と一緒に保存して後で復号化に使用できるようにする必要があります。または、他のデータから IV を導出することもできます (たとえば、パスワードを暗号化している場合は、IV をユーザー名)。

于 2009-01-21T17:04:21.720 に答える