Was ist los mit verschiedenen Hexadezimal-Codierschemata?

894
TheFuzzyFish

Ich arbeite also seit etwa einem Jahr mit Kryptographie und lerne so viel wie möglich über alles, was ich kann. Viele Dinge, auf die ich gestoßen bin (wie der hexadezimal [nicht ein Wort, sondern shh] kodierte Hauptschlüssel eines LUKS-Volumes oder der Modul eines RSA-Schlüssels) sind hexadezimal kodiert. Ich verstehe, dass Dezimalzahl eine ausgefallene Art ist, Basis 10 zu sagen, und Hexadezimalzahl ist eine ausgefallene Art, Basis 16 zu sagen, und ich verstehe, wie es in Zahlen ausgedrückt wird, aber es gibt ein paar Dinge, die ich nicht richtig einwickeln kann um:

  1. Wie kann ASCII oder UTF-8 (oder allgemeiner Klartext) in einem zahlenbasierten System kodiert werden?
  2. Ich habe bei meinen Unternehmungen zwei verschiedene Arten von Codierungsschemata bemerkt. Gibt es mehr Versionen? Warum?

Die beiden, die mir aufgefallen sind (beim Dekodieren von LUKS-Masterschlüsseln und beim Dekodieren von RSA-Modulen) sind merkwürdig. Mit dem LUKS-Master-Schlüssel erteile ich den Schlüssel, leite ihn an "xxd -r -p" weiter und spucke den eigentlichen Schlüssel aus, der in eine Datei gesteckt werden kann und zum Entsperren des Volumes ohne die Verwendung von Schlüsselslots dient. Die andere Version, die ich gesehen habe, ist, wenn ich einen RSA-Modul mit dem Anhang "ibase = 16;" in "bc" leite. Jede andere hexadezimale Sequenz, die ich mit "ibase = 16;" in BC gesendet habe, spuckt Zahlen und keine Buchstaben aus. "xxd -r -p" scheint traditionelles ASCII auszugeben.

Warum geben BC-Ausgabezahlen und xxd ASCII-Text aus?

Ich entschuldige mich, dass dies eine allumfassende Frage ist, aber wie ich bereits sagte, bin ich bei diesem Thema viel zu verwirrt, um normal zu sein.

-1

2 Antworten auf die Frage

0
TOOGAM

Der "tatsächliche Schlüssel" sind die binären Zeichen. Was Sie normalerweise in eine Datei schreiben, ist jedoch eine hexadezimale Darstellung.

xxd gibt aufgrund der Option -r anstelle von hexadezimalen Darstellungen ASCII-Text aus. Mit tatsächlichen Zeichen ist die Manpage mit "binary" gemeint.

