RSA算法理论学习解惑――复制粘贴RSA私钥导致tengine出错深入解析

  • 时间:
  • 浏览:0

排查过程中难题如下:

tengine的代码中使用了RSA_check_key函数进行RSA私钥格式正确性检查,有一次加载私钥测试时tengine reload失败。案例的看点是RSA格式私钥文件中的私钥指数d在tengine实际的加解密计算过程中并这么用到,至于为哪此请细看下文。

看来需用搞清楚这多少参数的含义,但要搞清楚这多少参数的作用需用了解rsa加解密的原理,建议先读“RSA算法原理(二)”

http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html

现在需用理解RSA_check_key(pkey) 函数为哪此出错了:即拿到私钥文件中dmp1,dmq1,d用公式计算亲戚亲戚朋友的关系发现结果不一致好多好多 报错了。

与原文件正确的私钥经过对比发现5个 多多多字符出错,下图中101行代表原始的pem格式私钥数据C13改为了C12,第32行是经过转换后的数据,

在一次配置tengine https服务使用的证书和私钥操作时采用了从原文件一键复制粘贴的土办法,当使用tengine启动服务时提示出错:

使用d和q参数计算 dmq1,倘若与私钥文件中解出的dmq1比对查看是与非 正确.

rsa->meth->rsa_mod_exp()最后调用 RSA_eay_mod_exp()此函数实现解密这么用到d参数。

nginx与 openssl s_server都这么调用RSA_check_key函数,而tengine做加载私钥用到了RSA_check_key函数。

推断openssl rsa -in 111.pem –check应该也用到了此RSA_check_key函数

查32行得知属于privateExponent每项,即属于私钥元素d

5个 多多RSA私钥文件中的内容解析如下:

原创文章:来自RSA算法理论学习解惑――一键复制粘贴RSA私钥原因分析 tengine出错深入解析

到此本该并且开始英文了了了,但还5个 多多多难题为哪此nginx与 openssl s_server都这么出错,追了一下openssl代码

这多少参数在openssl中具体定义是

我以我各自 理解简单点来解释:公钥需用用n和e代表,私钥需用用n和d代表;且n=p*q算出,e和d需用满足 ed ≡ 1 (mod φ(n)),其中φ(n)代表n的欧拉函数;私钥文件饱含了这多少参数删剪需用实现用来私钥解密和签名等功能了。以m代表明文,c代表密文,所谓"加密"过程,好多好多 算出下式的c:

me ≡ c (mod n)

所谓解密好多好多 c的d次方除以n的余数为m:

cd ≡ m (mod n)

倘若直接用n d大数来直接使用存在时延不高的难题,倘若都是数学大牛们引入了新的算法-中国余数定理,用于补救时延的难题(本文简称为RSA-CRT算法)。解密和签名的过程就改为了 

关键性提示身前的含义未知。

d e not congruent to 1

dmp1 not congruent to d

dmq1 not congruent to d

倘若用curl访问https://127.0.0.1:9999端口后, 上述openssl s_server服务打印输出如下:

即ssl握手过程中用到证书与私钥能验证通过!应该能说明证书与私钥虽然是配对的。这不原因分析 太奇怪了?!

最后用openssl rsa -in 111.pem –check 才发现有难题。到底是哪此原因分析 tengine 判断私钥有难题?本着刨根问底的精神,联系了做openssl的多少同事,暂时也这么人对这块有深入的研究。只有我各自 动手分析了。

从上需用看出所有的参数都饱含在私钥文件中。

首先查openssl中出错时的代码块

主好多好多 需用对RSA私钥文件中各参数的作用需用删剪了解,原因分析 需用数论原理好多好多 ,理解openssl代码难度还是很高的,搞了多少小时终于搞明白了原理。

即RSA-CRT算法只需用5个元素就需用完成模幂运算,不需用用到d.现在也需用清楚了上述crypto_rsa_key底部形态中最后参数的含义了,即用于RSA-CRT计算用的,且dmp1 dmq1也需用通过d计算得到。