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!
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