ASCII ist im Grunde nur eine Liste von Zeichen in einer bestimmten Reihenfolge. Zuerst ein NULL-Zeichen, dann ein Anfangszeichen für die Kopfzeile, dann ein Zeichen für das Ende der Kopfzeile usw. (Siehe: ASCII-Diagramm . Code-Seite 437 (siehe: Die Wikipedia-Seite zu CP437 zeigt diese als Leerzeichen, eine Smiley-Umrisslinie und ein ausgefülltes Zeichen) Smiley, usw. Das 65. Zeichen von beiden ist der Großbuchstabe A.

Wenn das 65. Zeichen der Großbuchstabe A ist, können wir die Zeichen anhand ihrer Position im Diagramm nachverfolgen. Der Großbuchstabe A ist also Position 65, die Position 41 ist hexadezimal (oft in C-Schreibweise als 0x41 geschrieben). In dem oben erwähnten ASCII-Diagramm sehen Sie den Wert "41".

Wie kann ASCII oder UTF-8 (oder allgemeiner Klartext) in einem zahlenbasierten System kodiert werden?

Zahlen können in andere Zahlen umgewandelt werden, z. B. in andere Basen. Beispiel: 0x4169 entspricht 0x4100 + 0x69. Die 41 entspricht dem Großbuchstaben H und die 69 dem Kleinbuchstaben i. Ich bin nicht sicher, warum Sie bezweifeln würden, dass numerische Konversation möglich ist. Wenn dies immer noch unklar ist, erklären Sie es bitte erneut (möglicherweise durch eine andere Frage).

I have noticed 2 different kinds of encoding schemes in my ventures. Are there more versions? Why? 

Sicher. Warum? Weil es mehrere Softwareteile gibt, die von verschiedenen Personen entwickelt wurden. So wie es mehrere Zeichenstandards gibt (EBCDIC, ASCII, UTF-8, Unicode). Einige davon sind unbrauchbar (EBCDIC war sehr beliebt, bevor 8-Bit-Codeseiten mit ASCII immer populärer wurden), andere können von bestimmten Software-Tools leichter unterstützt werden. Computer sind jetzt so leistungsfähig, dass es nicht viele technische Einschränkungen gibt, die mehrere Standards erzwingen, aber unterschiedliche Programmierer machen aus verschiedenen Gründen unterschiedliche Dinge.

Konvertierungswerkzeuge existieren. Der Mangel an Standardisierung ist nämlich darauf zurückzuführen, dass keine stärkere / strengere / bessere Standardisierung erforderlich war. Wenn es einen überzeugenden Nutzen gibt, würden wahrscheinlich mehr Menschen eher versuchen, sich an größeren gemeinsamen Trends zu orientieren.

Warum geben BC-Ausgabezahlen und xxd ASCII-Text aus?

bcist ein Rechner. Ich würde eine numerische Ausgabe erwarten. xxd -rgibt ASCII-Text aus, da dies dafür dokumentiert ist. Der Sinn dieser Software besteht darin, ASCII-Text in (hexadezimal) numerische Zeichenfolgen zu übersetzen, die einfacher einzugeben sind, und numerische Zeichenfolgen in "binäre" / ASCII-Zeichen umzuwandeln, die für bestimmte Software tatsächlich nützlicher sind. Jedes Programm erfüllt seinen eigenen, unterschiedlichen Zweck.

Ich hoffe, dass diese Sammlung von Antworten dazu beiträgt, genügend Fragen zu beantworten, um die Dinge klarer zu machen. Ich weiß, dass Sie darauf anspielten, aber ich möchte darauf hinweisen, dass diese Frage ein bisschen katastrophal ist, weil es keine sehr klare Frage ist. Überlegen Sie sich also, ob Sie in neuen Fragen weitere Fragen stellen sollten. Es wird im Allgemeinen bevorzugt, pro Stack-Seite eine tatsächliche Frage zu stellen.

0
Scott

Teile Ihrer Frage ergeben keinen Sinn:

Jede andere hexadezimale Sequenz, die ich mit "ibase = 16;" in BC gesendet habe, spuckt Zahlen und keine Buchstaben aus.

Nun, die Standardausgabebasis für bcist dezimal:

$ echo 'ibase=16; 100' | bc 256  $ echo 'ibase=16; 1000' | bc 4096  $ echo 'ibase=16; 10000' | bc 65536 

Welche Briefe würdest du erwarten? Wenn Sie bcHexadezimalzahlen ausgeben möchten, müssen Sie die Ausgabebasis auf 16 setzen. Wenn jedoch die Eingabebasis und die Ausgabebasis gleich sind, ist die Ausgabe dieselbe wie die Eingabe (wobei die führenden Nullen entfernt werden):

$ echo 'obase=16; ibase=16; 100' | bc 100  $ echo 'obase=16; ibase=16; 007F' | bc 7F  $ echo 'obase=16; ibase=16; CAFE' | bc CAFE  $ echo 'obase=16; ibase=16; FACE' | bc FACE 

Wenn Sie diese eher sinnlose Übung machen möchten, müssen Sie obase=16; ibase=16oder sagen, da Zahlen, die danach eingegeben werden, als Hexadezimalzahlen interpretiert werden. Wenn Sie sagen, wird die Ausgangsbasis auf 22 (16 (Hex) = 10 (Hex)  + 6 (Hex) = 16 + 6 = 22) gesetzt.ibase=16; obase=10ibase=16ibase=16; obase=16

"xxd -r -p" scheint traditionelles ASCII auszugeben.

Entweder Sie geben xxdeine hexadezimale Darstellung von "traditionellem ASCII" Text oder Sie haben eine nicht standardisierte Definition von "traditionellem ASCII". Wie TOOGAM sagt, werden xxd -r"binäre" / ASCII-Zeichen ausgegeben, was eine spezielle Nomenklatur ist. Beachten Sie, dass das von TOOGAM verknüpfte „ASCII-Diagramm“ nur durch das Zeichen 7F geht und die Wikipedia-Seite zu ASCII sagt

… ASCII kodiert 128 festgelegte Zeichen in 7-Bit-Ganzzahlen…

auch im Bereich von 00 bis 7F. xxd -rgibt acht Bit ("binär") Zeichen aus. Dies ist eine Obermenge von Standard-ASCII. (Der Begriff Extended ASCII bezieht sich auf Acht-Bit-Kodierungen, aber es ist wahrscheinlich besser, diesen Satz aufzugeben, da Unicode die Landschaft durchdringt.) Da Acht-Bit-Zeichen ("binary") eine Obermenge von Standard-ASCII bilden, xxd -r können traditionelle ASCII-Zeichen ausgegeben werden ; zum Beispiel:

$ echo 464F4F0A | xxd -r -p FOO 

da 46 die hexadezimale Darstellung des ASCII-Codes für F (der 6. Buchstabe des Alphabets) ist, ist 4F die hexadezimale Darstellung des ASCII-Codes für O (den 15. Buchstaben des Alphabets, wobei F die Hexendarstellung von 15 ist) und 0A ist die hexadezimale Darstellung des ASCII-Codes für Newline. Aber

echo 000102030405067F | xxd -r -p 

gibt nicht druckbare ASCII-Steuerzeichen aus und

echo 80818283A0A1A2A3 | xxd -r –p 

und

echo E29885E29FB9F09F98BA0A | xxd -r –p 

gibt Bytes mit Werten über 7F aus. Das Verhalten (Aussehen) dieser Zeichen (falls vorhanden) wird von Ihrem Terminal und dessen Einstellungen bestimmt.