暗号の「心音」を聴く泥棒たち——電力解析攻撃(DPA)から身を守るための基礎知識
こんにちは。セキュリティの現場で日々、見えない敵と戦っているエンジニアです。
皆さんは、どれほど完璧な金庫(暗号アルゴリズム)を作っても、その「金庫を閉めるときのわずかな音」で暗証番号がバレてしまうとしたらどう思いますか?
今日は、ITの現場でも少しずつ無視できなくなっている「サイドチャネル攻撃」、特に「電力解析(DPA)」という少し不気味で面白い攻撃手法について、身近な例を交えてお話ししましょう。「セキュリティって、ただパスワードを長くすればいいわけじゃないんだな」ということが伝われば嬉しいです。
—
1. そもそも「サイドチャネル攻撃」って何?
普通、暗号といえば「数学的にどれだけ解読が困難か」を考えますよね。例えば、RSA暗号やAES暗号は、何億年かけても解けないような計算量で守られています。
しかし、攻撃者は「数学的に解くのが無理なら、別の方法でバレないかな?」と考えます。これがサイドチャネル攻撃です。
泥棒の例えで考えてみましょう
あなたが家の玄関に、世界一頑丈な「指紋認証ロック」を付けたとします。泥棒は指紋を偽造しようとはしません。その代わり、あなたがドアを開けるときの「電気代の変動」や「駆動音」を外から計測するのです。
「あ、今の音の長さは、指紋を照合する処理が少し重かったから、特定のキーが入力されたな」といった具合です。
これが、暗号処理中にCPUが消費するわずかな電力の変化を解析して、内部の秘密鍵を割り出す「電力解析攻撃(DPA)」の正体です。
—
2. なぜ電力で鍵がバレるのか?
CPUの中では、0と1のデータが動くたびに、トランジスタがパチパチと切り替わります。このとき、わずかな電流が流れます。
- 「0」から「1」に変わる時と、「0」のままの時では、流れる電力が微妙に異なります。
- この微細な差を、オシロスコープのような計測器で何千回、何万回と記録し、統計的に処理すると……なんと、暗号処理に使われている「鍵」のビットが見えてきてしまうのです。
「えっ、そんな精密な装置が必要なの?」と思うかもしれませんが、最近ではスマホや安価なマイコンボードでも、工夫次第で同様の解析ができてしまうのが怖いところです。
—
3. どうやって身を守るのか?(防御の基本)
現場でエンジニアが取り組む防御策は、大きく分けて二つあります。これらは「泥棒に偽の情報を与える」ようなイメージです。
① マスキング(Masking)
計算の過程に「ランダムな値(ノイズ)」を混ぜる手法です。
例えば、鍵が「1010」だとしたら、毎回違うランダムな値と混ぜて計算を行います。結果は正しく出ますが、電力の変化は毎回バラバラになるため、泥棒は「どれが本当の鍵の動きか」を判別できなくなります。
② シャッフル(Shuffling)
処理の順番をバラバラにする手法です。
泥棒は「処理の最初の1ミリ秒に鍵の1ビット目が来る」と予測して計測しますが、処理の順番がランダムに変わると、その予測が外れます。
—
4. 実務で意識するべきこと:擬似コードで見る「防御」の考え方
もし皆さんが暗号化処理をハードウェアや低レイヤーで実装する機会があれば、以下のような「定数時間」を意識した実装を心がけることが大切です(※これは概念的な例です)。
// 悪い例:処理時間がデータによって変わる(サイドチャネル攻撃の標的になりやすい)
function checkPassword($input, $realPassword) {
// 比較中に一致しない文字が見つかった時点で処理を止めるため、
// 攻撃者に「どの文字まで合っていたか」を推測される可能性がある
return $input === $realPassword;
}
// 良い例:データの内容に関わらず常に同じ時間をかける(定数時間比較)
function secureCompare($input, $realPassword) {
$result = 0;
// 全ての文字を比較し、途中で止めない
for ($i = 0; $i < strlen($realPassword); $i++) {
// ビット演算を使って、処理時間を一定にする工夫
$result |= (ord($input[$i]) ^ ord($realPassword[$i]));
}
// 最後に結果を判定
return $result === 0;
}
この secureCompare のように、「処理のステップを一定にする」「ランダムなタイミングを入れる」といった工夫が、物理的な攻撃を防ぐ第一歩になります。
—
最後に:完璧なセキュリティはないけれど
サイドチャネル攻撃は、非常に専門的で、物理的なアクセスが前提となることが多い分野です。そのため、Webアプリの一般開発者が毎日怯える必要はありません。
しかし、「セキュリティはソフトウェアのコードだけで完結しない」という視点を持つことは、プロフェッショナルとして非常に重要です。「暗号化しているから安心」ではなく、「その暗号化処理は、実行中に情報を漏らしていないだろうか?」と一歩立ち止まって考える。
そんな「疑い深いエンジニア」こそが、今日の世界で最も信頼される守護者になれるはずです。
もし興味が湧いたら、次は「タイミング攻撃(Timing Attack)」についても調べてみてください。暗号の世界は、まだまだ奥が深いですよ!
コメント