plot-openssl-speed

Bash script to plot openssl speed results.


Project maintained by KazKobara Hosted on GitHub Pages — Theme by mattgraham

plot-openssl-speed: 複数の openssl speed 測定結果を簡単にグラフ描画する方法

English English

本プログラム/スクリプトは、OpenSSL及びその互換プログラム/ライブラリ(LibreSSLなど)の使用者/開発者が、そこで利用可能な暗号アルゴリズムの処理速度を手元の環境で測定し結果を比較表示したり、Web上で公開されている処理速度やサイズ情報などと比較する作業を容易にするためのものです。 暗号アルゴリズムを128/192/256ビットセキュリティへ移行する際や耐量子計算機暗号へ移行する際の判断材料を得ることができます。

前準備

  1. 必要なコマンドのインストール
    • Debian/Ubuntu の場合:

        sudo apt install gnuplot git openssl make gcc gcc-mingw-w64-x86-64 cmake ninja autoconf
      
      • openssl は実行PATH上の openssl を使う場合に必要
      • make gcc は openssl をソースファイルから make する場合に必要
      • gcc-mingw-w64-x86-64 は MinGW で openssl.exe を作る場合に必要
      • cmakeninjaoqsproviderliboqs などをビルドする場合に必要
      • autoconfLibreSSL git repo の configure.ac から configure を作成する場合に必要
    • macOS の場合:

      1. Command Line Tools のインストール

        ターミナル上で Command Line Tools が提供しているコマンド(例えば以下など)を打ち込み、指示に従う。

         gcc
        
      2. Homebrewをインストールし、以下を実行

         brew install gnuplot coreutils mingw-w64 cmake ninja autoconf
        
        • coreutilsrealpath コマンドをインストールするために必要
        • mingw-w64 は MinGW で openssl.exe を作る場合に必要
        • cmakeninjaoqsproviderliboqs などをビルドする場合に必要
        • autoconfLibreSSL git repo の configure.ac から configure を作成する場合に必要
      3. Zsh で問題が生じた場合には Bash に変更

         chsh -s /bin/bash
        
  2. スクリプトのダウンロードとフォルダへの移動

     git clone https://github.com/KazKobara/plot_openssl_speed.git
     cd plot_openssl_speed
    
  3. ヘルプと使い方の表示

     ./plot_openssl_speed_all.sh -h
     ./plot_openssl_speed.sh -h
    

    上記スクリプトのフローチャート

  4. Web上で公開されている量子計算機暗号のパフォーマンス等のデータとの比較を行う場合

    Node.jsをインストール後、以下を実行

     cd ./data_from_web/
     npm install --save puppeteer
     npx @puppeteer/browsers install chrome@stable
     cd ..
    

    その後、以下のスクリプトを実行

実行PATH上のopensslコマンドの測定結果を描画する場合

./plot_openssl_speed_all.sh -s 1
  • オプションの -s 1 は、各暗号アルゴリズムの測定時間を1秒に短縮するためのものです。
    • 全体の傾向をつかめ、バラツキの小さな計測を行う際には指定せずご実行下さい。
    • 以下の図は指定せずに実行した結果になります。
  • LibreSSL に対しては、(少なくとも 2.8.3 の時点においては) openssl speed コマンドが -seconds オプションを有しておらずエラーとなるため指定しても無視されます。

上記コマンドを実行すると、以下のように表示メッセージの最後に、グラフ画像ファイルやその元になったデータファイルなどが格納されたフォルダ情報が表示されます。

Results are in:
  ./tmp/default_openssl_1.1.1f/graphs/

WSL (Windows Subsystem for Linux) を使用している場合、例えば Ubuntu-20.04/home/ ディレクトリへは Windows OS のファイルエクスプローラから、以下のアドレスで移動できます。

\\wsl$\Ubuntu-20.04\home\

グラフ画像の一覧は、例えば、ファイルエクスプローラの場合、以下のように「表示」タブで「特大アイコン」を選択し、「グループ化」で「種類」を選択すると表示させることができます。

Explore Menu

