Help us understand the problem. What is going on with this article?

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

2020年1月29日 nVIDIA Jetson nano追加

背景

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
nVIDIA
Jetson nano
openssl 1.1.1
160.4 23.1 3.1 0.4
Raspberry Pi
Zero
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
[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がないため遅い?

izuna
1999年RSA暗号で世界一の性能だった暗号プロセッサICF3をベースに8bit CPUにしたICF3-ZをApache License 2.0のライセンスで公開しました。8bit CPUでは暗号演算器ははずされています。
https://icf3z.idletime.tokyo/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away