2017-12-29 8 views
0

Ich weiß, wie RSA-Modul und Exponent von öffentlichen Schlüssel mit openssl erhalten, aber jetzt habe ich es versucht, mit Python zu tun. Ich habe this gesehen und Schritte verfolgt.Erhalten RSA-Exponent und Modulus von öffentlichen Schlüssel mit Python

Angenommen, dies ist der öffentliche Schlüssel:

-----BEGIN PUBLIC KEY----- 
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCdZGziIrJOlRomzh7M9qzo4ibw 
QmwORcVDI0dsfUICLUVRdUN+MJ8ELd55NKsfYy4dZodWX7AmdN02zm1Gk5V5i2Vw 
GVWE205u7DhtRe85W1oR9WTsMact5wuqU6okJd2GKrEGotgd9iuAJm90N6TDeDZ4 
KHEvVEE1yTyvrxQgkwIDAQAB 
-----END PUBLIC KEY----- 

Zuerst öffentlichen Schlüssel von Base64 decodiert wird:

import base64 
bytearray = base64.b64decode("""MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCdZGziIrJOlRomzh7M9qzo4ibw 
QmwORcVDI0dsfUICLUVRdUN+MJ8ELd55NKsfYy4dZodWX7AmdN02zm1Gk5V5i2Vw 
GVWE205u7DhtRe85W1oR9WTsMact5wuqU6okJd2GKrEGotgd9iuAJm90N6TDeDZ4 
KHEvVEE1yTyvrxQgkwIDAQAB""") 
print(bytearray) 

Ausgang:

0\x81\x9f0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\x00\x03\x81\x8d\x000\x81\x89\x02\x81\x81\x00\x9ddl\xe2"\xb2N\x95\x1a&\xce\x1e\xcc\xf6\xac\xe8\xe2&\xf0Bl\x0eE\xc5C#Gl}B\x02-EQuC~0\x9f\x04-\xdey4\xab\x1fc.\x1df\x87V_\xb0&t\xdd6\xcemF\x93\x95y\x8bep\x19U\x84\xdbNn\xec8mE\xef9[Z\x11\xf5d\xec1\xa7-\xe7\x0b\xaaS\xaa$%\xdd\x86*\xb1\x06\xa2\xd8\x1d\xf6+\x80&ot7\xa4\xc3x6x(q/TA5\xc9<\xaf\xaf\x14 \x93\x02\x03\x01\x00\x01

Dann Byte Array wird in konvertiert Basis 16 (hexadezimal) string:

bytearray.encode('hex')

Ausgang:

30819f300d06092a864886f70d010101050003818d00308189028181009d646ce222b24e951a26ce1eccf6ace8e226f0426c0e45c54323476c7d42022d455175437e309f042dde7934ab1f632e1d6687565fb02674dd36ce6d469395798b6570195584db4e6eec386d45ef395b5a11f564ec31a72de70baa53aa2425dd862ab106a2d81df62b80266f7437a4c378367828712f544135c93cafaf1420930203010001

und für das Design, fügt sie ":" zwischen jeweils zwei Zeichen in der Zeichenfolge:

':'.join([ i+j for i,j in zip(bytearray[::2],bytearray[1::2])]) 

Ausgabe:

30:81:9f:30:0d:06:09:2a:86:48:86:f7:0d:01:01:01:05:00:03:81:8d:00:30:81:89:02:81:81:00:9d:64:6c:e2:22:b2:4e:95:1a:26:ce:1e:cc:f6:ac:e8:e2:26:f0:42:6c:0e:45:c5:43:23:47:6c:7d:42:02:2d:45:51:75:43:7e:30:9f:04:2d:de:79:34:ab:1f:63:2e:1d:66:87:56:5f:b0:26:74:dd:36:ce:6d:46:93:95:79:8b:65:70:19:55:84:db:4e:6e:ec:38:6d:45:ef:39:5b:5a:11:f5:64:ec:31:a7:2d:e7:0b:aa:53:aa:24:25:dd:86:2a:b1:06:a2:d8:1d:f6:2b:80:26:6f:74:37:a4:c3:78:36:78:28:71:2f:54:41:35:c9:3c:af:af:14:20:93:02:03:01:00:01

Aber leider kann ich nicht den letzten Schritt verstehen. Ich weiß, dass Ausgabe sowohl Exponent und Modulus enthält, aber es gibt andere Zeichen, die herausgefiltert werden (da sie nicht zurück in Basis 10 konvertiert werden können). Ich weiß auch, dass Hex-Darstellung oben auf ASN.1-Syntax basiert, so dass es einige bestimmte Offset in Hex-Darstellung geben sollte, wo diese beiden Werte angezeigt werden.

Was ist zu tun, um Modul und Exponent aus diesem Ergebnis zu erhalten?

Danke!

Antwort

0

Der öffentliche Schlüssel ist im Format ASN.1 SubjectPublicKeyInfo, in der Java-Welt auch als X509EncodedKeySpec bekannt. Viele Crypt-Pakete können ein solches Objekt direkt importieren.

Zum Beispiel mit PyCrypto und Cryptography.io das folgende Snippet

from Crypto.PublicKey import RSA 
key_encoded='''-----BEGIN PUBLIC KEY----- 
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCdZGziIrJOlRomzh7M9qzo4ibw 
QmwORcVDI0dsfUICLUVRdUN+MJ8ELd55NKsfYy4dZodWX7AmdN02zm1Gk5V5i2Vw 
GVWE205u7DhtRe85W1oR9WTsMact5wuqU6okJd2GKrEGotgd9iuAJm90N6TDeDZ4 
KHEvVEE1yTyvrxQgkwIDAQAB 
-----END PUBLIC KEY-----''' 


pubkey = RSA.importKey(key_encoded) 
print(pubkey.n) 
print(pubkey.e) 

from cryptography.hazmat.backends import default_backend 
from cryptography.hazmat.primitives import serialization 

pubkey2 = serialization.load_pem_public_key(
    key_encoded.encode('ascii'), 
    backend=default_backend() 
) 

print(pubkey2.public_numbers().n) 
print(pubkey2.public_numbers().e) 

110524622184298189406696366981362867320131527048683492811128204661745388510505145389459518039217549444918405620726988722254633562452576638635488354260221598432448974859895979017211032905988949400704082939941050902513120244660937339078367607684436944094809985731012813959774525636937965082155868293686780764307 
65537 
110524622184298189406696366981362867320131527048683492811128204661745388510505145389459518039217549444918405620726988722254633562452576638635488354260221598432448974859895979017211032905988949400704082939941050902513120244660937339078367607684436944094809985731012813959774525636937965082155868293686780764307 
65537 
2

Ich bin kein Experte auf diesem, aber ich denke, dass ...

letztes 6 Bytes in der Hex-Darstellung verwendet werden, um die Exponenten zu berechnen.

'02' -> dieses Byte zur Deklaration des Exponententyps, d. H. INTEGER.

'03' -> dieses Byte sagt, dass es 3 Byte lange Nummer ist.

'01: 00: 01 '-> diese 3 Bytes repräsentieren den Exponenten.

+0

produziert Sie richtig sind. Einen Exponenten zu erhalten wäre einfach, wenn man bedenkt, dass in der Mehrzahl der Fälle 2^16 + 1 sein Wert ist, aber das Erhalten des öffentlichen Moduls scheint wenig schwierig zu sein, da Größe und Länge der Primzahlen p und q, die den öffentlichen Modul n erzeugen, völlig zufällig sind. Obwohl ich denke, gibt es eine bestimmte Syntax in asn.1, die Exponent und Modulus deklariert. – ShellRox

Verwandte Themen