0

libgcrypt 的文档说:

An RSA private key is described by this S-expression:

(private-key
  (rsa
    (n n-mpi)
    (e e-mpi)
    (d d-mpi)
    (p p-mpi)
    (q q-mpi)
    (u u-mpi)))

...和...

p-mpi
    RSA secret prime p. 
q-mpi
    RSA secret prime q with p < q. 
u-mpi
    Multiplicative inverse u = p^{-1} mod q. 

...和...

Note that OpenSSL uses slighly different parameters: q < p and u = q^{-1} mod p.
To use these parameters you will need to swap the values and recompute u.
Here is example code to do this:

  if (gcry_mpi_cmp (p, q) > 0)
  {
      gcry_mpi_swap (p, q);
      gcry_mpi_invm (u, p, q);
  }

如果一个 p 是较小的素数,而另一个 q 是较小的素数,并且假设这两个方程除了交换 p 和 q 之外是相同的,那么真的有必要重新计算 u 吗?仅仅交换 p 和 q 还不够吗?

作为一个附带问题,我很好奇为什么 gcrypt 不使用与 PKCS#1 编码相同的值:

     RSAPrivateKey ::= SEQUENCE {
         version           Version,
         modulus           INTEGER,  -- n
         publicExponent    INTEGER,  -- e
         privateExponent   INTEGER,  -- d
         prime1            INTEGER,  -- p
         prime2            INTEGER,  -- q
         exponent1         INTEGER,  -- d mod (p-1)
         exponent2         INTEGER,  -- d mod (q-1)
         coefficient       INTEGER,  -- (inverse of q) mod p
         otherPrimeInfos   OtherPrimeInfos OPTIONAL
     }

o  modulus is the RSA modulus n.
o  publicExponent is the RSA public exponent e.
o  privateExponent is the RSA private exponent d.
o  prime1 is the prime factor p of n.
o  prime2 is the prime factor q of n.
o  exponent1 is d mod (p - 1).
o  exponent2 is d mod (q - 1).
o  coefficient is the CRT coefficient q^(-1) mod p.
4

1 回答 1

0

答案是重新计算“u”是无关紧要的。只需交换“p”和“q”的用法就可以了。

作为对 gcrypt 的一般评论,非对称加密 API 很糟糕。真是惨不忍睹。

  • 不支持从任何格式的文件中加载密钥。

  • 不支持简单地加密/解密缓冲区。相反,您需要先将缓冲区转换为 MPI,然后才能将其转换为 S 表达式。加密后,您需要展开生成的 S 表达式以获得正确的部分,然后调用另一个函数来获取数据本身。解密在创建 S 表达式以从缓冲区解密时需要稍微复杂一些,但检索数据只是一个函数调用。

  • 私钥的 S 表达式的参数与标准 PKCS#1 格式的值不匹配(尽管如本问答所述,转换相当容易)。为什么不?

在我的调查过程中,我发现还有另一个 GNU 加密库。为什么他们保持两个我不知道。另一个叫做“荨麻”,要好得多:

*) 它使用 GMP 库处理多精度整数,而不是像 gcrypt (mpi_t) 那样拥有自己的类型。

*) 它支持从各种格式的文件中加载密钥(我用它作为我自己的代码的基础来加载与 gcrypt 一起使用的密钥)。

*) 它支持各种格式的转换 (PEM->DER, DER->Sexp)。

*) 支持多种对称加密算法和模式。

*) 它支持非对称加密/解密/签名/验证。

我实际上并没有使用它,所以我不能真正评论 API 的可用性,但据我所见,它通常要好得多。

我真的不知道荨麻的背景,但我想知道它是否是因为 gcrypt 的 API 太糟糕而创建的,他们宁愿重新开始也不愿增强 gcrypt。

于 2017-10-18T07:50:56.267 回答