0

AES 暗号化を扱うのはこれが初めてで、やや混乱しています。いくつかの機密データを暗号化しています (名前、住所、ID 番号などだけのパスワードはありません)。AES をアプリケーションに実装する方法の良い例を見つけました。キーを作成するために、パスワード、ソルト、ハッシュ アルゴリズム、およびパスワードの反復を提供することを理解しています。これにより、暗号文が作成されます。私が持っているいくつかの質問は、なぜ KeySize が 8 で割られるのですか? 他の人にこれを解読してもらいたい場合、何を渡す必要がありますか? 新しいものを暗号化するたびに、パスワード、salt、および IV を異なるものにする必要があります。その場合、この情報を使用したい他の人が常にそれを認識していることを確認するにはどうすればよいですか?

    public static string Encrypt(string PlainText, string Password, string Salt, string HashAlgorithm, int PasswordIterations, string InitialVector, int KeySize)
    {
        try
        {
            byte[] InitialVectorBytes = Encoding.ASCII.GetBytes(InitialVector);
            byte[] SaltValueBytes = Encoding.ASCII.GetBytes(Salt);
            byte[] PlainTextBytes = Encoding.UTF8.GetBytes(PlainText);
            PasswordDeriveBytes DerivedPassword = new PasswordDeriveBytes(Password, SaltValueBytes, HashAlgorithm, PasswordIterations);
            byte[] KeyBytes = DerivedPassword.GetBytes(KeySize / 8);
            RijndaelManaged SymmetricKey = new RijndaelManaged();
            SymmetricKey.Mode = CipherMode.CBC;
            ICryptoTransform Encryptor = SymmetricKey.CreateEncryptor(KeyBytes, InitialVectorBytes);
            MemoryStream MemStream = new MemoryStream();
            CryptoStream cryptoStream = new CryptoStream(MemStream, Encryptor, CryptoStreamMode.Write);
            cryptoStream.Write(PlainTextBytes, 0, PlainTextBytes.Length);
            cryptoStream.FlushFinalBlock();
            byte[] CipherTextBytes = MemStream.ToArray();
            MemStream.Close();
            cryptoStream.Close();
            MemStream.Dispose();
            cryptoStream.Dispose();
            Encryptor.Dispose();
            return Convert.ToBase64String(CipherTextBytes);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
4

2 に答える 2

1
byte[] KeyBytes = DerivedPassword.GetBytes(KeySize / 8);

通常、キーサイズはビット数として指定されますが、バイト配列に格納されているため、キーサイズは 8 で除算されます。

同じ値を保持するかどうかは、プログラムの設計によって異なります。実際には、IV は毎回変更する必要がありますが、選択する必要がある場合は、キーとソルトを一定に保つことができます。

IV がストリームの出力に含まれていることはわかっているため、復号化のために明示的に含める必要はありません (ストリームから読み取られます)。同様の理由で、塩も含める必要はありません。暗号文を解読するために必要な唯一の値は鍵だと思います。私はこれについて正しくないかもしれません。いつでもデクリプターを作成し、それを機能させるために何を渡す必要があるかを確認できます。

于 2013-04-11T17:16:32.070 に答える