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 的汇编指令(用红色标出来的)