python - 将 RSA key 导入 Python

标签 python encoding cryptography rsa public-key

我正在尝试使用 RSA.importkey 将 RSA(公共(public)) key 导入到 Python 中,但我收到不支持 RSA Key 的消息。

这是我编写的代码:

f = open('pub.key','rb')
data = f.read()
imported = RSA.importkey(data)
f.close()

这是我尝试导入的 key 的屏幕截图: RSA_Public_Key

有人可以帮我吗?

enter image description here

[更新]:我做了更多研究,关键是 MS PUBLICKEYBLOB 格式,我猜它与 PyCrypto 不兼容?还有什么我可以用来导入这个

最佳答案

我认为 Python 的 Crypto.PublicKey 模块不支持 PUBLICKEYBLOB key ,但提取可用的内容并不困难。

由于您以图像形式提供数据 ( please don't ),我将向您展示该过程如何与 this key 一起使用。相反:

0000000: 0602 0000 00a4 0000 5253 4131 0008 0000  ........RSA1....
0000010: 0100 0100 7597 4c3b 8446 de2c 2af4 95a8  ....u.L;.F.,*...
0000020: 5dc0 cd6d dad7 d492 1e13 8234 6a70 8d8f  ]..m.......4jp..
0000030: 7cf7 0492 557f f1a2 27b2 9e41 ac90 8091  |...U...'..A....
0000040: 1893 c2b1 7bad 2bf3 ffaf db2b 51be 1da3  ....{.+....+Q...
0000050: 27e3 a757 085a bec1 1df6 04f8 1cbe 5bb1  '..W.Z........[.
0000060: 67fb e4c8 da75 0070 b117 7024 6c09 6374  g....u.p..p$l.ct
0000070: ac4b 0a1d 71ae 7fae 65b8 c586 79c5 7e9f  .K..q...e...y.~.
0000080: 9860 4c52 b929 62cb 2329 ed31 9174 7b7b  .`LR.)b.#).1.t{{
0000090: 0b26 1bf2 7d67 bfda 7a40 daf2 614d 94a5  .&..}g..z@..aM..
00000a0: 7dad 596b ad9e a33a 39c6 5b6e 9fd2 bb36  }.Yk...:9.[n...6
00000b0: b5f5 d265 f52c 30d8 c117 bdaf 2800 9620  ...e.,0.....(.. 
00000c0: 46a7 2d62 030c d7d0 75a0 0b07 ead4 1fca  F.-b....u.......
00000d0: e8d9 4edb 38f2 2675 cb12 a688 709b e1ea  ..N.8.&u....p...
00000e0: 32dc f871 7250 41e6 1781 6827 428e dfe5  2..qrPA...h'B...
00000f0: dea1 72d9 3bfb e59d 3011 6992 cd60 2be2  ..r.;...0.i..`+.
0000100: d546 3c28 cf9d 304a f7ad b9fb 0f91 fe2e  .F<(..0J........
0000110: be18 f1ce                                ....

您实际需要的唯一两条信息是公共(public)指数 e 和模数 n。您可以在 RSA1 token 后的 8 个字节处找到 e 作为 32 位小端数字。在本例中,010001000x10001 或 65537。 key 的其余部分是模数,也采用小端顺序。

这里有一些 Python 代码,可以将此信息转换为常规 key :

from Crypto.PublicKey import RSA
e = 65537L
n = int('75974c3b8446de2c2af495a85dc0cd6ddad7d4921e1382346a708d8f7cf70492557ff1a2'\
        '27b29e41ac9080911893c2b17bad2bf3ffafdb2b51be1da327e3a757085abec11df604f8'\
        '1cbe5bb167fbe4c8da750070b11770246c096374ac4b0a1d71ae7fae65b8c58679c57e9f'\
        '98604c52b92962cb2329ed3191747b7b0b261bf27d67bfda7a40daf2614d94a57dad596b'\
        'ad9ea33a39c65b6e9fd2bb36b5f5d265f52c30d8c117bdaf2800962046a72d62030cd7d0'\
        '75a00b07ead41fcae8d94edb38f22675cb12a688709be1ea32dcf871725041e617816827'\
        '428edfe5dea172d93bfbe59d30116992cd602be2d5463c28cf9d304af7adb9fb0f91fe2e'\
        'be18f1ce'.decode('hex')[::-1].encode('hex'), 16)
key_params = (n, e)
pub_key = RSA.construct(key_params)
print pub_key.exportKey()

这是输出:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzvEYvi7+kQ/7ua33SjCd
zyg8RtXiK2DNkmkRMJ3l+zvZcqHe5d+OQidogRfmQVBycfjcMurhm3CIphLLdSby
ONtO2ejKH9TqBwugddDXDANiLadGIJYAKK+9F8HYMCz1ZdL1tTa70p9uW8Y5OqOe
rWtZrX2llE1h8tpAetq/Z33yGyYLe3t0kTHtKSPLYim5UkxgmJ9+xXmGxbhlrn+u
cR0KS6x0YwlsJHAXsXAAddrI5PtnsVu+HPgE9h3BvloIV6fjJ6MdvlEr26//8yut
e7HCkxiRgJCsQZ6yJ6Lxf1WSBPd8j41wajSCEx6S1Nfabc3AXaiV9Cos3kaEO0yX
dQIDAQAB
-----END PUBLIC KEY-----

关于python - 将 RSA key 导入 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44056038/

相关文章:

python - 为什么 list(set([2,1,3,6,5,3,6,4])) 会自动对列表进行排序?

python - 哪个生产服务器用于 Cloud Run 中的 Python 应用程序?

PHP\uXXXX编码字符串转utf-8

python - subprocess.run() 参数编码

C# AES 和 RSA 文件加密 - 如何使用 IV?

python - pywintypes.com_error : (-2147221008, 'CoInitialize has not been called.',无,无)

python - 如何在 Python 中检索 pip 要求(卡住)?

c# - (new Utf8Encoding()).GetPreamble() 的前导为空 - 很奇怪

java - EC_SIGN_P256_SHA256 的 BouncycaSTLe 算法标识符

c# - Safari推送包: how to fix Apple's expired WWDR certificate