RSA 8192bitの性能を測定するソースコード

**2020年1月29日 nVIDIA Jetson nano追加**
**2021年12月25日 Core i5-4690T 2.5GHz(ターボブースト時 3.5GHz)**
**2023年11月11日 Ryzen5 5600G 3.9GHz(ブースト時 4.4GHz)**

#背景
RSA 2048bitや4096bitの性能はopensslのspeedコマンドによって測定ができるが、今のところ8192bit以上の性能は測定できない。opensslのライブラリはRSA 8192bitや16384bitは計算可能だ。そこでopensslのライブラリを使ってRSAの性能を測定するプログラムを作った。このソースコードは自由にご利用いただいて結構です。

#RSAの性能を測定するコード
opensslのspeedコマンドと同じ、10秒間に何回署名できるかを測定します。RSA 2048bitや4096bitではopensslのspeedコマンドと、ほとんど同じ性能になります。**遅いマシンでは鍵生成のところで10分以上かかるので注意してください。**


```c:osslspd.c
#include <stdio.h>
#include <string.h>
#include <openssl/rsa.h>
#include <openssl/bn.h>
#include <openssl/objects.h>
#include <unistd.h>
#include <pthread.h>

int g_count;

void* timer_thread(void* p) {
	sleep(10);
	printf("%d.%d [sign/s]\n",g_count/10,g_count%10);
	exit(0);
}

int main(int argc,char *argv[]) {
    int i,rsabit;

    if(argc==1) {
        printf("Usage: osslspd <rsa bit>\n");
        exit(-1);
    }
    rsabit = atoi(argv[1]);
    if(rsabit<=0) {
        printf("rsa bit error\n");
        exit(-1);
    }
    printf("RSA %d\n",rsabit);

    RSA *rsa =  RSA_new();
    BIGNUM *e = BN_new();
    BN_set_word(e,65537);

    printf("generate key\n");    
    if(RSA_generate_key_ex(rsa, rsabit, e, NULL)==0) {
        printf("RSA_generate_key_ex() fail\n");
        exit(-1);
    }

    unsigned char msg[20] = "test";
    unsigned char sigret[4096];
    unsigned int siglen = 4096;

    for(i=0 ; i<4096 ; i++) sigret[i] = 0;
    pthread_attr_t attr;
    pthread_attr_init(&attr);
	pthread_t timer_threads;

    printf("rsa start!\n");    
    pthread_create(&timer_threads, &attr, timer_thread, NULL);

    g_count = 0;
    while(1) {
        memcpy(msg,sigret,20);
	    if(RSA_sign(NID_sha1,msg, 20,sigret,&siglen,rsa)!=1) {
	        printf("RSA_sign() fail\n");
	        exit(-1);
	    }
        __sync_synchronize();
        g_count++;
   }

   RSA_free(rsa);
   BN_free(e);

   return 0;	
}
```


```c:Makefile
osslspd : osslspd.c
	gcc -o osslspd osslspd.c -lcrypto -lpthread
```

# 測定結果
## RSAの署名性能(上記、ソースコードで測定)

|  |RSA 2048<br>[sign/s]|RSA 4096<br>[sign/s]|RSA 8192<br>[sign/s]|RSA 16384<br>[sign/s]|
|:--|:--:|:--:|:--:|:--:|
|Core2 Duo<br>E7500 2.93GHz<br>openssl 1.0.2k|447.7|61.1|8.1|1.0|
|Core i3<br>4130 3.4GHz<br>openssl 1.1.1b|1660.0|153.4|20.1|2.5|
|Core i5<br>4690T 2.5GHz/3.5GHz<br>openssl 1.0.2k|1646.6|153.1|20.4|2.5|
|Ryzen 5<br>2600 3.9GHz<br>openssl 1.0.1u|1020.9|132.2|18.2|2.3|
|nVIDIA<br>Jetson nano<br>openssl 1.1.1|160.4|23.1|3.1|0.4|
|Raspberry Pi<br>Zero<br>openssl 1.1.1d|16.4|2.3|0.25|-|

注1) Ryzen 5 のopensslのバージョンが少し古いこと、Ryzenに最適化できていない可能性
注2) Jetson nanoはGPU無しのCPU(Cortex-A57 1.43GHz)のみの性能
注3) Rapberry Pi Zero ( ARM1176JZF-S 1.0 GHz動作時 )

## RSAの署名性能(openssl speedコマンド)

|  |RSA 2048<br>[sign/s]|RSA 4096<br>[sign/s]|
|:--|:--:|:--:|
|Core i3<br>4130 3.4GHz<br>openssl 1.0.2k<br>4プロセス|3388.0|308.0|
|Core i5<br>4690T 2.5GHz/3.5GHz<br>openssl 1.0.2k<br>4プロセス|6008.3|557.3|
|Core i7<br>920 2.93GHz<br>openssl 1.0.2k<br>8プロセス|2066.0|282.0|
|Ryzen 5<br>2600 3.9GHz<br>openssl 1.0.1u<br>1プロセス|1388.0|195.0|
|Ryzen 5<br>2600 3.9GHz<br>openssl 1.0.1u<br>12プロセス|8527.0|1178.0|
|Ryzen 5<br>5600G 4.4GHz<br>openssl 3.0.7<br>1プロセス|2102.0|303.0|
|Ryzen 5<br>5600G 4.4GHz<br>openssl 3.0.7<br>12プロセス|13947.0|1943.0|

注) Core i7 920はSSE4.2まででAVX-2がないため遅い？