Underhanded C Contestの精神で、私はUnderhanded Code Contestを始めています。このコンテストの目的は、いくつかのコードを簡単に実装し、その中に微妙なバグを隠すことです。
コンテスト
あなたはアメリカのスパイ機関のIT部門で働いているロシアの秘密のほくろです。アメリカの上司から、秘密メッセージの暗号化に使用するパスワードハッシュアルゴリズムの実装を求められました。
上司は、次の機能を実装することを望んでいます。
f: String -> byte[16]
パスワードをAESキーとしての使用に適した16バイトの数量に変換します。上司は安全な機能を求めています。これは、このコンテキストでは、異なるパスワード文字列が圧倒的な確率で異なる結果を生成することを意味します。たとえば、入力のmd5ハッシュを返すことは、の単純な実装になりf
ます。
もちろん、ロシアのスパイ機関の本当のボスは、このプロセスを破壊することを望んでいるでしょう。あなたの仕事はf
、ロシア人がによって返されf
たキーを使用して暗号化されたすべての秘密メッセージを解読できるように実装することです。
そのためにf
は、2 ^ 128の可能な出力の小さなサブセットのみを返すように実装する必要があります。特に、f
ロシア人が解読したい暗号化されたメッセージごとに正しいキーを簡単にブルートフォース検索できるように、最大2 ^ 16の異なる結果を返す必要があります。
ただし、スパイ行為には死刑が適用されることに留意してください。キャッチされないようにするには、関数f
が少なくとも2 ^ 8の異なる結果を生成する必要があります。そのため、いくつかの出力の大まかな検査でf
重複が明らかになることはほとんどありません。 そして最も重要なことは、範囲を制限するために導入するコードはf
、意図的なものではなく、意図的なものではないことです。 法廷に連れて行かれた場合、意図的にバグを導入したのか、偶然にバグを導入したのかについて、ある程度の疑いがなければなりません。
審査
私と私が募集する他の2人が応募作品を審査します(審査を希望する場合はメールしてください)。受賞作品に対して200の評判賞金を提供しています。提出物は5月1日までにアップロードする必要があります。
審査では、次の基準が考慮されます。
f
仕様に準拠しています。つまり、2 ^ 8〜2 ^ 16の可能な出力を生成します。これらが厳しい制限であるとは思わないでください。ただし、範囲外である場合はポイントを差し引きます。- バグは、意図しない間違いの結果であると思われますか?
- 出力は
f
ランダムに見えますか? - の実装が短いほど
f
優れています。 - の実装が明確であれば
f
あるほど、より良い結果が得られます。
ノート
任意の言語を使用してコードを実装できます。バグを目立たないように隠そうとしているので、難読化されたコードは推奨されません。
過去のUnderhanded Cコンテストの受賞者の一部を見て、優れた提出物の感触をつかむことができます。
入力文字列は、印刷可能なASCII(32から126まで)になります。必要に応じて、適切な最大長を想定できます。