Published Date : 2021年1月9日7:50

Pythonでシーザー暗号 Part 5
Try the Caesar cipher in Python Part 5


This blog has an English translation


ニコニコ動画にアップした動画のまとめ記事です。

This is a summary blog post about a video I uploaded to NicoNico.

細かい部分は動画を参考にしてください。

Please refer to the video for details.


目次

Table of Contents




① 動画の説明
① Video Description



今度はtsharkを利用して、通信された暗号文をコマンドラインで解析していきましょう。

Now let's use tshark to parse the transmitted ciphertext on the command line.

管理者権限で立ち上げたPowerShellでtsharkのコマンドを打っていきましょう。

Let's start typing tshark commands in PowerShell with administrator privileges.

tshark

Dオプションを付けて実行すると、利用可能なデバイスが表示されます。

When run with the D option, the available devices are displayed.

tshark -D

iオプションを付けてループバックアダプタの名前を指定して実行すると、Wiresharkの時と同じ様にトラフィックの詳細が表示されます。

If you use the i option to specify the name of the loopback adapter and then run it, you will see the traffic details as in Wireshark.

tshark -i ¥Decive¥NPF_Loopback

fオプションでキャプチャフィルターがかけられます。今回はポート番号を80番に指定してみました。

The f option sets the capture filter. This time, I specified port number 80.

tshark -i ¥Decive¥NPF_Loopback -f "port 80"

Yオプションはディスプレイフィルターです。http通信に対してフィルターをかけてみましょう。

The Y option is a display filter. Let's filter http communication.

tshark -i ¥Decive¥NPF_Loopback -f "port 80" -Y http

wオプションを付けて、ファイル名を指定すると、キャプチャファイルを作成することができます。

You can create a capture file by specifying a file name with the w option.

tshark -i ¥Decive¥NPF_Loopback -f "port 80" -w test.pcap

rオプションでキャプチャファイルを読み込み、ディスプレイフィルターにPOST通信のみを指定して、Tオプションを使ってJSON形式でキャプチャ内容を表示させます。

The r option loads the capture file, the display filter specifies POST communication only, and the T option displays the capture in JSON format.

tshark -r test.pcap -Y 'http.request.method == "POST"' -T json

キャプチャされたファイルからTオプションとeオプションを使用してフィールドの内容を限定して表示できます。

From the captured file, you can use the T and e options to narrow the display of the contents of the captured fields.

tshark -i ¥Decive¥NPF_Loopback -f "port 80" -Y 'http.request.method == "POST"' -T fields -e 'urlencoded-form.value'

cオプションでキャプチャする数を指定できます。

The c option lets you specify the number of captures.

tshark -c 100 -i ¥Decive¥NPF_Loopback -f "port 80" -Y 'http.request.method == "POST"' -T fields -e 'urlencoded-form.value'

aオプションでキャプチャを行う時間を指定できます。

The a option lets you specify the duration of the capture.

tshark -a duration:100 -i ¥Decive¥NPF_Loopback -f "port 80" -Y 'http.request.method == "POST"' -T fields -e 'urlencoded-form.value'

これらを組み合わせて、Pythonファイルから通信を解析してみましょう。

Let's combine them to analyze communication from a Python file.

その前に、前回のAndroidのJavaファイルに若干の修正を加えます。

Before that, we will make some modifications to the previous Android Java file.

Javaではマイナスの値をプラスの値で剰余計算を行うと、そのままマイナスの値の余りを出力してしまいます。

In Java, if you calculate the remainder of a negative value with a positive value, the remainder of the negative value is output.

例えばPythonではマイナス3と26の剰余計算は23であるのに対して、Javaではマイナス3になります。

For example, in Python, the modulus of minus 3 and 26 is 23, while in Java it is minus 3.

これにより、計算結果で生じるascii文字がおかしくなってしまいます。

This results in an incorrect ascii character in the result.

なので、それを解消するために、Pythonと結果と同じになるように、剰余計算用のメソッドを別で用意します。

So, to get around that, I'll provide a separate method for calculating the remainder, so that the result is the same as in Python.

メソッド内部では実際にはif文を多用していますが、このように書くことによって一行にまとめることができます。

Inside the method, you actually use a lot of if statements, but you can write them in this way to keep them on one line.

int mod(int i, int j){
    return (i % j) < 0 ? (i % j) + (j < 0 ? -j : j) : (i % j);
}

クエスチョンマークの左側が条件文、右側がTrueの時の処理内容、コロンの後に書かれているのがFalseの時の処理内容です。

A conditional statement is to the left of the question mark, a true statement is to the right, and a false statement is to the right of the colon.

前回のアプリでは秘密鍵の大きさによって、例えばb等の文字がアルファベット以外の記号になってしまっていました。

In the previous our application, for example, the letter b became a symbol other than alphabet depending on the size of the private key.

このようにすれば、問題なくアルファベットが循環的に変換されます。

