はじめに
独自のハードウエアを作った場合とは異なり、RPi, NanoPi等既製品のSBCを使って商品を作ろる場合、ハードウエアを購入し、不正コピーしたソフトウエアを載せることで模造品が容易に作れます。RSA暗号を用いて模造品を無効化する方法を考えたので紹介します。
模造品の弊害
- 粗悪な模造品をユーザーは正規品と区別できずクレームが発生する
- ソフトウエア資産を不正に使用される
- 模造品が流通することで正規品の売り上げが下がる
これまでの模造品排除法
アリババ式
子機から親機に秘密の暗号 - 例えば「開けゴマ」を送るものです。自動車のキーレスエントリーはこの方法です。アリババのようにこの通信を傍受し同じことを言えば(replay攻撃)容易に解けてしまいます。
秘密鍵式
DESのように暗号化装置を用意し通信を暗号化します。親機子機間の通信は「温度をよこせ」「湿度をよこせ」「照度をよこせ」のように単純で一定パターンの事が多いでしょう。これを盗聴すると暗号文に規則性があり対応関係を類推されてしまいます。
偽造困難な方法
SBCの応用について子基板があり何らかの通信手段で子基板のCPUと通信していると思います。もしそうでなければこれだけのために子基板をつけI2C等で通信します。
子基板のCPUはLast FuseもしくはSecurity Fuseと呼ばれるものを切ることによってROMの実行は可能ですが、読み出し不可になるものとします。
あらかじめRSAの暗号Key Pair (K1, K2)をつくり、NanoPi側に公開鍵K1を保存し、子基板のCPUに秘密鍵K2を保存します。
通信開始時にそれとは別のKey Pair (K3, K4)を作り公開鍵K3をK1で暗号化し子基板に送り秘密鍵K4を保存します。子基板はK2でこれを復号化し保存したうえK3で暗号化しNanoPiに送ります。
NanoPiはこれをK4で復号化しK3に等しいことを確認したときだけ正規の子基板と認証します。確認できなければエラーを吐いて実行停止します。
以降の通信はNanoPiからは平文で送信し子基板からはK3で暗号化して応答します。一定時間、もしくは一定データー量通信した後、上記鍵交換を再度行うことにしてもいいです。
NanoPiからの送信をK1で暗号化しても構いませんがよりCPU Timeを使いK2を推察する機会が増えます。
以上でK2が漏洩しない限り複製は困難と思われますが、念のため子機はResetされてもn秒間以上K3を受け入れないようにします。
結論
これにより総当たりを試みてもnの2 ^ Key長 以上かかり実用的に推察は困難で且つ子基板の非力なCPUでも実用的な暗号化が可能になります。