openssl
benchmark
RSA

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

背景

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

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

opensslのspeedコマンドと同じ、10秒間に何回署名できるかを測定します。RSA 2048bitや4096bitではopensslのspeedコマンドと、ほとんど同じ性能になります。遅いマシンでは鍵生成のところで10分以上かかるので注意してください。
(2018年9月1日 23:50 コードにメモリバリアを追加)

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.0g
1605.1 153.1 20.2 2.5

まとめ

RSAは鍵長が長くなると劇的に性能が劣化するため、ハードウェア アクセラレーションの検討が必要。