2017-05-18 10 views
1

Ich versuche, einen RSA (öffentlichen) Schlüssel in Python mit RSA.importkey zu importieren, aber ich bekomme RSA Key wird nicht unterstützt. HierRSA-Schlüssel in Python importieren

ist der Code, den ich geschrieben habe:

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

Hier ist ein Screenshot des Schlüssels, den ich zu importieren versuchen: RSA_Public_Key

Kann jemand bitte helfen Sie uns?

enter image description here

[UPDATE]: Ich habe etwas mehr Forschung getan und ist der Schlüssel in MS PublicKeyBlob Format, das ich denke, nicht kompatibel mit PyCrypto ist? Gibt es etwas, was ich verwenden können, um dieses

+0

Das ist nicht wie jedes Dateiformat sieht die ich kenne. Wie haben Sie diesen Schlüssel generiert? –

+0

Aus welcher Bibliothek stammt 'RSA'? – jwodder

+0

Es wurde von einer Malware mit Cryptexportkey API exportiert. (Windows) –

Antwort

2

Ich glaube nicht Crypto.PublicKey Modul unterstützt PublicKeyBlob Schlüssel des Python zu importieren, aber es ist nicht dass schwer etwas Brauchbares zu extrahieren.

Da Sie Ihre Daten in der Form eines Bildes zur Verfügung gestellt (please don't), werde ich Ihnen zeigen, wie der Prozess mit this key arbeitet stattdessen:

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 .&..}[email protected] 
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        .... 

Die einzigen zwei Stücke von Informationen, die Sie wirklich brauchen, sind die öffentlicher Exponent e und der Modul n. Sie finden e als 32-Bit-Little-Endian Nummer acht Bytes nach dem Token RSA1. In diesem Fall ist 010001000x10001 oder 65537. Der Rest des Schlüssels ist der Modulus, der ebenfalls in Little-Endian-Reihenfolge ist.

Hier ist ein bisschen Python-Code, der diese Informationen in einen regulären Schlüssel konvertieren:

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() 

Und hier ist der Ausgang:

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

Vielen Dank, das hat funktioniert. Wie importiere ich den privaten Schlüssel, der im selben Format exportiert wird? Ich nehme an, es braucht mehr als e und n? –

+0

@MarieWingLi Sie benötigen 'p' und' q' (die Faktoren von 'n', wobei' p'> 'q') und den privaten Exponenten' d', den Sie selbst berechnen müssen [erweiterter euklidischer Algorithmus] (https://crypto.stackexchange.com/q/5889/11718) aus 'e' und' phi' ('phi = (p-1) * (q-1)'). Dann rufe 'RSA.construct' mit' key_params' auf '(n, e, d, p, q)' auf und du bekommst einen privaten Schlüssel, –