2016-04-07 6 views
2

Ich benutze Python cryptography Bibliothek und ich muss etwas mit RSA verschlüsseln. Es funktioniert alles, bis auf eine Sache.Extrahieren Modul n, privaten Exponenten und öffentlichen Exponenten in Python-Kryptographie-Bibliothek

Wenn ich Schlüssel erzeuge, muss ich Modulo n, öffentlichen Exponenten und privaten Exponenten in hexadezimaler Form erhalten, so dass ich sie in einer Datei im benutzerdefinierten Format speichern kann. Es ist nicht für eine reale Welt, ich mache es für eine Klassenaufgabe.

Ich suchte ganze cryptography Dokumentation RSA-und jede Methode wie get_modulus_or_exponents() oder irgendetwas nicht finden kann, die auch auf so etwas andeuten würden.

Die einzige Möglichkeit, die ich denken kann, diese Zahlen zu bekommen ist Schlüssel zu serialisiert, dann subprocess den openssl Befehl und es in einer Form wie folgt zu lesen:

Modulus (2048 bit): 
    00:98:10:23:16:ff:b6:f4:26:a2:42:a6:19:23:0e: 
    0f:27:4a:b9:43:3d:a0:4b:b9:1b:1a:57:92:dd:a8: 
    bc:5d:b8:6e:e6:7f:0f:2e:89:a5:77:16:d1:cf:44: 
    [...] 
    f3:0d:5b:90:6b:de:59:58:c9:f4:26:4a:61:b4:52: 
    21:1d 
Exponent: 65537 (0x10001) 

Parse es, und Extrakt benötigten Informationen.

Gibt es einen besseren Weg (vorzugsweise cryptography 's Werkzeuge) als diese Problemumgehung (habe ich etwas in docs verpasst?) Oder cryptography wirklich erlaubt keine andere Möglichkeit, benötigte Informationen zu erhalten?

EDIT: Dies ist Code, den ich Schlüssel zu generieren verwenden, um und verschlüsseln, im Grunde gleich wie docs Beispiel:

from cryptography.hazmat.backends import default_backend 
from cryptography.hazmat.primitives.asymmetric import rsa 

private_key = rsa.generate_private_key(public_exponent=65537, 
              key_size=self.key_size * 8, 
              backend=default_backend() 
              ) 
public_key = private_key.public_key() 
ciphertext = public_key.encrypt(message, padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA1()),algorithm=hashes.SHA1(),label=None)) 
+0

können Sie hinzufügen, wie Sie verschlüsseln? –

+0

Tatsächlich habe ich eine andere Problemumgehung gefunden, indem ich den Quellcode von 'cryptography' untersucht und private Methoden von' backend' aufgerufen habe, um auf diese Mitglieder zuzugreifen, aber das ist schlecht, schlecht, schlechte Praxis. Also, ich suche immer noch nach einer Antwort, vielleicht habe ich wirklich etwas in Docs verpasst. – dosvarog

+0

@PadraicCunningham Nichts besonderes, genauso wie in der Dokumentation, ich füge Code-Snippet in einer Minute hinzu. https://cryptography.io/en/latest/hazmat/primitives/asymmetric/rsa/#encryption – dosvarog

Antwort

2

Sie zugreifen können public_numbers() und private_numbers()

public_key.public_numbers() 
private_key.private_numbers() 

Eine gute Möglichkeit, mit was zu sehen ist verfügbar zu verwenden ist:

In [13]: [a for a in dir(public_key) if not a.startswith("_")] 
Out[13]: ['encrypt', 'key_size', 'public_bytes', 'public_numbers', 'verifier'] 

In [14]: [a for a in dir(private_key) if not a.startswith("_")] 
Out[14]: 
['decrypt', 
'key_size', 
'private_bytes', 
'private_numbers', 
'public_key', 
'signer'] 


In [15]: [a for a in dir(private_key.private_numbers()) if not a.startswith("_")] 
Out[15]: ['d', 'dmp1', 'dmq1', 'iqmp', 'p', 'private_key', 'public_numbers', 'q'] 

In [16]: [a for a in dir(public_key.public_numbers()) if not a.startswith("_")] 
Out[16]: ['e', 'n', 'public_key'] 

In [17]: [a for a in dir(private_key.private_numbers().public_numbers) if not a.startswith("_")] 
Out[17]: ['e', 'n', 'public_key'] 

Sie sehen yo Sie können tatsächlich auf alle Attribute zugreifen, die nur den privaten Schlüssel verwenden.