0

XOR暗号化を逆にしようとしています。私は暗号化コードを持っています:

// Walk the 16 nibbles in the 64 bit long long, selecting the corresponding key digit
// and XORing it into the result.
unsigned long long result = 0;
for( i=0; i<16; i++ )
{
    int n = 4*(i % keyLen);
    int k = (key & (0xF << n)) >> n;
    result |= value&(0xF << 4*i) ^ (k<<4*i);
}

最初の行は問題ありません。

2番目と3番目はそうではありません。私の3つの質問は次のとおりです。

  1. ビットシフトを逆にするだけでうまくいくと思いますか?
  2. しかし、どうすればビット単位で反転できますか?では、#2はどのように逆になりますか?
  3. それで、答えが#1で「はい」であり、私が#2を行う方法を知っている場合、私はそれを行うことができ、「はい」を復号化できますか?
4

4 に答える 4

5

あなたが提示したコードは、データの4ビットニブルごとにXORを実行しているようです(つまり、一度に1つの16進文字に相当します)。

ビットごとの操作とシフト操作は、ループ&の各ラウンドで使用する特定のビット セットをマスクするだけです。forビットマスクを作成するだけなので、失われたビットを「回復」する必要はありません。

これは単純な XOR 暗号化であるため、次の復号化ルーチンがあります。

unsigned long long result = 0;
for( i=0; i<16; i++ )
{  
    int n = 4*(i % keyLen);
    int k = (key & (0xF << n)) >> n;
    result |= value&(0xF << 4*i) ^ (k<<4*i);
}

これはたまたま暗号化ルーチンです (XOR 暗号化は、同じキーを使用して暗号化ルーチンを介して暗号文を実行することによって復号化されます)。

もちろん、XOR 暗号化はおもちゃにすぎないことを指摘しなければなりません。信じられないほど弱く、簡単に破ることができます。ですから、ただ遊んだり学んだりしているといいのですが。

残念ながら、この種のコードが実際の製品にどれだけ頻繁に使用されるかは残念です...

于 2009-08-05T18:58:05.273 に答える
1

100% 確実に動作するという確信を持ってビットシフトを元に戻すことはできません。

0011 >> 1 が 0001 になる

0001 << 1 は 0010 になります

そして、&を逆にしますか?繰り返しますが...単一の回答から2つの入力値を取得しようとしています。1001 は、(1111 & 1001) または (1011 & 1101) から形成できます。多くの可能な組み合わせがあります。

ビット シフトは、最初に左にビット シフトされ、次に右に同じ量だけビット シフトされるため、先ほど示した問題の影響を受けない可能性が高いことに気付きました。

于 2009-08-05T18:51:20.187 に答える
0

すべての回答に感謝しますが、この xor 暗号化アルゴリズム全体が最終的に行うことは 1 つだけです。つまり、c = a ^ b です。

したがって、コードを何も変更せずに、暗号化された文字列でキーを使用するだけで、復号化された値が返されます。

しかし、Michael が言ったように、コードは 16 進文字ごとに暗号化を行います。

于 2009-08-09T11:44:53.240 に答える