0

4 バイト整数として格納されているキーがあります。言う

Int32 key = 12345678;

暗号化された文字列の文字を表すバイト配列があります

byte[] barray = ...

ここで、各バイトをループし、キー内の対応するバイトと XOR を使用して、必要に応じてキーをループします。

1st byte ^= key & 0xFF
2nd byte ^= key & 0xFF 00
3rd byte ^= key & 0xFF 00 00
4th byte ^= key & 0xFF 00 00 00
5th byte ^= key & 0xFF

ループの書き方は?私はから始めました

for (int i = 0; i < barray.length; i++)
{
   barray[i] ^= ???  
}

xor の正しいバイトを計算する方法がわかりません。

4

1 に答える 1

3

最初にキーをバイト配列に変換します。

byte[] keyBytes;
unchecked
{
    keyBytes = new byte[]{(byte)(key >> 0),
                          (byte)(key >> 8),
                          (byte)(key >> 16),
                          (byte)(key >> 24);
}

これを使用しBitConverterて、固定エンディアンを実現しています。この例ではリトル エンディアンですが、Shiften バイトを逆順にリストすることで、ビッグ エンディアンを簡単に選択できます。

次に、剰余演算子を使用し%てキーバイトをアドレス指定できます。

for (int i = 0; i < barray.length; i++)
{
    barray[i] ^= keyBytes[i%4];
}

実装しているのは、キー長が 4 バイトの Vigenère暗号です。そのため、攻撃するのは非常に簡単です。これは事実上単なる難読化であり、実際の暗号化ではありません。

于 2012-06-07T23:54:50.743 に答える