wie konvertieren von Objekt-IDS auf hex-strings
Ist es [nicht programmiersprachenspezifischen] Weg, um hex-Versionen von "Objekt identifiers"?
ex:
OID 1.2.840.10040.4.1: dsa
hex-string = 2a 86 48 ce 38 04 01
es scheint nicht zu sein, eine leicht zugängliche Liste für Sie. ich Suche für die OIDs verwendet X. 509-Zertifikate
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
CryptEncodeObjectEx
zu Dekodieren, die meisten kryptografischen Objekte inclusive-OIDs.Im Falle von OIDs, die Kodierung und die Dekodierung ist einfach schade, so können Sie dies manuell tun.
Beiden ersten Nummern 1.2 codiert wird mit ein wenig besonderer Weise. Für das Beispiel x ist.y-codiert 40*x+y. Im Fall von 1.2 haben wir 40*1+2 = 42 oder 0x2a.
Alle folgenden Zeichen werden interpretiert als 7-bit-zahlen, in denen das höchste bit (bit Nummer 7, wenn wir beginnen mit 0) ist 0 das byte ist die Letzte, und 1, wenn das bit ist nicht das Letzte. Zum Beispiel, 840 ist 0x348. Zu Kodieren, dies sollten wir nutzen, 2 bytes in der zuletzt gespeicherten 0x48. In der Vorgängerversion gespeichert werden soll, 0x3 mit einem zusätzlichen bit aus 0x48 (wegen der 7 bit codding und nicht 8-bit-encoding). Also sollten wir Kodieren 0x3*2=0x6 im ersten byte. Da 0x6, wird das nicht das Letzte byte in der Codierung der Ganzzahl (0x48 byte wird Folgen) wir sollten hinzufügen, 0x80, um den codierten Wert. Damit erhalten wir 0x80+0x6=0x86. Also 840 codiert wird als 0x86 und 0x48.
In der gleichen Weise 10040 ist 0x2738. Das Letzte byte ist 0x38 und die erste ist 0x27*2 (wegen der 7 bit codding): 0x27*2=0x4e. Da 0x4e ist nicht das Letzte byte sollten wir hinzufügen, 0x80, um den codierten Wert: 0x4e+0x80=0xce. So 10040 kodiert werden als zwei bytes 0xce und 0x38.
4 und 1 kodiert werden genauso 0x04 und 0x01.
So 1.2.840.10040.4.1 codiert werden sollten als 2a 86 48 ce 38 04 01, wie Sie bereits kennt.
All dies Lesen Sie in 8.19 von ITU-T X. 690 (ISO/IEC 8825-1)
AKTUALISIERT basierend auf dem Kommentar: Etwas ist falsch in Ihnen encoding/decoding-Programm. Die OID "1.2.840.113549.1.1.1" werden tun, dargestellt als
2A 86 48 86 F7 0D 01 01 01
und nicht als2a 86 48 83 f6 8d 01 01 01
wie du geschrieben hast. Um dies zu prüfen, können Sie folgende kleine C-Programm:Das Programm produziert folgende Ausgabe
06 09 2A 86 48 86 F7 0D 01 01 01
wobei das erste byte 0x06 des BER-Kodierung bedeutet OID-Datentyp, wird das nächste byte 0x09 bedeutet, dass die Daten, die Länge und die nächsten 9 bytes2A 86 48 86 F7 0D 01 01 01
sind die codierten OID 1.2.840.113549.1.1.1.Die vollständige Ausgabe des Programms ist
Haben Sie erklärt, wie zu machen Konvertierung für Werte zwischen 0-65536 (0xFFFF).
Könnten Sie erklären, Ihre Berechnung für höhere Werte ? wie 113549 ?
Habe ich es endlich. Danke. Ich schrieb die Reihenfolge der für die RSA-Codierung. (wenn RSADSI ist 113549)
113549 ist 1bb8d(Hexa)
als binary-format, 1bb8d ist 0001 1011 1011 1000 1001.
es ist 7-bit-Codierung, so dass, ausgedrückt als
00 0110 | 111 0111 | 000 1001
=> 0x06 | 0x77 | 0x0d
=> 0x06+0x80|0x77+0x80|0x0d
=> 0x86 0xf7 0x0d
====================================
0x86 | 0xf7 | 0x0d
Für
113549
Hexa:
1bb8d
binäre:
0001 1011 1011 1000 1101
Schritt 1: Gruppe Erstellen mit
7
bits:*0*0001 10 |11 1011 1 |000 1101
Schritt 2: zusätzliche bit für
8
bits (0
Hinzugefügt, in der nur rechts-und byte -1
Hinzugefügt, in alle anderen bytes):*1*000 0110 | *1*111 0111 | *0*000 1101
Schritt 3: Konvertieren von Binär in hexadezimal:
0x86 | 0xf7 | 0x0d