BETA

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

投稿日:2019-04-03
最終更新:2019-10-12

背景

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

RSAの性能を測定するコード

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

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;      
}  

Makefile

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

測定結果

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

# RSA 2048
[sign/s]
RSA 4096
[sign/s]
RSA 8192
[sign/s]
RSA 16384
[sign/s]
Core2 Duo
E7500 2.93GHz
openssl 1.0.2k
447.7 61.1 8.1 1.0
Core i3
4130 3.4GHz
openssl 1.1.1b
1660.0 153.4 20.1 2.5
Ryzen 5
2600 3.9GHz
openssl 1.0.1u
1020.9 132.2 18.2 2.3

注) Ryzen 5 のopensslのバージョンが少し古いこと、Ryzenに最適化できていない可能性

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

# RSA 2048
[sign/s]
RSA 4096
[sign/s]
Core i3
4130 3.4GHz
openssl 1.0.2k
4プロセス
3388.0 308.0
Core i7
920 2.93GHz
openssl 1.0.2k
8プロセス
2066.0 282.0
Ryzen 5
2600 3.9GHz
openssl 1.0.1u
1プロセス
1388.0 195.0
Ryzen 5
2600 3.9GHz
openssl 1.0.1u
12プロセス
8527.0 1178.0

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

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

なにか思いついたことを不定期に更新。

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!