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 を交換する以外は 2 つの方程式が同一であるとすると、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 はひどいものです。本当にひどい。

  • ANY 形式のファイルからキーをロードすることはサポートされていません。

  • バッファを単純に暗号化/復号化することはサポートされていません。代わりに、バッファーを MPI に変換してから S 式に変換する必要があります。暗号化の後、結果の S 式を巻き戻して正しい部分を取得し、さらに別の関数を呼び出してデータ自体を取得する必要があります。復号化では、バッファから復号化するための S 式の作成が少し複雑になりますが、データの取得は 1 つの関数呼び出しだけです。

  • 秘密鍵の S 式のパラメーターは、標準の PKCS#1 形式の値と一致しません (ただし、この質問と回答で説明されているように、変換はかなり簡単です)。なぜだめですか?

調査の過程で、別の GNU 暗号化ライブラリーがあることを発見しました。なぜ彼らが2つを維持しているのか、私にはわかりません。もう1つは「イラクサ」と呼ばれ、はるかに優れています。

*) gcrypt のように独自の型 (mpi_t) を持つのではなく、多倍精度整数に GMP ライブラリを使用します。

*) さまざまな形式のファイルからのキーのロードをサポートしています (gcrypt で使用するキーをロードするための独自のコードの基礎として使用しました)。

*) 様々なフォーマットからの変換に対応しています (PEM->DER, DER->Sexp)。

*) さまざまな対称暗号化アルゴリズムとモードをサポートしています。

*) 非対称暗号化/復号化/署名/検証をサポートします。

実際に使用したわけではないので、API の使いやすさについてコメントすることはできませんが、私が見た限りでは、概してはるかに優れていました。

私はイラクサの背景をよく知りませんが、単に gcrypt の API がひどすぎて、gcrypt を拡張するよりも最初からやり直したいという理由だけで作成されたのではないかと思います。

于 2017-10-18T07:50:56.267 に答える