格納されたグラフ画像一覧の例(PATH上の openssl 1.1.1f): graphs

格納されたグラフ画像一覧の例(PATH上の LibreSSL 2.8.3): graphs

指定したバージョン(tag)をコンパイルし得たopensslコマンドの測定結果を描画する場合

例えば、tag として openssl-3.0.7 のソースコードからその実行環境用にコンパイルした openssl コマンドでの測定結果と、それを MinGW (x86_64-w64-mingw32-gcc) でクロスコンパイルした Windows OS 用 openssl.exe での測定結果も図示する場合。

./plot_openssl_speed_all.sh -s 1 openssl-3.0.7 openssl-3.0.7-mingw
  • tagの後ろに-mingwを付けることで Windowsバイナリ openssl.exe が make され、WSL上ではその測定結果のグラフ画像も保存されます。WSL以外では Windowsバイナリ実行環境も構築する必要があります。
  • 以下の例で示しております openssl-3.0.5 には脆弱性があります。修正済または最新の OpenSSL (またはその代替プログラム)をご使用下さい。

格納されたグラフ画像一覧の例(ソースからコンパイルした openssl-3.0.5): graphs

耐量子計算機暗号の測定結果を描画する場合

plot_openssl_speed_all.sh v1.0.0以降では、opensslコマンドが liboqs 及び oqs-provider に対応している場合に、そこで利用可能な耐量子計算機暗号の処理速度についても測定し描画します。また、[[pq-sig-zoo]]及び[[ebats]]で公開されている size や cycle 数との比較の描画も可能です。

openssl, oqs-provider, liboqsの tag がそれぞれ、openssl-3.3.1, 0.6.1, 0.10.1 の openssl コマンドをコンパイルし、その測定結果を描画する場合は、以下のように引数(openssl-type)を指定します。

./plot_openssl_speed_all.sh -s 1 openssl-3.3.1-oqsprovider0.6.1-liboqs0.10.1

master/main ブランチの場合は、以下のように引数(openssl-type)を指定します。

./plot_openssl_speed_all.sh -s 1 master-oqsprovidermain-liboqsmain

v1.0.0 時点では、引数(openssl-type)に liboqs 及び oqs-provider が含まれている場合、-mingw(MinGW でのクロスコンパイル)と組み合わせることはできません。

グラフから読み取れることと補足

処理速度は様々な要因により変わるため、あくまでこちらの測定環境における参考です。また、処理速度が速いというだけで、脆弱性な暗号アルゴリズムや、各用途で求められるセキュリティレベルを満たさないアルゴリズムを選択しないようにご注意下さい。

どのような用途においてどのようなアルゴリズムを用いるべきかなどにつきましては、もし必要でしたら勉強会などに呼んで頂ければ解説致します。

耐量子計算機暗号

以下の図は、oqsprovider 0.6.1 経由で liboqs 0.11.0-rc1 と連携する OpenSSL 3.4.0-alpha1 において利用可能な耐量子計算機暗号の処理速度を表しています。

署名方式:

oqs_sig_all

KEM (Key Encapsulation Mechanism, 鍵カプセル化):

oqs_kem_all

耐量子計算機暗号と従来の非対称鍵暗号との比較

公開鍵/署名検証鍵と署名文/暗号文のサイズの比較については、[[pq-sig-zoo]]、[[ebats]]から必要な方式のデータを抜き出し、他のデータと共に表示させることが可能です。

署名方式

128(クラシカル)ビットセキュリティ相当方式の比較:

sig_128bs

sig_128bs_size

192(クラシカル)ビットセキュリティ相当方式の比較:

sig_192bs

sig_192bs_size

256(クラシカル)ビットセキュリティ相当方式の比較:

sig_256bs

sig_256bs_size

暗号鍵共有方式

KEM 及び ECDH の比較で、ECDH の operation 1回分は、生成元とのスカラー倍算1回、ランダムな元とのスカラー倍算1回などの処理を含みます。

128(クラシカル)ビットセキュリティ相当方式の比較:

kem_128bs

kem_128bs_size

