0

私は現在、暗号化と復号化のプログラミング スキルを向上させることに関心があり、Rijndael 暗号の例をいくつか見つけました。

C# で独自のプログラミングを開始し、[暗号化] ボタンをクリックしてダイアログ ウィンドウを開き、ファイルを選択できるようにします....これまでのところすべて正常に動作します

ファイルを選択し、コードをステップ実行して、ファイルのルート パスを取得し、キーを生成してから、プレーン テキストを暗号テキストに変換し始めます...ここで問題が発生します。

 try
        {
            OpenFileDialog dialog = new OpenFileDialog();
            dialog.Filter = "All Files (*.*)|";
            dialog.InitialDirectory = @"Desktop";
            dialog.Title = "Please select a file to encrypt.";

            dialog.ShowDialog();

            inputFile = dialog.FileName;
            outputFile = inputFile;

            string password = @"secrets"; // key to encrypt files
            UnicodeEncoding UE = new UnicodeEncoding();
            byte[] key = UE.GetBytes(password);

            string cryptFile = outputFile;
            FileStream fsCrypt = new FileStream(cryptFile, FileMode.Create);

            RijndaelManaged RMCrypto = new RijndaelManaged();

            CryptoStream cs = new CryptoStream(fsCrypt,
                RMCrypto.CreateEncryptor(key, key),
                CryptoStreamMode.Write);

            FileStream fsIn = new FileStream(inputFile, FileMode.Append);

            int data;
            while ((data = fsIn.ReadByte()) != -1)
                cs.WriteByte((byte)data);


            fsIn.Close();
            cs.Close();
            fsCrypt.Close();
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

このコードに到達すると問題が発生します

 CryptoStream cs = new CryptoStream(fsCrypt,
                RMCrypto.CreateEncryptor(key, key),
                CryptoStreamMode.Write);

私が得るエラーは system.windows.forms.mouseeventargs です 誰でも私を助けることができますか?

編集!!!これが実際のエラー メッセージです。私のミスです。指定された初期化ベクトル (IV) が、このアルゴリズムのブロック サイズと一致しません。

4

3 に答える 3

1

選択したファイルを開き、同じディレクトリ内でランダムなファイル名で暗号化するコードを次に示します。

private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            var dialog = new OpenFileDialog
                {
                    Filter = "All Files (*.*)|",
                    InitialDirectory = @"Desktop",
                    Title = "Please select a file to encrypt."
                };

            dialog.ShowDialog();

            string inputFile = dialog.FileName;

            // NOTE: The password should not be hardcoded in here
            const string password = @"secrets";

            var fileInfo = new FileInfo(inputFile);

            if(fileInfo.Directory != null)
            {
                string cryptFile = Path.Combine(fileInfo.Directory.ToString(),
                                                Path.GetRandomFileName());

                using (var rijndael = InitSymmetric(Rijndael.Create(), password, 256))
                {

                    using(var fsCrypt = new FileStream(cryptFile, FileMode.Create))
                    {
                        using (var cs = new CryptoStream(fsCrypt,
                                                         rijndael.CreateEncryptor(),
                                                         CryptoStreamMode.Write))
                        {
                            using (var fsIn = new FileStream(inputFile, FileMode.Open))
                            {
                                int data;

                                while ((data = fsIn.ReadByte()) != -1)
                                {
                                    cs.WriteByte((byte)data);
                                }
                            }
                        }
                    }
                }
            }

        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

    public static SymmetricAlgorithm InitSymmetric(SymmetricAlgorithm algorithm, string password, int keyBitLength)
    {
        // NOTE: Salt is for example purposes, would not normally have this in here.
        var salt = new byte[] { 1, 3, 66, 234, 73, 48, 134, 69, 250, 6 };
        const int iterations = 10000;

        var rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt, iterations);

        if (!algorithm.ValidKeySize(keyBitLength))
            throw new InvalidOperationException("Invalid size key");
        algorithm.Key = rfc2898DeriveBytes.GetBytes(keyBitLength / 8);
        algorithm.IV = rfc2898DeriveBytes.GetBytes(algorithm.BlockSize / 8);
        return algorithm;
    }
于 2012-11-30T15:59:07.087 に答える
1

私が得るエラーは system.windows.forms.mouseeventargs です 誰でも私を助けることができますか?

catch ステートメントを見てください。例外を保持する変数を指定しませんが、内部ではe. あなたはイベントハンドラにいるので、 e はすでにメソッドのパラメータとして宣言されています。

キャッチは次のようになります。

    catch (Exception ex)
    {
        // now ex holds your exception
    }

指定された初期化ベクトル (IV) が、このアルゴリズムのブロック サイズと一致しません。

GenerateIV有効な IV を作成するために使用します。独自の IV を指定する場合は、アルゴリズムのブロックサイズに適合することを確認してください。この場合: 16 バイト

于 2012-11-30T15:01:39.573 に答える
0

パスワードをキーと IV の両方に直接入力しています。それは間違ったアプローチです。

  1. IV はランダムで、暗号化ごとに異なる必要があります。自動生成された IV を使用して、暗号文と一緒に保存します。
  2. パスワードではなく、実際のキーを使用してください。または、PBKDF2 を介してパスワードとソルトを送信し、16 バイトの出力を要求して、それらをキーとして使用します。
于 2012-11-30T16:33:07.983 に答える