Xorcism

Xorcism

上級

説明

キーへの参照を保持し、任意のデータとビット単位でXORするストリーミングアダプターを書きます。

XORは基本的な二項演算です。入力の各ビットについて、入力ビットが異なっていれば、出力の対応するビットを1にします。両方の入力が1の場合、または両方が0の場合は、対応する出力ビットは0になります。

文書とキーをXORするとき、キーは必要な回数だけ繰り返され、入力文書と同じ長さの出力文書が得られます。

文書とキーをXORすることは、1900年代初頭まで暗号技術として使われていました。データを隠す方法としてはすっかり時代遅れですが、真の乱数を使う面倒さなしに、ランダムに見えるノイズの多いデータを生成するのに驚くほど役立ちます。現代の暗号技術でも、特定の暗号方式で今なおときどき使われています。暗号自体は、非常にランダムで無限に長いキーを生成する仕組みにすぎず、そのキーが文書とXORされます。

XOR暗号の興味深い性質の1つは、対称性があることです。任意の数をそれ自身とXORすると0になり、任意の数を0とXORすると、入力の数がそのまま返ります。したがって、XORで暗号化された文書を復号するには、同じキーでもう一度XORで暗号化します。

アロケーションなし

構造体がキーをコピーせずにキーへの参照を保持していることを確認するテストを書くのは現実的ではありません。同様に、mungeもmunge_in_placeも、それらのヘルパー関数も、ヒープにメモリを確保していないことをテストで証明するのも現実的ではありません。それでも、そのようにして解答を書くよう心がけましょう。

実装

キーへの参照を保持するstruct Xorcismを書く必要があります。この構造体には、munge_in_placeとmungeという2つのメソッドが必要です。前者はバイトバッファをその場で変更します。後者はイテレーターアダプターで、任意のデータのイテレーターを受け取り、新しいデータのイテレーターを返します。

この演習のスタブのシグネチャは、構文としてはほぼ正しいものの、コンパイルは通りません。この演習の大きな狙いの1つは、ライフタイムとジェネリクスの使い方に慣れることなので、自分で埋めていく必要があります。もう1つの目標は、両方のメソッドをできるだけ重複なく実装できる適切な分解のしかたを見つけることです。遠慮なくヘルパーを追加しましょう!

役立つトレイト

次のトレイトが役立ちます。

ボーナステスト

この演習には、ioフィーチャーフラグの背後にあるボーナステストが含まれています。有効にするには、次を実行します。

cargo test --features io

これらのテストでは、次のシグネチャを持つreaderメソッドを実装する必要があります。

fn reader(self, impl Read) -> impl Read

そして、次のシグネチャを持つwriterメソッドも必要です。

fn writer(self, impl Write) -> impl Write

これらの関数はそれぞれ、Xorcism構造体を適切な方向のストリームアダプターに変換します。次のトレイトを使います。

mungeの戻り値のライフタイム

impl Trait機能を使っているため、mungeメソッドを実装するときは、ライフタイムの管理が少し厄介になることがあります。まずは、Iteratorを実装した独自のstructを書いて、その具体的な型を返すほうが簡単だと感じるかもしれません。最終的には、Iteratorのコンビネーターを直接使って解答を実装してみるのがよいでしょう。


出典

Peter Goodspeed-Niklaus
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Rust Exercism

Xorcismを始める準備はできましたか?

Exercismに登録すれば、99個の演習、そして本物の人間によるメンタリングとともに、Rustを学んでマスターできます。すべて無料です。