192(クラシカル)ビットセキュリティ相当方式の比較:

kem_192bs

kem_192bs_size

256(クラシカル)ビットセキュリティ相当方式の比較:

kem_256bs

kem_256bs_size

非対称鍵暗号方式(デジタル署名、暗号鍵共有方式など)

一般的な傾向の例を以下の図に示します。各線グラフは、対応する棒グラフの暗号アルゴリズム名中のサイズ(非対称鍵暗号アルゴリズムを構成する有限体または環のビット長)と処理速度との関係を示し、各線グラフ中の変数 a の値は、サイズが2倍になった場合に処理速度が 1/a になる場合の a の値を表します。

RSA:

RSA

RSA RSA

2の拡大体上のECDH:

ecdh_b ecdh_b

素体上のECDH(brainpool):

ecdh_brp ecdh_brp

いずれの図からも、サイズが大きくなるにつれ処理速度が遅くなることを確認できます。

次に、この傾向から外れている例を示します。

ECDSA/ECDH(素体上のNISTカーブ, OpenSSL 3.0.5 のソースコードを Ubuntu 20.04 上でビルドし実行):

ecdsa_p ecdh_p

OpenSSL においては、

ECDSA/ECDH(素体上のNISTカーブ, Homebrew の OpenSSL 3.3.2 を macOS 14.6 で実行):

ecdsa_p_3_3_2brew ecdh_p_3_3_2brew

ECDSA(素体上のNISTカーブ, LibreSSL 2.8.3 macOS 12.4 附属バイナリ):

libressl/ecdsa_p_2_8_3bin

LibreSSL においては、

ECDSA(素体上のNISTカーブ, LibreSSL 2.7.4 のソースコードを macOS 15.0 上でビルドし実行):

libressl/ecdsa_p_2_7_4

ハッシュ関数SHA/SHS

hash

APIの差:

ハッシュ値切り詰め版との差:

sha256sha512 の差:

SHA-3:

共通鍵暗号と暗号利用モード

cipher128-256

理論的には、

例外:

LibreSSL 2.8.3 (macOS 12.4 附属バイナリ):

libressl/cipher128-256_2_8_3bin

LibreSSL 3.3.6 (macOS 14.6 附属バイナリ):

libressl/cipher128-256_3_3_6bin

LibreSSL 3.9.2 (ソースコードからのビルド):

libressl/cipher128-256_3_9_2

OpenSSL 1 と 3 とでの主要な違い

測定対象の暗号アルゴリズムを変更する場合

./plot_openssl_speed_all.sh 中の関数 plot_graph_asymmetric()plot_graph_symmetric() 内の記述をご編集下さい。前者は公開鍵暗号/デジタル署名用、後者は共通鍵暗号/ハッシュ関数用になります。

例えば、以下のように記述すると、サポートされている eddsa ecdsa デジタル署名の測定結果のグラフが ed_ecdsa.png に、そのグラフの元となったデータファイルが ed_ecdsa.dat に、測定時ログが eddsa.log 及び ecdsa.log にそれぞれ保存されます。

${PLOT_SCRIPT} -o "./${GRA_DIR}/ed_ecdsa.png" eddsa ecdsa

上記欄の各行は以下のようなコマンドにより直接実行することも可能です。

./plot_openssl_speed.sh -o "./tmp/default_openssl_1.1.1f/graphs/ed_ecdsa.png" eddsa ecdsa
  • ‘openssl_1.1.1f’ の部分は PATH 上の openssl コマンドの version に応じてご変更下さい。
  • 使い方とオプションにつきましては ./plot_openssl_speed.sh -h もご参照下さい。

PATH に含まれていない openssl 実行ファイルは -p オプションで指定することができます。

./plot_openssl_speed.sh -p "./tmp/openssl-3.0.7/apps/openssl" -o "./tmp/openssl-3.0.7/graphs/ed_ecdsa.png" eddsa ecdsa

以下のようなエラー:

error while loading shared libraries: 
symbol lookup error: 

が出る場合には、LD_LIBRARY_PATH (macOSでは DYLD_LIBRARY_PATH)に openssl が参照する共有ライブラリのディレクトリをご追加下さい。

