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


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



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值