从二进制 blob 重新生成 PEM/DER 密钥

逆向工程 Python openssl
2021-06-10 20:43:17

我有私钥组件的二进制 blob,包括模数、publicExponent、privateExponent、prime1、prime2、exponent1、exponent2 和系数,从它们生成 PEM/DER 文件的最简单方法是什么?是否有易于使用的 Python API 可以使用还是必须使用 C?同样,如果我将公钥的组件作为二进制 blob,包括模数和指数,那么最简单的方法是什么?这个过程中的另一个问题是:python API 是用来测试组件的属性,比如天气素数是素数还是天气公共和私有组件匹配?

2个回答

这可以很容易地实现 pycryptodome

以下是作为测试生成的一些示例值

In [1]: from Crypto.PublicKey import RSA
In [2]: k = RSA.generate(1024)
In [3]: k
Out[3]: RsaKey(n=143130316039186356537289646457342957029055874083006179752018267628632429252822850383503747585724799519287456198657693682737294996945803556004091588888862734842876499600553435771912216934557891984348187747076769031035627391163918136413321448399135545921574551907381303095829931709226724033859864712257647103161, e=65537, d=17576525985067546537255398853909945804199790570517932383908982984806045296957723116505762555043916971042700268349132837308234281938749515826493875328098129245342983246848248582675980856522190387684789361785762364603511517782326537037037597067485821717857467592522600776711703683226858254562757226108937574081, p=10753783485237760558106558145489319968952855295476064861811826896190777901077938075707538967825984471343848916518461647244807051451613883176849073895898863, q=13309763604192726567108341676142815607992017489636400387824449743334965995406164568181340806599419803897222088829477205186369416995900434016351317269868247, u=11832702411409256011378550201142107940763428930323983942371881106145078470279115081362293142803804740351361635022958520667847860090448209808590495750654916)

In [4]: n = k.n
In [5]: e = k.e
In [6]: d = k.d
In [7]: p = k.p
In [8]: q = k.q

一旦有了 (n,e) 元组,您就可以导出公钥。一旦你有一个 (n,e,d) 元组,你也可以生成一个私钥(p,q 是可选的)。

In [9]: print(RSA.construct((n,e)).public_key().export_key())
b'-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDL0weqmsQCfkL6OLdalWlVFGgN\nw2FLrXujCsTo9SwEkSyab5UsUvX0fTnl/uH9d18g9136zsQPpsv1Ylh4ElW7/BCX\n8TBa4exSdKUTS7ishHYfNJ2kXKZMlws9aLCkS4weagvF83c9fMjoQ74E69BkqQDE\ndDlIBdcLA3fNSSdMuQIDAQAB\n-----END PUBLIC KEY-----'

In [10]: print(RSA.construct((n,e,d,p,q)).public_key().export_key())
b'-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDL0weqmsQCfkL6OLdalWlVFGgN\nw2FLrXujCsTo9SwEkSyab5UsUvX0fTnl/uH9d18g9136zsQPpsv1Ylh4ElW7/BCX\n8TBa4exSdKUTS7ishHYfNJ2kXKZMlws9aLCkS4weagvF83c9fMjoQ74E69BkqQDE\ndDlIBdcLA3fNSSdMuQIDAQAB\n-----END PUBLIC KEY-----'

In [12]: print(RSA.construct((n,e,d,p,q)).export_key())
b'-----BEGIN RSA PRIVATE KEY-----\nMIICXAIBAAKBgQDL0weqmsQCfkL6OLdalWlVFGgNw2FLrXujCsTo9SwEkSyab5Us\nUvX0fTnl/uH9d18g9136zsQPpsv1Ylh4ElW7/BCX8TBa4exSdKUTS7ishHYfNJ2k\nXKZMlws9aLCkS4weagvF83c9fMjoQ74E69BkqQDEdDlIBdcLA3fNSSdMuQIDAQAB\nAoGAGQehOWIoD+ZRc0jju0v902TeIlKL8C8tr6fy5mi1Lxpkz9JED11gttVp9sSG\nHAo8tF+sOtCJYyKoiUm6c4RM4sB1dSqqnaOQEkCpxEcuFMzHNaXzgFVNM6TNykO4\nV0anZLMEW4/3g4Yxkx4CRHUhhk+s/xlvWvkqwk8Z69woFsECQQDNU2YUAjNm0SJy\nHds3NxVieTR05dZEkcWVscNZiEVcZqvYc6Pz1ME6knrNFi6nany22Wk55YMHFXiE\nh3DCd/7vAkEA/iDE8g3TkAu78l5Yn1+ea+l/9eJbTRbJnQqep8I7VwN+9hPaGX49\nOOOunzM1triAFSpy8ZjYkq1buZZwLoLu1wJAGLAWbgF1vL8YrS/508HDyHtaW1Pn\nV4dPgphFLNa9wEZ4EyaUaBUExs4mBdLM+URMio/JnzSBdLCYNRcz764N8QJBAKXj\nhEyyI+HLFyRO3DElPQgag9JhsdHvxyqBjTHbg9r4SD+gk+XCV3q0fgAkcLLXW5z1\nedUmPnH5QoAyqQZjqD8CQBbJQ2v19z6gHiTXMJ560u9bTD0tJYuwvwGTD5EaW+nD\noH4Hp2POjAqF29CXlZpjCyhWOmPn7LMZgrTDSnDOS3I=\n-----END RSA PRIVATE KEY-----'

pycryptodome

你可以pycryptodome试试。当心,它意味着替代pycrypto. 如果您需要并行运行 pycrypto,则可以使用单独的独立包pycryptodomex

它从头开始实现所有加密原语(而不是依赖外部库),并提供了一个密钥构造方法,允许从组件构造一个密钥。如果打开,它还可以对输入的关键组件进行一致性检查