コマンドラインで一時的に共有ライブラリを追加し、上記コマンドを実行する例:

(export LD_LIBRARY_PATH=./tmp/openssl-3.0.7${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}; ./plot_openssl_speed.sh -p "./tmp/openssl-3.0.7/apps/openssl" -o "./tmp/openssl-3.0.7/graphs/ed_ecdsa.png" eddsa ecdsa)

openssl が参照する共有ライブラリは ldd (macOSでは otool -L)コマンドで表示できます。

$ ldd ./tmp/openssl-3.0.7/apps/openssl
        libssl.so.3 => not found
        libcrypto.so.3 => not found

<oqsprovider_type> を名前に含む作業フォルダー ${TMP}/<openssl-type> 内の openssl コマンドを実行する場合:

${TMP}/<openssl-type> フォルダに移動し、以下のスクリプトを一度実行し、

../../utils/set_oqsprovider.sh

その後、そのフォルダから以下のように ../../plot_openssl_speed.sh -p openssl/apps/openssl を実行

../../plot_openssl_speed.sh -p openssl/apps/openssl -s 1 -o mldsa44_and_mlkem512.png mldsa44 mlkem512

データファイルから図示する場合

上記スクリプトによりPNGファイルを出力させると、それと同じファイル名で拡張子が .dat のデータファイルに描画に用いたデータが上書き保存されます。 それらの中身を組み合わせたり、編集したりすることで新たなデータファイルを作成することができます。

plot_openssl_speed.sh の引数に暗号アルゴリズムを指定しなければ、データファイルに対応するグラフを(openssl speed を実行することなく)出力します。

./plot_openssl_speed.sh -d "data_file_to_graph" -o "output_graph_file.png"

データファイルは以下の方法で指定可能です。

デフォルトのファイル名等は、以下のコマンドで確認できます。

plot_openssl_speed.sh -h

使用したデータファイル名(例えば edited_rsa.dat )がグラフファイル名(例えば rsa.png )の.pngを.datに変えたファイル名( rsa.dat )と異なる場合には、使用したデータファイル( edited_rsa.dat )がそのグラフのファイル名の.pngを.datに変えたファイル( rsa.dat )にコピーされます。これは、*.png を描画するために用いた元データは、常に *.dat を見ればよいようにするためです。

plot_openssl_speed.sh 用データファイルフォーマット

plot_openssl_speed.sh で暗号アルゴリズムを複数指定する際も、TABLE_TYPE が同じものから選択する必要があります。先頭で指定した暗号アルゴリズムと異なる TABLE_TYPE を持つ後続の暗号アルゴリズムは無視されます。

“kbytes” TABLE_TYPE

共通鍵暗号、ハッシュ関数、HMAC で使用するフォーマット。

例:

# type            16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes  16384 bytes
aes-128-ccm     202973.97k   588256.58k  1065011.71k  1314283.52k  1346633.73k  1381728.26k
hmac(sha512)     23408.12k    90165.99k   249721.98k   538953.37k   756375.73k   782985.02k
sha256           30840.78k    88357.72k   199311.27k   292801.60k   334301.56k   319321.27k

“sig_ver_keygen” TABLE_TYPE

v1.0.0以降でデジタル署名の測定結果の比較に使用するフォーマット。 keygen/sのデータが無い場合にはダミーとして0を入れてください。

plot_openssl_speed.sh コマンドの -l オプションでTABLE_TYPEを指定する場合には、一番右の列から連続する0の列を空白にすることも可能です。

例:

# asymmetric_algorithm        sign/s   verify/s   keygen/s
ecdsa(nistp256)              42359.0    15555.0          0
EdDSA(Ed25519)               29607.0     9474.0          0
rsa3072                        553.0    28153.0          0
rsa4096                        268.0    16543.0          0
mldsa44                      14595.0    40081.0    30223.2

“dec_enc_keygen_dh” TABLE_TYPE

