web-dev-qa-db-ja.com

入力と出力がある場合、暗号化技術を知ることができますか?

テキストを暗号化できるプログラムがあります。このプログラムで使用されている暗号化を見つけようとしましたが、わかりませんでしたプレーンテキストがPで、暗号化されたテキストがCである場合、Cを暗号化すると、 、それは再びPを生成します "二重暗号化は元のメッセージを生成します"暗号化されたテキストはユニコード文字です、強力なテキスト例えば入力「abcd」、出力「žœ›」は暗号化技術を見つけることは可能ですか?

1
Null

あなたが説明しているのは、暗号システムの研究である暗号解読と呼ばれる活動です。

あなたが暗号化するプログラムを持っていると言ったとすれば、私はそこから始めます。最初のステップは、オープンソースインテリジェンスギャザリング、またはOSINT(「グーグルイット」と言うのに空想的な方法です)と呼ばれます。使用中の暗号化に関する情報については、プログラムのドキュメントを検索してください。アプリケーション名をGoogleで検索し、「クラック」や「ハック」などの単語が付いていることを確認します。

次に、プログラムを分析します。おそらく、バイナリイメージにはまだシンボルがあります。コマンドラインからstrings programnameのようなプログラムを実行して、バイナリイメージのさまざまなテキスト文字列を確認します。 AES128DESedeHMACLFSR、またはROT13などの文字列が表示される場合、それらは使用中のアルゴリズムを示す手掛かりである可能性があります。

メッセージを暗号化および復号化する機能しかない場合は、入力と出力を比較してみてください。 AAAAAAABの文字列を数回暗号化し、出力が常に同じかどうかを確認します。 NNNNNNNOなどの同様のパターンに従っているかどうかを確認します。別の文字を追加します。 1つ取り除きます。暗号化されたデータがどうなるかを確認します。同じ入力メッセージが常に同じ出力を生成する場合、それは単純な置換またはECB暗号である可能性があります。メッセージが常に完全に変化する場合は、解読できるよりも優れた暗号を使用している可能性があります。 1文字の変更によってメッセージが完全に文字化けする場合は、ブロック暗号(これも難しい)である可能性があります。ブロック暗号を使用していると判断できる場合(変更は常に8、16の倍数、または一度に32バイト)キーを復元するには、実際のプログラムを逆アセンブルおよびリバースエンジニアリングする必要があります。

1
John Deters

@Davidの回答が指摘したように、これは一般に実行するのが非常に困難です。特に、AESのような一部の暗号化アルゴリズムは、ランダムな初期化ベクトル(IV)を開始ブロックとして使用するためです。したがって、正しい実装では、平文が同じであっても毎回異なるIVが生成され、異なるメッセージが生成されます。

例として、CBCモードでHello World!を暗号化してみましょう。

キー:0000 0000 0000 0000(安全のため、説明のためにのみ)

IV = 0000 0000 0000 0001を使用すると、暗号文(base64)が得られます:KcS/oAzkKMi03Nrf65hlww ==

IV = 0000 0000 0000 0002を使用する場合、暗号文(base64)を取得します:2wTIRW8sSb4XpE9Ue3xm6w ==

(IVは通常、暗号化されたメッセージに含まれています。比較を簡単にするために省略しました)

1
Allan Pinkerton

この暗号化に固有ですが、一般的な答えはありません:

編集した追加情報に基づいて、これは単純なXORでコメントの冒頭で提案したようです。XORには2つの興味深い特徴があります。それ自体が反転し、XOR同じ値はゼロを生成します。

ユニコードのように見える理由は、KEYのビットセットが高いためです。標準の英語ASCIIは実際には7ビットで、8番目のビットは拡張文字セットに使用されます。XORとキーを使用すると、拡張ASCIIで高ビット文字が生成されます。

独自のテキストを入力できるため、何らかの理由でスペースが機能しない場合は、「スペース」または「@」の長い文字列を入力してください。 XOR以外の何物でもない場合は、繰り返し数がキーの長さである繰り返し文字列を出力する必要があります。

「スペース」または「@」を使用する理由は、これらの両方に、それぞれ16進20または40の1つのビットセットがあるためです。シングルビットの変更のみを処理する必要がある場合は、手動でキーを簡単に計算できます。

入力「abcd」、出力「žœ›」の例では、拡張ASCII 16進数を想定すると、これは

    61 62 63 64 outputs 9E 9C 9B

「œ」は「Latin small ligature」と呼ばれる拡張ASCIIの単一文字であるため、表示される出力は「abc」の3文字のみです。したがって、入力の3文字と出力をXORしてキーの最初の3バイトを見つけると、16進数が得られます。FFFE F8

そのキーを考えると、「@」(16進数40)の文字列を入力すると、拡張ASCIIで「¿¾¸」が生成されます。

0
user10216038

簡単ではありませんが、保証はありません。

さまざまな暗号化アルゴリズムにアクセスできる場合は、「キーを持っていると仮定して」「逆引きテーブル」を作成し、不明な暗号化アルゴリズムの結果をそれらと比較することができます。

たとえば、暗号化アルゴリズムenc(text、key)を指定すると、次のテーブルが作成されます:enc( 'a'、key)enc( 'b'、key)enc( 'c'、key)...

次に、出力を比較して、アルゴリズムを「enc」に対してテストします。

知らない場合はキーを推測してこれを試すこともできますが、これはlot推測であり、veryである必要があります。

ただし、@ kelalakaが指摘しているように、これは、なんらかの「リセット」なしで同じ入力に対して同じ出力を生成する暗号化アルゴリズムでのみ簡単に機能します。

これ以外の方法を考えることはできません。

0