AP Javaクラスに割り当てられて、以下を解読しました。 umzDlBF8aFix
次のキーで: oE2dpffzEiFD
唯一の問題は、これらを復号化するためにXORを実行する方法がわからないことです。これらをバイナリに変換することはできました。
キー: 101000 | 000100 | 110110 | 011101 | 101001 | 011111 | 110011 | 000100 | 100010 | 000101 | 000011
暗号文: 110110 | 100110 | 110011 | 100101 | 000001 | 111100 | 011010 | 000101 | 100011 | 110001
しかし、私はそれをどうしたらいいかわかりません。もしあなたがこれを手伝ってくれるなら、それは素晴らしいことです!コードも同様に良いでしょうが、必要ではありません。
感謝万円!
回答:
回答№1は0それらをバイナリに変換する必要はありません。 XORはビット単位の演算なので、2バイトを一緒にXORできます。これは、1バイトの各ビットを他のバイトの対応するビットとXORするようなものです。
ゼロから(そして除外する)ループを書くだけです暗号の各文字を読み取る暗号の長さ、それをキーの対応する文字とXORし、結果をStringBuilderに追加します。次に呼び出す .toString()
StringBuilderで結果を取得します。
コンパイラが文字をXORできないと文句を言う場合は、それぞれをキャストします char
〜に byte
、バイト間のXORを実行してから、結果を char
.
ザ String
クラスには charAt()
から文字を取得できるようにするメソッド文字列内の特定のインデックス。または、各文字列の内容をchar配列として取得することから開始できます。 (別の機能があります。)
ボーナスとして、キーがするようにできます暗号と同じ長さである必要はありません。暗号の文字をアドレス指定する別のインデックスを維持できます。このインデックスが暗号の長さに達すると、ゼロに戻すことができ、暗号を最初から読み始めます。
回答№2の場合は0
XOR演算子には、T XOR KXOR K == T、したがって、プレーンテキストTをキーKで暗号化する場合は、操作C = T XOR Kを適用し、テキストを復号化するには、同じ操作を再度適用するだけです(T = C XOR K)。 forループまたは関数型プログラミングマップを使用して、XOR操作をプレーンテキストのすべてのバイトに適用できます。
編集:必要に応じて、プログラミング言語のXOR演算子は文字「^」で表されるため、A ^ BはA XOR Bを意味します。
EDIT2:T XOR K XOR K == Tであるという単純な証拠。まさに「魔法のように受け入れる必要はない」のです。
- K XOR Kは明らかに0
- T XOR 0は明らかにTに等しい
- XOR演算子は2進数とともに結合的であるため、T XOR K XOR KをT XOR(K XOR K)== T XOR 0 == Tと書くことができます。
回答№3の場合は0
他の人が指摘したように、「xor」は素晴らしい暗号化メカニズム。これは、暗号化と復号化がまったく同じ操作であるためです。キーのすべての部分を一度だけ使用すると、最も安全な暗号化アルゴリズムを使用できます。
キーの一部を再利用すると、暗号化が簡単になり、最悪の暗号化メカニズムの1つになります。
ここにある問題は-どうやって行くのですか文字から暗号化する値まで。 Unicode文字の値を取得できますが、暗号文とキーで偽の結果が得られます。Unicodeをそのまま使用する場合の問題は、暗号化/復号化後に印刷できない文字が表示されることです。教科書の例では、印刷できない文字を印刷するのは困難です。
あなたのテキストを解読するために、私は文字の翻訳がこのように働くと仮定しました。
A
-Z
=> 0-25a
-z
=> 26-510
-9
=> 52-61
(「62/63が何であるかを推測する必要はありませんでしたが、スペースとポイントは適切な推測になります)。
その仮定とXORを使用して、私はあなたの暗号文を取ります umzDlBF8aFix
そしてあなたの鍵 oE2dpffzEiFD
そして平文で終わる GiFeMeaPenny
.
これは読みやすい英語なので-ペニーをください「-上記の仮定がもっともらしいようです。