v1.0.0以降でデジタル署名以外の公開鍵暗号及びDH鍵共有方式の測定結果の比較に使用するフォーマット。対応する列のデータが無い場合にはダミーとして0を入れてください。

plot_openssl_speed.sh コマンドの -l オプションでTABLE_TYPEを指定する場合には、一番右の列から連続する0の列を空白にすることも可能です。

例:

# asymmetric_algorithm         dec/s      enc/s   keygen/s       dh/s
rsa3072                        593.0    26836.0          0          0
rsa4096                        254.0    15503.0          0          0
ecdh(nistp256)                     0          0          0    19963.0
ecdh(X25519)                       0          0          0    30287.0
mlkem512                    114039.0   100366.0    77138.0          0

“sig_enc_mix” TABLE_TYPE

v1.0.0以降で “sig_ver_keygen”、”dec_enc_keygen_dh” TABLE_TYPEの行を混ぜて比較するためのフォーマット。

例:

# asymmetric_algorithm        sign/s   verify/s   keygen/s
mldsa44                      14595.0    40081.0    30223.2
mldsa65                       8686.0    22795.0    19578.0
mldsa87                       7104.0    14383.0    12445.5
#
# asymmetric_algorithm         dec/s      enc/s   keygen/s       dh/s
mlkem512                    114039.0   100366.0    77138.0          0
mlkem768                     73753.0    71901.0    52051.5          0
mlkem1024                    49803.0    52377.8    43771.7          0

“sig_ver” TABLE_TYPE

v0.0.0でデジタル署名に使用していたフォーマット。 描画では4,5列目の処理速度を使用(2,3列目の処理時間でなく)。

処理時間を描画対象にしなかった理由: 遅いアルゴリズムが比較対象に入っている場合にどのアルゴリズムが速いのか見分けにくい。 速いアルゴリズムの処理時間は0又は最小単位に量子化(丸め)られている。

例:

#                   sign      verify     sign/s verify/s
rsa4096             0.003922s 0.000061s   255.0  16471.0
dsa2048             0.000296s 0.000219s  3383.0   4557.0
ecdsa(nistp256)     0.0000s   0.0001s   43201.0  15221.0
EdDSA(Ed25519)      0.0000s   0.0001s   24010.0   8805.0

“op” TABLE_TYPE

v0.0.0で Diffie-Hellman 鍵交換に使用していたフォーマット。 描画では3列目の数値を使用。

例:

#               op          op/s
ffdh4096        0.0129s     77.8
ecdh(nistp256)  0.0000s  20643.0

with_webdata.sh 用データファイルフォーマット

./data_from_web/with_webdata.sh -d <filename>.dat コマンドで candlestick図を描画する際に取り込むデータファイルのフォーマットです。

例:

# x min      25%        50%        75%        max (k|s|v|d|e):name(source)             parameter
# x dummy    25%        50%        75%      dummy (k|s|v|d|e):'25/50/75% are given'    parameter
# x dummy  dummy       mean      dummy      dummy (k|s|v|d|e):'only the mean is given' parameter
  1 0      76090      86116     134869     134869 s:dilithium2aes(ebats-ryzen7)           2
  2 0      42770      42987      43140      43140 v:dilithium2aes(ebats-ryzen7)           2
  3 0      33094      33541      33924      33924 k:dilithium2aes(ebats-ryzen7)           2
  4 0      74124      74124      74124      74124 s:mldsa44(liboqs0.10.1)                44
  5 0    31584.7    31584.7    31584.7    31584.7 v:mldsa44(liboqs0.10.1)                44
  6 0    35220.3    35220.3    35220.3    35220.3 k:mldsa44(liboqs0.10.1)                44
  7 0     333013     333013     333013     333013 s:ML-DSA-44(pq-sig-zoo)                44
  8 0     118412     118412     118412     118412 v:ML-DSA-44(pq-sig-zoo)                44

各列の意味は以下のとおりです。

測定環境

WSL2 Ubuntu

$ awk '/^PRETTY/ {print substr($0,14,length($0)-14)}' /etc/os-release

Ubuntu 20.04.4 LTS
$ uname -srm

