昔、大量のSUN SPARCstationを持っていた。昔の秋葉原は、SPARCstationのOEMロゴ版だったら、数万円も出せばフルメモリの状態で購入できた。ほぼ目方売り。それにOpenBSDを入れて使っていた。SUN OSは手に入らないし、結構バグがあったのであまり使わなかった。まぁ無償版のSolaris 7とかだったらsunsiteからgccとか落とせて使えないことはなかった。ATOKとかも無料で使えたし。ただ、その目方売りのSPARCstationはしょぼすぎてSolarisとかは無理。なので、OpenBSD。メインで使っていたのは、SPARCstation IPXというやつで、通称弁当箱筐体。こいつ一つ難点があって、SSHで接続するのに、しばしお時間がかかる。つまり暗号化の処理がめっちゃ遅いというのを思い出した。
暗号化でベンチマークが取れるかも。ちょうどマルチプラットフォームのコンパイルができる環境もできたので、手持ちのマシンでベンチマークを取ってみた。
閑話休題
GoでRSA 64bitのベンチマーク?ソフトを作らせてみた。AIなので所要時間10分程度。中身は、RSA 64bit (256とかにしたらかなり長時間がかかる)を暗号化、さらに暗号化を全力で解除(因数分解させる)させるというもの。いわば今のCPUでRSA64ビットの暗号をどれくらいの時間で解読できてしまうのか?ソフト。さらに、シングルスレッドで計算させるケースとマルチスレッドで計算させるのと2種類作成。マルチスレッドだと、テストしたすべてのプラットフォームで全CPUの負荷がすぐに100%になる。
結果
Linux / Intel 10th Gen Corei7 / 6 core (仮想マシン)
シングル
=== [XXX: 暗号化された状態] ===
公開鍵: n = 15811897819042051787, e = 65537
暗号化メッセージ: 'HELLO' => 6904927948486813762
=== [YYY: 攻撃者が解読を試みた状態] ===
公開鍵 n を素因数分解して秘密鍵を推測…
素因数分解成功
素因数分解成功: p = 3823333561, q = 4135631267
解読時間: 2m54.654269719s
復号成功!平文: HELLO
=== [CPU情報] ===
CPU: 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz
論理コア数: 6
3分弱。これが一応ベースラインとしてみていく。
マルチスレッド
=== [XXX: 暗号化された状態] ===
公開鍵: n = 15672445253782527671, e = 65537
暗号化メッセージ: 'HELLO' => 9522477798753519203
=== [YYY: 攻撃者が解読を試みた状態] ===
公開鍵 n を素因数分解して秘密鍵を推測…
素因数分解成功
素因数分解成功: p = 3704099227, q = 4231108373
解読時間: 1m54.456865424s
復号成功!平文: HELLO
=== [CPU情報] ===
CPU: 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz
論理コア数: 6
2分弱で1分短縮。
Windows / Intel 12th gen Corei7 / 12 Core (物理マシン)
シングル
=== [XXX: 暗号化された状態] ===
公開鍵: n = 16939038461946629603, e = 65537
暗号化メッセージ: 'HELLO' => 8330023311651149271
=== [YYY: 攻撃者が解読を試みた状態] ===
公開鍵 n を素因数分解して秘密鍵を推測…
素因数分解成功
素因数分解成功: p = 4009407929, q = 4224822907
解読時間: 2m34.3804053s
復号成功!平文: HELLO
CPU情報が取得できませんでした: open /proc/cpuinfo: The system cannot find the path specified.
約2分半。Roon Serverも兼ねていた環境だったかもしれないが、Intel 10th genより遅い結果に。CPUの情報は、Linuxでしか取れません(作るのが面倒だった。)
マルチスレッド
=== [XXX: 暗号化された状態] ===
公開鍵: n = 14407286500766053787, e = 65537
暗号化メッセージ: 'HELLO' => 13091165588780340965
=== [YYY: 攻撃者が解読を試みた状態] ===
公開鍵 n を素因数分解して秘密鍵を推測…
素因数分解成功
素因数分解成功: p = 3665676059, q = 3930321793
解読時間: 2m33.6214499s
復号成功!平文: HELLO
CPU情報が取得できませんでした: open /proc/cpuinfo: The system cannot find the path specified.
約2分半。シングルとあまり変わらず。もしかして、途中経過で処理速度がでるようにしているのだが、PcoreとEcoreが影響?大抵は0秒で終わる計算がたまに少し時間がかかっている計算が混じっている。
MacOS / M4 Apple Silicon
シングル
=== [XXX: 暗号化された状態] ===
公開鍵: n = 17799989734907102267, e = 65537
暗号化メッセージ: 'HELLO' => 6496652081412353424
=== [YYY: 攻撃者が解読を試みた状態] ===
公開鍵 n を素因数分解して秘密鍵を推測…
素因数分解成功
素因数分解成功: p = 4200754003, q = 4237332089
解読時間: 1m47.056770458s
復号成功!平文: HELLO
CPU情報が取得できませんでした: open /proc/cpuinfo: no such file or directory
最高記録、1分47秒。これはマルチスレッドは期待できるかも。
マルチスレッド
=== [XXX: 暗号化された状態] ===
公開鍵: n = 13691041083901713293, e = 65537
暗号化メッセージ: 'HELLO' => 359569159144936790
=== [YYY: 攻撃者が解読を試みた状態] ===
公開鍵 n を素因数分解して秘密鍵を推測…
素因数分解成功
素因数分解成功: p = 3690551177, q = 3709755109
解読時間: 2m59.760442666s
復号成功!平文: HELLO
CPU情報が取得できませんでした: open /proc/cpuinfo: no such file or directory
期待を裏切り3分。やはり、P coreとE coreが影響しているように見える。こういう計算でE coreに計算を割り振るのは良くないのかもしれない。猫の手を借りたいといいつつ仕事をさせる猫を選ぶべきだったのか?
調べてみたがLinux以外、P Coreだけにスレッドを割り当てる方法はなさそう。さらに自分でP CoreとE Coreを判別しなきゃならない。
おまけで
Linux / Raspberry Pi Zero
監視カメラで外を24時間写している筐体。これは物理コアが1つしかないので、シングルのみで測定
=== [XXX: 暗号化された状態] ===
公開鍵: n = 14475577024809989437, e = 65537
暗号化メッセージ: 'HELLO' => 6225554281476204946
=== [YYY: 攻撃者が解読を試みた状態] ===
公開鍵 n を素因数分解して秘密鍵を推測…
素因数分解成功
素因数分解成功: p = 3607756147, q = 4012349071
解読時間: 7h16m55.591391968s
復号成功!平文: HELLO
=== [CPU情報] ===
CPU: ARMv6-compatible processor rev 7 (v6l)
論理コア数: 1
一晩かかって7時間。ARMといえども、Broadcom BCM2835。FPU内蔵といえども遅い。MIPSでも試そうと思ったが、やめた。
結論としては、
- GOで各プラットフォーム、CPUの環境で、対等に比較するアプリケーションができた。
- P CoreとE Coreの環境だとマルチスレッドが必ずしも速くはならないケースが分かった。
ということだった。
本当は、RSA 64ビットの脆さを調べたかったんだが、それは初回のベンチマークの結果で数分ということがあっけなく得られて終わり。
この計算、オイラー関数を知っておく必要があるのだが、今の中学受験でも、オイラー関数って出るのね。えっ。中学受験でずるいのは、オイラー関数を知っていればすぐわかる問題をだしておきながら、オイラー関数ということばを使わず、オイラー関数の計算で解かせるという。。指導要領と説明は全く別物として扱っているのが分かった。まぁ、大学受験でも、大学で習う、線形代数の外積を答案に書いても普通に⭕️をもらえるからなぁ。高校生は、外積は知らないことになっている。一応。
さらに、実は、手元のsshの証明書を10年くらい使い回していた。いかんいかんと思っていたんだが、ようやく4096ビットにした。Sun SPARCstation LCのせいでビット数を落として作っていた。もうSunのマシンは手元にないので、問題ない。ついでにSSL証明書も2048ビットから4096ビットにしようかと思ったが、サーバの負荷を考えてまだ上げない。CPUのリソース課金されたらたまらないし。それにどうせ3ヶ月に一度入れ直さなきゃならないのでいつでも可能。