Rsa

如何創建用於儲存 RSA 密鑰的 PEM 文件?

  • March 6, 2021

我有一個 RSA 私鑰 $ {d,n} $ 和一個公鑰 $ {e,n} $ , 在哪裡 $ n $ 是模數,我也有素因數 $ p $ 和 $ q $ 的 $ n $ .

我想創建一個包含此資訊的 PEM 文件,以便我可以使用 OpenSSL 解密使用公鑰加密的文件。我怎樣才能做到這一點?

RFC 2313RSAPrivateKey將ASN1 結構指定為SEQUENCE包含INTEGERs

  • $ 0 $ ;
  • $ n $ ;
  • $ e $ ;
  • $ d $ ;
  • $ p $ ;
  • $ q $ ;
  • $ d\bmod(p-1) $ ;
  • $ d\bmod(q-1) $ ;
  • $ q^{-1}\bmod p $ .

PEM 格式由編碼為 Base64 的結構組成,並由典型的BEGIN/END RSA PRIVATE KEY頁眉和頁腳行構成。

因此,您可以使用任何您喜歡的 ASN1 庫來對私鑰參數進行編碼。例如,使用 Python 的pyasn1模組,可以得到一個私鑰文件的內容,如下所示:

import pyasn1.codec.der.encoder
import pyasn1.type.univ
import base64

def pempriv(n, e, d, p, q, dP, dQ, qInv):
   template = '-----BEGIN RSA PRIVATE KEY-----\n{}-----END RSA PRIVATE KEY-----\n'
   seq = pyasn1.type.univ.Sequence()
   for i,x in enumerate((0, n, e, d, p, q, dP, dQ, qInv)):
       seq.setComponentByPosition(i, pyasn1.type.univ.Integer(x))
   der = pyasn1.codec.der.encoder.encode(seq)
   return template.format(base64.encodebytes(der).decode('ascii'))

參數dP,dQqInv最容易(如:程式碼行)計算如下:

dP = d % (p-1)
dQ = d % (q-1)
qInv = pow(q, p-2, p)

引用自:https://crypto.stackexchange.com/questions/25498