神ツールChipWhispererでAESの相関電力解析をする

本記事は↓の続きです。

trmr.hatenablog.com

概要

電力解析の神ツールの一つChipWhispererを使って、RHme3 Tracing the tracesを解きます。

ChipWhisperer

前回はAESの相関電力解析を実施する方法を勉強しましたが、 このような電力解析を簡単にやってくれるツールが世界には存在します。 そのようなツールの一つがChipWhispererです。

ChipWhisperer® – NewAE Technology Inc.

ChipWhispererは、電力をキャプチャするハードウェア部分とキャプチャした波形を解析するソフトウェア部分で構成されています。 このうちソフトウェア部分はオープンソース (GPLライセンス) で提供されています。 本記事ではこのソフトウェアを用いて、問題を解いていきます。

ちなみにハードウェア部分は販売されており、一番安いChipWhisperer Liteは下記サイトから250USD + カナダからの送料 + 税金で購入することが可能です。

NewAE Technology Inc.

ちなみに購入するとハートウォーミングなメッセージの書かれた領収書と、使い道のわからないトランプもついてきます。 こういう心遣いがうれしいですね。

f:id:trmr105:20180317013638p:plain

ただ今回の問題は電力はすでにデータとして与えられており、キャプチャをする必要がないため、ハードウェアの購入は必要ありません。 以降はソフトウェア部分にフォーカスして説明していきます。

インストール

まず下記サイトからChipWhispererをインストールしましょう。

Installing ChipWhisperer - ChipWhisperer Wiki

Windows版、Linux版、Mac版と用意されていますが、パッケージが用意されていてインストールが容易なこと、処理が早い (気がする) ことから、個人的にはWindows版をおすすめします。

Tracing the traces

題材は前回と同様にRHme3のTracing the tracesです。 問題は下記を参照のこと。

github.com

ChipWhisperer形式への変換

前回を参考にmatlab形式の変換までは完了していることとします。 下記コマンドでmatlabフォーマットをchipwhispererフォーマットに変換しましょう。

import scipy.io as sio
import numpy as np
import os
from chipwhisperer.common.traces.TraceContainerNative import TraceContainerNative

traces = sio.loadmat("traces.2.mat")


ntraces = len(traces['samples'])
traceLen = len(traces['samples'][0])

inp = np.uint8(traces['inout'][:, 0:16])
out = np.uint8(traces['inout'][:, 16:32])

#Save as ChipWhisperer project
tc = TraceContainerNative()
for i in range(0, ntraces):
    tc.addWave(traces['samples'][i])
    tc.addTextin(inp[i])
    tc.addTextout(out[i])
    tc.addKey([0]*16)

os.mkdir('rhme3')
tc.saveAllTraces('rhme3')
tc.config.setConfigFilename('rhme3/rhme.cfg')
tc.config.saveTrace()

ちなみTraceContainerNativeを利用してフォーマットを変換すると出来上がった設定ファイルrhme.cfgファイルの 設定値にprefix=Noneと書かれた行が自動的に付与されます。 ただ、なぜかこの値をChipWhispererはprefixが"不要"という意味ではなく、prefix="None"という文字列として解釈してしまいます。 Noneを削除したprefix=に値を変えておきましょう。

ファイルの読込

ChipWhispererがインストールされたフォルダのsoftware配下に存在するCWAnalyzer.pywを起動します。 trace managerを実行し、rhme.cfgファイルを読み込んでみたところ、下記波形が表示されました。

f:id:trmr105:20180317015914p:plain

与えられたサンプル値を一つ表示しているみたいです。 たくさんのグラフを同時に表示してみましょう。 Resultタブのtrace to plotを0-100にしてみます。

f:id:trmr105:20180220003657p:plain

f:id:trmr105:20180220003623p:plain

これでジッターだらけではありますが、波形を表示することができました。

ジッターの排除

Attack Script Generatorでpre processingでResync: sum of differenceに設定してやり、次にpreprocessingタブに移動し、ref traceで特徴を抽出するトレースを指定し、特徴点(ピーク値等)をreference pointsの間にいれてやり、マッチングさせる範囲をinput windowとして設定してやりましょう。そして最後にenabledにチェックを入れれば、ある程度波形がきれいに表示されるはずです。

f:id:trmr105:20180317020811p:plain

f:id:trmr105:20180220004008p:plain

相関電力解析!

start attackをクリックしてください。

f:id:trmr105:20180317020936p:plain

Results Tablesの最も上に並んでる値が、最も相関係数の高かった値、すなわちFlagとなるはずです。

f:id:trmr105:20180220004154p:plain

まとめ

単純なAESに対する相関電力解析はツールで解けちゃいます。 低い得点で電力解析問が出たらとりあえずツールにかけてしまうのが勝ちパターンかもしれません。

次回は一風変わった電力解析問を紹介します。

trmr.hatenablog.com

Write-up Links