4

私は暗号化の初心者であり、行ごとの暗号化を機能させようとしています。すべてを暗号化して保存するだけでなく、アプリケーションの実行中に暗号化された行をファイルに追加できるようにする必要があります。私はそれで獣のような時間を過ごしています。これが私の暗号化装置です。自分で何度か失敗した後、恥知らずに盗まれました。


class Encryption
    {
        private static readonly byte[] SALT = new byte[] { 0x26, 0xdc, 0xff, 0x00, 0xad, 0xed, 0x7a, 0xee, 0xc5, 0xfe, 0x07, 0xaf, 0x4d, 0x08, 0x22, 0x3c };

        public static byte[] Encrypt(byte[] plain, string password)
        {
            MemoryStream memoryStream;
            CryptoStream cryptoStream;
            Rijndael rijndael = Rijndael.Create();
            Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, SALT);
            rijndael.Key = pdb.GetBytes(32);
            rijndael.IV = pdb.GetBytes(16);
            memoryStream = new MemoryStream();
            cryptoStream = new CryptoStream(memoryStream, rijndael.CreateEncryptor(), CryptoStreamMode.Write);
            cryptoStream.Write(plain, 0, plain.Length);
            cryptoStream.FlushFinalBlock();
            cryptoStream.Close();
            return memoryStream.ToArray();
        }

        public static byte[] Decrypt(byte[] cipher, string password)
        {
            MemoryStream memoryStream;
            CryptoStream cryptoStream;
            Rijndael rijndael = Rijndael.Create();
            Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, SALT);
            rijndael.Key = pdb.GetBytes(32);
            rijndael.IV = pdb.GetBytes(16);
            memoryStream = new MemoryStream();
            cryptoStream = new CryptoStream(memoryStream, rijndael.CreateDecryptor(), CryptoStreamMode.Write);
            cryptoStream.Write(cipher, 0, cipher.Length);
            cryptoStream.FlushFinalBlock();
            cryptoStream.Close();
            return memoryStream.ToArray();
        }
    }

そして、これが私がそれをどのように試みているかを示すダミー関数です:

       private void EncryptFile(string filepath, string outputPath, string password)
        {
            FileInfo fileInfo = new FileInfo(ファイルパス);
            文字列ファイル名 = fileInfo.Name;

            文字列フルパス = outputPath + "\\" + ファイル名;

            BinaryWriter writer = new BinaryWriter(File.OpenWrite(fullpath), Encoding.ASCII);

            /// ここで試した 2 つの方法:
            /// 1. 目的の方法: 行ごとに暗号化 - 生成できると仮定しました
            /// データの複数のブロックを後で復号化します。これは機能していません

            //string[] lines = File.ReadAllLines(filepath);

            /// 2. 全体を読み取り、暗号化して一気に書き込むだけです。

            文字列行 = File.ReadAllText(ファイルパス);

            //foreach(行単位の文字列行)
            {
                byte[] バイト = Encoding.ASCII.GetBytes(行);
                バイト[] エンコードされた = Encryption.Encrypt(バイト、パスワード);

                writer.Write(エンコード);
                ライター.フラッシュ();
            }

            ライター.Close();
        }



        private void DecryptFile(string filepath, string outputPath, string password)
        {
            FileInfo fileInfo = new FileInfo(ファイルパス);
            文字列ファイル名 = fileInfo.Name;
            文字列フルパス = outputPath + "\\" + ファイル名;

            StreamWriter writer = new StreamWriter(fullpath, false, Encoding.UTF8);

            byte[] バイト = File.ReadAllBytes(ファイルパス);

            /// 現在復号化のために機能しているメソッドは次のとおりです。ただ
            /// すべてのデータを取得し、一挙に復号化します。

            byte[] 復号化 = Encryption.Decrypt(bytes, password);

            文字列 s = Encoding.ASCII.GetString(復号化);

            writer.Write(s);
            ライター.フラッシュ();


            /// 行ごとに復号化するために、ここで多くのことを試しました。
            /// どれも機能しません。これは、パディングに関する問題でクラッシュします
            /// 無効です。  

            /*
            int インデックス = 0;
            int カウント = 32;

            while (インデックス

私はもう何をすべきか完全にはわかりません。私は物事を突っついたり、オンラインで例を読んだりして歩き回っていますが、それらはすべて、ファイル全体を暗号化する方法、またはデータの一部を暗号化して、すぐに再度復号化する以外に何もしないようです。行ごとの書き込みをどのように処理すればよいですか?

4

1 に答える 1

4

これをプログラミングする代わりに、実装できるスキームを提供します。

行ごとの暗号化を使用している場合は、行ごとにも復号化できるようにしたいと考えています。「線」は、コンピュータにとってかなり不便な用語であることに注意してください。ある種の行末記号で終わる一連の文字です。文字自体は、特定のを使用してエンコードされます。

さらに、次の仮定を行います。

アイデアは単純です。

  1. パスワードベースのキー派生関数を使用して単一のキーを作成します。
  2. 読み取り用にテキスト ファイルを開きます (正しいを使用)。
  3. 行を読み取り、その行を再度バイトに変換します (例: UTF-8 を使用)。
  4. 下にバイト配列を作成する出力ストリームを作成します。
  5. ランダムな IV を作成し、それをバイト配列に書き込みます (IV は常に単一のブロック サイズです)。
  6. 暗号ストリームを作成し、それを同じ出力ストリームに接続します。
  7. エンコードされた行を暗号化します。
  8. 暗号化されたバイトを base 64 でエンコードし、1 行に収まるようにします。
  9. エンコードされ暗号化された行を新しいテキスト ファイルに書き込みます。

逆を行うには、プロセスを逆にしますが、IV は base 64 デコード後にバイトから取得する必要があり、もちろん、暗号化中に使用したのと同じ方法を使用してキーを計算する必要があります。

于 2012-10-22T21:05:59.993 に答える