Linux 5.10.102.1-microsoft-standard-WSL2 x86_64
$ awk '$1$2 == "modelname" {$1="";$2="";$3=""; print substr($0,4); exit;}' /proc/cpuinfo

Intel(R) Core(TM) i7-10810U CPU @ 1.10GHz

実行PATH中のopenssl:

$ openssl version -a
OpenSSL 1.1.1f  31 Mar 2020
built on: Mon Jul  4 11:24:28 2022 UTC
platform: debian-amd64
options:  bn(64,64) rc4(16x,int) des(int) blowfish(ptr)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -Wa,--noexecstack -g -O2 -fdebug-prefix-map=/build/openssl-51ig8V/openssl-1.1.1f=. -fstack-protector-strong -Wformat -Werror=format-security -DOPENSSL_TLS_SECURITY_LEVEL=2 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAESNI_ASM -DVPAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPOLY1305_ASM -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2

ソースからコンパイルした openssl-3.0.5:

$ (export LD_LIBRARY_PATH=./tmp/openssl-3.0.5${LD_LIBRARY_PATH:+:$LD_LIBRARY
_PATH}; ./tmp/openssl-3.0.5/apps/openssl version -a )

OpenSSL 3.0.5 5 Jul 2022 (Library: OpenSSL 3.0.5 5 Jul 2022)
built on: Wed Jul 13 10:43:30 2022 UTC
platform: linux-x86_64
options:  bn(64,64)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -O3 -fstack-protector-strong -fstack-clash-protection -fcf-protection -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_BUILDING_OPENSSL -DNDEBUG
$ gnuplot -V

gnuplot 5.2 patchlevel 8

macOS

$ uname -srm

Darwin 21.5.0 x86_64
$ sysctl machdep.cpu.brand_string

machdep.cpu.brand_string: Intel(R) Core(TM) i9-9980HK CPU @ 2.40GHz
$ openssl version -a

LibreSSL 2.8.3
options:  bn(64,64) rc4(16x,int) des(idx,cisc,16,int) blowfish(idx) 
$ gnuplot -V
gnuplot 5.4 patchlevel 3

トラブルシューティング

libssp-0.dll が見つからない

Windowsの環境変数の PATH に libssp-0.dll が存在するフォルダを追加するか、WSL 上の Debian/Ubuntu の場合は以下を実行後に、エラーが出たコマンドを再実行

sudo apt install gcc-mingw-w64-x86-64
bash
export MINGW_GCC_VER=$(/usr/bin/x86_64-w64-mingw32-gcc-posix --version | awk '/x86_64-w64-mingw32-gcc-posix/ {print substr($3,1,index($3,"-")-1)}')
cp -p  "/usr/lib/gcc/x86_64-w64-mingw32/${MINGW_GCC_VER}-posix/libssp-0.dll" .
exit

“Error: bad option or value”と表示される

openssl speed に渡すオプションや引数を変更してみてください。 openssl コマンドの version により実装されていないオプションや暗号アルゴリズムが存在します。

”./apps/openssl.exe: Invalid argument”と表示される

セキュリティソフト等で exe ファイルの実行がブロックされていないか画面等をご確認下さい。ブロックされていた場合、当該ブロックのみを解除し、コマンドを再実行下さい。

リンク

正しく表示されない場合はGitHubのページをご参照下さい。

[kec17]: https://keccak.team/2017/is_sha3_slow.html (TeamKeccak “Is SHA-3 slow?”) [mig]: https://kazkobara.github.io/openssl-migration/ “OpenSSL (libssl libcrypto) の version を 1.1未満(1.0.2以前) から 1.1 以降に変更する方法や注意点など” [pq-sig-zoo]: https://pqshield.github.io/nist-sigs-zoo/ “Post-Quantum signatures zoo” [ebats]: https://bench.cr.yp.to/ebats.html “eBATS: ECRYPT Benchmarking of Asymmetric Systems”


最後までお読み頂きありがとうございます。 GitHubアカウントをお持ちでしたら、フォロー及び Star 頂ければと思います。リンクも歓迎です。

homeに戻る