您的位置:首页 > 运维架构

通过 Perf 对 OpenSSL 中 RSA 加密解密进行性能分析

2014-07-20 18:38 393 查看

1、测试用例:rsa_test.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>

#define OPENSSL_KEY "./2048.pem"
#define PUBLIC_KEY "./2048_pub.pem"
#define BUFFER_SIZE 2048

char* my_encrypt(char *str, char *path_key);
char* my_decrypt(char *str, char *path_key);

int main(void)
{
char *source ="this is a test of openssl RSA encrypt/decrypt!";
char *ptr_en, *ptr_de;

printf("\nSource is     :%s\n\n", source);

ptr_en = my_encrypt(source, PUBLIC_KEY);

printf("\nAfter encrypt :%s\n\n", ptr_en);

ptr_de = my_decrypt(ptr_en, OPENSSL_KEY);

printf("\nAfter decrypt :%s\n\n", ptr_de);

if(ptr_en != NULL) {
free(ptr_en);
}

if(ptr_de != NULL) {
free(ptr_de);
}
return 0;
}

char *my_encrypt(char *str, char *path_key) {
char *p_en;
RSA *p_rsa;
FILE *file;
int flen, rsa_len;

if((file = fopen(path_key, "r"))== NULL) {
perror("Open key file error");
return NULL;
}

//if((p_rsa = PEM_read_RSAPublicKey(file, NULL, NULL, NULL)) == NULL) {
if((p_rsa = PEM_read_RSA_PUBKEY(file, NULL, NULL, NULL)) == NULL) {
ERR_print_errors_fp(stdout);
return NULL;
}

flen = strlen(str);
rsa_len = RSA_size(p_rsa);

p_en = (unsigned char*)malloc(rsa_len + 1);
memset(p_en, 0, rsa_len + 1);

if(RSA_public_encrypt(rsa_len, (unsigned char*)str, (unsigned char*)p_en, p_rsa, RSA_NO_PADDING) < 0) {
return NULL;
}

RSA_free(p_rsa);
fclose(file);

return p_en;
}

char *my_decrypt(char *str, char* path_key) {
char *p_de;
RSA *p_rsa;
FILE *file;
int rsa_len;

if((file = fopen(path_key, "r")) == NULL) {
perror("Open key file error");
return NULL;
}

if((p_rsa = PEM_read_RSAPrivateKey(file, NULL, NULL, NULL)) == NULL) {
ERR_print_errors_fp(stdout);
return NULL;
}

rsa_len = RSA_size(p_rsa);
p_de = (unsigned char*)malloc(rsa_len + 1);
memset(p_de, 0, rsa_len + 1);

if(RSA_private_decrypt(rsa_len, (unsigned char*)str, (unsigned char*)p_de, p_rsa, RSA_NO_PADDING) < 0) {
return NULL;
}

RSA_free(p_rsa);
fclose(file);

return p_de;
}


2、Perf 性能分析过程

1、通过替代源代码目录下面 test 文件夹下面的 rsa_test.c 用例,然后 make,获得可执行文件 rsa_test 可执行文件,如下性能分析,都是针对此可执行文件进行。

2、执行 perf stat -B -r 10 ./rsa_test 获得 .rsa_test 运行的统计信息,如下所示:



通过 10 次重复计算统计,第一项 task-clock 表示运行的周期数,占用了 0.943 说明这是一个 CPU 占用型的程序,主要考虑优化 CPU 时间。

3、执行 rsa_perf.sh shell 脚本

rsa_perf.sh 脚本如下:

#!/bin/bash
perf record -g -B -F 100000 -e cpu-clock ./rsa_test
perf report


通过 perf stat 分析知道,程序的运行时间是 6.288 毫秒,所以这里选用的采样频率比较小,为 10 微妙,这样可以比较好的记录 CPU 消耗。

Perf 结果如下所示:



此 Perf 主要是分析热点函数消耗的 CPU 时间。通过分析可以看出,比较消耗 CPU 的是 bn_sqr4x_mont 这个函数,通过进入此函数,可以看到比较消耗 CPU 的汇编指令(用红色标出来的)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: