Edited at

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

Core i3
4130 3.4GHz
openssl 1.1.1b
1660.0
153.4
20.1
2.5