1

皆さんの助けを借りて、私は非常に単純な画像暗号化装置を作成しました。非技術者を締め出すには十分ですよね?:P

次のステップに進みます。誰かが XOR の使用を提案しました。XOR について読みましたが、これは基本的に、2 つのビットの間の答えを決定する論理テーブルですよね?

いずれかが真の場合にのみ、ステートメントは真です。

0 0 = 偽 1 0 = 真 0 1 = 真 1 1 = 偽

これは正しいです?では、画像を XOR 暗号化するにはどうすればよいでしょうか。

これは、シーザー暗号を使用した以前の方法です。

private void EncryptFile()
    {            
        OpenFileDialog dialog = new OpenFileDialog();
        dialog.Filter = "JPEG Files (*.jpeg)|*.jpeg|PNG Files (*.png)|*.png|JPG Files (*.jpg)|*.jpg|GIF Files (*.gif)|*.gif";
        dialog.InitialDirectory = @"C:\";
        dialog.Title = "Please select an image file to encrypt.";
        byte[] ImageBytes;
        if (dialog.ShowDialog() == DialogResult.OK)
        {
            ImageBytes = File.ReadAllBytes(dialog.FileName);

            for (int i = 0; i < ImageBytes.Length; i++)
            {
                ImageBytes[i] = (byte)(ImageBytes[i] + 5);
            }

            File.WriteAllBytes(dialog.FileName, ImageBytes);
        }            
    }

    private void DecryptFile()
    {
        OpenFileDialog dialog = new OpenFileDialog();
        dialog.Filter = "JPEG Files (*.jpeg)|*.jpeg|PNG Files (*.png)|*.png|JPG Files (*.jpg)|*.jpg|GIF Files (*.gif)|*.gif";
        dialog.InitialDirectory = @"C:\";
        dialog.Title = "Please select an image file to decrypt.";
        byte[] ImageBytes;
        if (dialog.ShowDialog() == DialogResult.OK)
        {
            ImageBytes = File.ReadAllBytes(dialog.FileName);

            for (int i = 0; i < ImageBytes.Length; i++)
            {
                ImageBytes[i] = (byte)(ImageBytes[i] - 5);
            }

            File.WriteAllBytes(dialog.FileName, ImageBytes);
        }            
    }
4

3 に答える 3

3

XOR は、2 つのビット間の論理演算です。利点は、XOR を 2 回実行すると、1 回目の実行が取り消されることです。したがって、コードを次のように変更します

ImageBytes[i] = (byte)(ImageBytes[i] ^ 5);
于 2010-01-15T04:16:29.953 に答える
0

おそらくご存知のように、パプチーノ 1 . . . XOR の使用は、本当の意味での暗号化ではありません。これは少しとりとめのない答えですが、これは単に画像を「隠す」だけです - 確かに暗号化はしません。しかし、余談ですが、XOR の面白い副作用は、以前のメッセージでほのめかされたように、それが「可逆的」であることです。

したがって

Vx XOR Vy => Vz where V is a byte array of some arbitrary length.

Vx がイメージであるとします。正確に Vx の長さの乱数の配列 Vy を作成し、それを使用して「XOR」エンジンをシードして Vz を生成できます。次に Vx を破棄し、Vy を「非公開」にして自分だけが知るようにすると、「隠された」イメージになります。その後、 Vz XOR vy => を使用して元の画像を取得できます。これは、すべてがメモリ内で行われる場合は特に高速です。興味深いことに、「Vn」を論理的に DISKn STRIPE に置き換えると、RAID 5 になります。破棄した Vx が RAID5 セットの 3 つのディスク ドライブの 1 つであり、そのドライブが故障したとします。まだ 2 つのドライブと XOR エンジンが残っているため、不足しているデータをその場で再作成できます。作業ドライブが置き換えられると、XOR エンジンは元のデータを再生成します。XOR はクールなものです。. . これは彼の最初の質問の答えにはなりません 遅れて、私の数学はオフになっているかもしれません。. . ぶらぶらしてごめんなさい!

于 2010-01-15T05:23:03.723 に答える
0

申し訳ありませんが、最初の質問への回答でこれを明確にしませんでした。

XOR は単なるビット演算子です。C# では、この操作に ^ 文字が使用されます。基本的には交換するだけ

 ImageBytes[i] = (byte)(ImageBytes[i] + 5);

 ImageBytes[i] = (byte) (ImageBytes[i] ^ (byte) 0xA9);  // or some other value

X と Y が何であれ、((X XOR Y) XOR Y) = X の場合、(2 行目と同じ) まったく同じ行をデコードに使用できます。

前の質問の私の回答で示唆されているように、1 つの値を使用して追加 (または XOR) するのではなく、小さな配列を使用する必要があります (配列を何度も繰り返し、次のようないくつかの「ねじれ」を伴う可能性があります)。配列内の 1 つおきのサイクルでは、配列から奇数要素のみを取得します)。このようにして、結果のエンコードされたファイルは「クラック」されにくくなります。(全体として、これらの暗号化スキームは非常に単純なままであり、技術に詳しくない人々を寄せ付けません)。

于 2010-01-15T04:16:50.157 に答える