This way, the alphabet is converted cyclically without any problems.

試しにいくつか文字を入力して挙動を確かめてみましょう。

Try typing some characters to see how it works.

それではPythonスクリプトを作成していきます。

Now let's create a Python script.

wiretapping/
    capture.py
    cmdA.bat
    cmdB.bat

まず、管理者権限でなければtsharkは動かせないので、それを解決するために、バッチファイルを作成して、PowerShellを使ってコマンドプロンプトを管理者権限で立ち上げるスクリプトを作成します。

First, tshark cannot run without administrator privileges, so to solve this, you create a batch file and a script that uses PowerShell to launch the command prompt with administrator privileges.

%1はコマンドプロンプトで実行させるスクリプトファイルで、%2はそのスクリプトファイルに渡す変数です。

%1 is the script file you want to run at the command prompt, and %2 is the variable you want to pass to the script file.

そしてコマンドプロンプトで実行させるバッチファイルを作成します。

Create a batch file to run at the command prompt.

まず、コマンドプロンプトが立ち上がった階層をPythonスクリプトがあるディレクトリに移動させてから、Python側で処理する為のテキストファイルを作成します。

First, move the hierarchy where the command prompt appears to the directory where your Python script resides, and then create a text file to be processed by Python.

アットマークエコーオフは以下に続くコマンドをコマンドプロンプト側で表示させないようにする為の設定です。

At sign echo off is a setting to prevent the following commands from being displayed at the command prompt.

後は先ほどのtsharkのコマンドを組み合わせて、指定された時間内で、目当ての通信内容だけを抽出していきます。

We then combine the previous tshark commands to extract only the desired traffic within the specified time.

メインとなるPythonスクリプトを作成します。

Create the main Python script.

サブプロセスモジュールを使用して、PythonからPowerShellにコマンドを送ることができるようにします。

The subprocess module allows commands to be sent from Python to PowerShell.

Timeモジュールを使用して、制限時間を設けて、それをバッチファイルに引数として渡します。このようにするのは、バッチファイルの実行時間とPythonスクリプトの実行時間を合わせる必要があるからです。

Use the Time module to set a time limit and pass it as an argument to the batch file. This is because the batch file execution time must match the Python script execution time.

コマンドの内容は、バッチAファイルへ引数としてバッチBファイルと時間の変数が渡され、バッチBファイルはその時間変数を引数としてスクリプトを実行します。

The contents of the command pass the batch B file and time variables as arguments to the batch A file, then, batch B file executes the script with the time variables as arguments.

ではキャプチャして保存した通信内容のテキストファイルから、暗号の秘密鍵を総当たりで調べて表示させる関数を作成しましょう。

Now let's create a function that looks up and displays the cryptographic private key from a text file of captured and saved communications.

今回はシーザー暗号なので、秘密鍵はアルファベットの総数の26個しかありません。

This time it is a Caesar cipher, so there are only 26 secret keys, the total number of alphabets.

まあ実際は暗号化されない0個目と、26個目の鍵は無いと考えるので、鍵は1から25までの25個を探せばいい訳です。

Well, I don't think there's actually a 0th and a 26th key that's not encrypted, so you just need to look from 1 to 25 for 25 keys.

25個しかなければ、速度が遅いPythonでも一瞬で秘密鍵を見破ることができるでしょう。

With only 25 keys, even slow Python can detect private keys in a moment.

後は総当たりで表示させた解読文と対応する秘密鍵を分かりやすく表示して別のテキストファイルに保存するだけです。

All that remains is to save the decrypted text and the corresponding private key line by line in a plain text file.

time.sleepメソッドを使用して、数秒だけバッチファイルが終了するのを待ちます。

Use time.sleep method to wait a few seconds for the batch file to finish.

それではスクリプトを実行して、いくつか暗号文を送ってみましょう。

Let's run the script and send some ciphertext.

バッチファイルが終了し、pythonスクリプトも終了したら総当たりの結果を確認してみましょう。

Once the batch file is finished and the python script is also finished, you can see the brute force results.

ご覧の通り、秘密鍵は3で、解読されてしまった平文が表示されています。

As you can see, the private key is 3 and the decrypted plaintext is displayed.

秘密鍵さえ分かってしまったら、鍵を変えられない限り次回から総当たり無しで解読できます。

Once you know the private key, you can use it to decrypt the ciphertext into plaintext without searching again, unless the user tries to change the key.

後は「あの場所」が、どの場所なのかが分かっていればですけど...

The rest is "the location" but it would be best if you know where it is...

お疲れ様です、シーザー暗号は簡単な暗号なので、各自でもっと複雑な暗号方法を考えてみてください。アディオス。

Thank you for your hard work. The Caesar cipher is a simple cipher, so please think about a more complicated cipher by yourself. Adios.



以上です。お疲れ様です。

That's all. Thank you for your hard work.