Zurück
PX-1000 Kurzspruchgerät Sammler*142


Vorbetrachtung
Auf der Internetseite des Cryptomuseum wurde die PX-1000 in zwei Varianten vorgestellt.
Die erste Variante zeigt die PX-1000 mit einem Standard DES Chiffrieralgorithmus.
Die nachfolgende Variante, PX-1000cr, ist eine Variante die von der NSA programmiert wurde.
Beide werden hier betrachtet.

Zur Analyse kommen folgende Programme zur Anwendung:

Disassemblierung mittels:
f9dasm M6800/1/2/3/8/9 H6309 Binary/OS9/FLEX9 Disassembler V1.78
Copyright (c) 2000 Arto Salmi
Parts Copyright (c) 2001-2019 Hermann Seib
Parts Copyright (c) 2013 Colin Bourassa
Parts Copyright (c) 2014-2015 Rainer Buchty

Die Analyse, Kommentierung und Bewertung des disassemblierten Code,
wurde durch mich realisiert. Insbesondere die Ermittlung von Daten-
bereichen und Textabschnitten, waren anfänglich Hauptschwerpunkt,
auf deren Basis die weitere Struktur des Programmes ermittelt wurde.

Für die erste Analyse auch unabdingbar ist:
- PX-1000 Service-Manual
-         Circiut-Diagrams
-         Operating-Instructions
-         Manual
-         Broschure
- Hitatchi 8/16 Bit Microprocessor Data Book, 1991
- 68HC11 Reference Manual
- HD6301 HD6303 Series Handbook, 1989
- Kenntnisse der Programmierung von LCD-Controller der HD44xxx Serie.
- Für Detailfragen an der Hardware: Logic 2, (C) 2020 Saleae, Inc.

Genutzt wurde die Bachelor Arbeit von Ben Brücker.
Desweiteren die Veröffentlichung des Cryptomuseum und die Bereitstellung der EPROM-Inhalte
der beiden PX-1000 Geräte.
Die Möglichkeit der Verifikation mittels einer PX-1000cr des NVA-Ausstellung Harnekop.

Assembler-Debugger für die abschnittsweise Prüfung:
THRSim11 68HC11 Simulator (C) Harry Broeders

Zur Analyse des Assemblercodes wurden Abschnitte des Programmes mittels
des THRSim11 erfolgreich getestet.
Mit den Ergebnissen, die durch den THRSim11 verifiziert werden konnten,
wurde ein gleichwertes Softwareprogramm in C#-2010 sowie weitere Analyse-
Tools realisiert.
PX-Software
Software Simulation/Emulation

Und ganz wichtig: Zur Entspannung am Feierabend - ein Maximator der Augustiner Brauerei München.

In den weiteren Betrachtungen beziehe ich mich auf die Zusammenfassung
der Analyse des Maschinen-Code: PX-1000cr.PDF

PX-1000 DES
PX-1000 DES
Bei der Betrachtung und Analyse des implementierten DES, war es sehr hilfreich
das in der März und April Ausgabe der BYTE 1979, Volume 4 Number 3 Seite 66 ...74
und Number 4 Seite 100 .. 130 ff, die Portierung des DES von einem Intel 8294 System auf
ein 6502 System (KIM-1) samt der Datenstruktur beschrieben ist. Lit*6
Robert V Meushaw, 4188 Brittany Dr, Ellicott City MD 21043
Die Datenstruktur von IP bis S-Boxen sind 1:1 in der PX-1000 DES wiederzufinden.
PX-1000 DES SourceByte April 1979
PX-1000 und DES KIM-1 Sourcen
// Index Permutationstabelle
*F9CC: 00 3A        // 0x003a  Input addr PC-1
*F9CE: 00 C2        // 0x00c2
*F9D0: FA 82        // 0xFA82 PC-1 Permuationstabelle
*F9D2: 3F           // 0x3f Länge
*F9D3: 08           // Dest-Bits/Word
*F9D4: 07           // Dest # Bytes

*F9D5: 00 C2        // PC-2
*F9D7: 00 CA        //
*F9D9: FA C2        // PC-2 Permuationstabelle
*F9DB: 2F           // 0x2f Länge
*F9DC: 06           // Dest-Bits/Word
*F9DD: 07           // Dest # Bytes

*F9DE: 01 0E        // IP Permutationstabelle
*F9E0: 00 D8        //
*F9E2: FA 02        // IP Permutationstabelle
*F9E4: 3F           // 0x3f Länge
*F9E5: 08           // Dest-Bits/Word
*F9E6: 07           // Dest # Bytes

*F9E7: 00 DC        // E Permutationstabelle
*F9E9: 00 C2        //
*F9EB: FA F2        // E Permutationstabelle
*F9ED: 2F           // 0x2f Länge
*F9EE: 06           // Dest-Bits/Word
*F9EF: 07           // Dest # Bytes

*F9F0: 00 CA        // P Permutationstabelle
*F9F2: 00 CA        //
*F9F3: FB 22        // P Permutationstabelle
*F9F6: 1F           // 0x1f Länge
*F9F7: 08           // Dest-Bits/Word
*F9F8: 03           // Dest # Bytes

*F9F9: 00 D8        // IP-1 Permutationstabelle
*F9FB: 01 0E        //
*F9FD: FA 42        // IP-1 Permutationstabelle
*F9FF: 3F           // 0x3f Länge
*FA00: 08           // Dest-Bits/Word
*FA01: 07           // Dest # Bytes

// Bitmasken
*FB42: 00 80 40 20 10 08 04 02 01

// Data IP Permutationstabelle
*FA02: 38 39 3A 3B 3C 3D 3E 3F
*FA0A: 28 29 2A 2B 2C 2D 2E 2F
*FA12: 18 19 1A 1B 1C 1D 1E 1F
*FA1A: 08 09 0A 0B 0C 0D 0E 0F
*FA22: 40 41 42 43 44 45 46 47
*FA2A: 30 31 32 33 34 35 36 37
*FA32: 20 21 22 23 24 25 26 27
*FA3A: 10 11 12 13 14 15 16 17

// Data IP-1 Permutationstabelle, IP(Inverse)Table
*FA42: 0B 0F 0A 0E 09 0D 08 0C
*FA4A: 13 17 12 16 11 15 10 14
*FA52: 1B 1F 1A 1E 19 1D 18 1C
*FA5A: 23 27 22 26 21 25 20 24
*FA62: 2B 2F 2A 2E 29 2D 28 2C
*FA6A: 33 37 32 36 31 35 30 34
*FA72: 3B 3F 3A 3E 39 3D 38 3C
*FA7A: 43 47 42 46 41 45 40 44

// PC-2 Permutationstabelle
*FAC2: 24 0C 44 36 35 16 0F 34
*FACA: 27 1D 2E 45 26 2C 0E 3E
*FAD2: 25 14 1F 1E 0D 1C 46 2D
*FADA: 10 29 22 1B 38 41 40 13
*FAE2: 20 21 1A 3A 11 2A 30 39
*FAEA: 23 18 28 08 42 19 0A 31

// Select E Permutationstabelle
*FAF2: 08 43 3B 33 2B 23 2B 23
*FAFA: 1B 13 0B 42 0B 42 3A 32
*FB02: 2A 22 2A 22 1A 12 0A 41
*FB0A: 0A 41 39 31 29 21 29 21
*FB12: 19 11 09 40 09 40 38 30
*FB1A: 28 20 28 20 18 10 08 43

// Data P Permutationstabelle
*FB22: 0B 20 19 32 30 33 29 1A
*FB2A: 09 18 1B 43 31 42 40 10
*FB32: 11 3B 12 28 13 3A 39 08
*FB3A: 0A 23 21 2B 2A 22 38 41

// PC-1 Permuationstabelle
*FA82: 00 00 00 00 20 21 22 23
*FA8A: 28 29 2A 2B 2C 2D 2E 2F
*FA92: 30 31 32 33 34 35 36 37
*FA9A: 38 39 3A 3B 3C 3D 3E 3F
*FAA2: 00 00 00 00 24 25 26 27
*FAAA: 18 19 1A 1B 1C 1D 1E 1F
*FAB2: 10 11 12 13 14 15 16 17
*FABA: 08 09 0A 0B 0C 0D 0E 0F

// S-Box Tabelle; Seldat (Select S1-S8 Data)
*FB4B: EF 03 41 FD D8 74 1E 47
*FB53: 26 EF FB 22 B3 D8 84 1E
*FB5B: 39 AC A7 60 62 C1 CD BA
*FB63: 5C 96 90 59 05 3B 7A 85
*FB6D: 40 FD 1E C8 E7 8A 8B 21
*FB73: DA 43 64 9F 2D 14 B1 72
*FB7B: F5 5B C8 B6 9C 37 76 EC
*FB83: 39 A0 A3 05 52 6E 0F D9
*FB8B: A7 DD 0D 78 9E 0B E3 95
*FB93: 60 36 36 4F F9 60 5A A3
*FB9B: 11 24 D2 87 C8 52 75 EC
*FBA3: BB C1 4C BA 24 FE 8F 19
*FBAB: DA 13 66 AF 49 D0 90 06
*FBB3: 8C 6A FB 91 37 8D 0D 78
*FBBB: BF 49 11 F4 23 E5 CE 3B
*FBC3: 55 BC A2 57 E8 22 74 CE
*FBCB: 2C EA C1 BF 4A 24 1F C2
*FBD3: 79 47 A2 7C B6 D9 68 15
*FBDB: 80 56 5D 01 33 FD F4 AE
*FBE3: DE 30 07 9B E5 83 9B 68
*FBEB: 49 B4 2E 83 1F C2 B5 7C
*FBF3: A2 19 D8 E5 7C 2F 83 DA
*FBFB: F7 6B 90 FE C4 01 5A 97
*FC03: 61 A6 3D 40 0B 58 E6 3D
*FC0B: 4D D1 B2 0F 28 BD E4 78
*FC13: F6 4A 0F 93 8B 17 D1 A4
*FC1B: 3A EC C9 35 93 56 7E CB
*FC23: 55 20 A0 FE 6C 89 17 62
*FC2B: 17 62 4B B1 B4 DE D1 87
*FC33: C9 14 3C 4A 7E A8 E2 7D
*FC3B: A0 9F F6 5C 6A 09 8D F0
*FC43: 0F E3 53 25 95 36 28 CB
Byte 04/1979
Byte 04/1979
Das Senden- bzw. Empfangen, über den Akustikkoppler, erfolgt in einem Sonderderformat:

Der Sendungskopf wird mit 300 Baud, Datenformat 8bit, Parität Even, 2 Stopp-Bit
und das Chiffrat wird mit 600 Baud, bei gleichen Datenformat 8E2, gesendet.
Beim DUMP sind die Geschwindigkeiten beim Sendungskopf 300 Baud und den
gespeicheten Texten 1200 Baud.
Eine weitere Besonderheit sind die Frequenzen, entgegen der V.23 Regelungen.
Entsprechend der Regelung für 600 Baud ist für die 1 eine Frequenz von 1300 Hz und für
die 0 1700 Hz definiert. Das gilt hier für die Geschwindigkeiten, 300, 600 und 1200 Baud.
In den Regelungen zur V.23 ist für die Geschwindigkeit von 1200 Baud sind die Frequenzen
von 1300 Hz und 2100 Hz festegelegt, 300 Baud wird nicht erwähnt.
Impulsbild der seriellen Aussendung
Bild oben: Gesamtsendung
Bild mitte: Kopf-Datei
Bild unten: Chiffrat
Audio-Beispiel
DES Akustikkoppler
DES Akustikkoppler
Akustikkoppler
Aufbau des gesendeten Geheimtextes:

Kopf-Daten: 4 byte:

0x01, 0x80, 0x18, 0x4d

0x01 ist die Blocknummer, erster Textblock
0x8018 ist das Kennzeichen Chiffrat + Länge des Chiffrates ohne 3 byte Prüfsumme
0x4d steht für Chiffrat, 0x48 ist das Kennzeichen für DUMP

Chiffrat: 27 Zeichen, 20 chiffrierte A:

0x01, 0xb5, 0x7f, 0xc3, 0xf9, 0x74, 0xb8, 0x3b,
0x06, 0x33, 0xcc, 0x66, 0x5e, 0xb1, 0xf6, 0x5e,
0xf3, 0x2d, 0x72, 0xca, 0x7c, 0x39, 0x14, 0xd2,
0xd9, 0xa6, 0x44

Zuordnung GTX zum Klartext und dem Prüfbyte:
GTX Teil1: 0x01, 0xb5, 0x7f, 0xc3, 0xf9, 0x74, 0xb8, 0x3b
Klartext:  "(AAAAAAA"
Prüfsumme: 0x01 ⊕ 0xb5 ⊕ 0x7f ⊕ 0xc3 ⊕ 0xf9 ⊕ 0x74 ⊕ 0xb8 ⊕ 0x3b
           = 0x06

GTX Teil2: 0x33, 0xcc, 0x66, 0x5e, 0xb1, 0xf6, 0x5e, 0xf3
Klartext:  "AAAAAAAA"
Prüfsumme: 0x33 ⊕ 0xcc ⊕ 0x66 ⊕ 0x5e ⊕ 0xb1 ⊕ 0xf6 ⊕ 0x5e ⊕ 0xf3
           = 0x2d

GTX Teil3: 0x72, 0xca, 0x7c, 0x39, 0x14, 0xd2, 0xd9, 0xa6
Klartext:  "AAAAA" 0x8d  0x00  0x00
Prüfsumme: 0x72 ⊕ 0xca ⊕ 0x7c ⊕ 0x39 ⊕ 0x14 ⊕ 0xd2 ⊕ 0xd9 ⊕ 0xa6
           = 0x44

Das Zeichen "(" und "0x8d" werden von der Software erzeugt und chiffriert.
"0x8d" entspricht "NEW LINE" und wird im Programm auch als Kennzeichen für
das Textende verwendet.
Nach dem Dechiffrieren werden diese nicht im Display dargestellt.

Zur Chiffrierung und Dechiffierung mittels DES wird der Modus "ECB" angewendet.
Nach dem Entfernen der Prüfbytes können die Texte mittels CrypTool 2.1 de-
chiffriert werden.
Der hier verwendete Schlüssel lautet: "AAAAAAAAAAAAAAAA", der in der PX-1000
in "0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11" umgewandelt wird.


Analyse der Passwort-Verarbeitung
Das Passwort, das die Grundlage des Chiffrierschlüssels ist, wird in zwei Abschnitten
zusammengefasst.

Im ersten und im zweiten Abschnitt, werden aus den 7bit ASCII-Zeichen nur die unteren 4bit
extrahiert. Was zur Folge hat das aus den 7bit nur 4bit zur Schlüsselbildung verwendet werden.
Daraus ergibt sich das von den 127 möglichen Zeichen nur 16 Zeichen pro Byte genutzt werden.
Die Größe des Schlüssels beträgt damit 264 bzw. 1,85*1019.

Für die Prüfung und Berechnung wurde in die Speicherzellen 0x00D6 bis 0x00E5 Zufallsfolgen,
via C#, eingetragen.

Betrachtet von der ASCII Tabelle sind dann folgende Zeichen gleichbedeuten:
Umwandlung des Zeichensatz
0x000x010x020x030x040x050x060x070x080x090x0A0x0B0x0C0x0D0x0E0x0F
0x02Ā0x03ā0x04Ä0x05Ö0x0DNL
0x20 0x21!0x22''0x23#0x24$0x25%0x26&0x27'0x28(0x29)0x2A*0x2B+0x2C,0x2D-0x2E.0x2F/
0x3000x3110x3220x3330x3440x3550x3660x3770x3880x3990x3A:0x3B;0x3C<0x3D=0x3E>0x3F?
0x40@0x41A0x42B0x43C0x44D0x45E0x46F0x47G0x48H0x49I0x4AJ0x4BK0x4CL0x4DM0x4EN0x4FO
0x50P0x51Q0x52R0x53S0x54T0x55U0x56V0x57W0x58X0x59Y0x5AZ0x5B[0x5C\0x5D]0x5EÜ
0x60£0x61a0x62b0x63c0x64d0x65e0x66f0x67g0x68h0x69i0x6Aj0x6Bk0x6Cl0x6Dm0x6En0x6Fo
0x70p0x71q0x72r0x73s0x74t0x75u0x76v0x77w0x78x0x79y0x7Az0x07Bä0x7Cö0x7Eü0x7FØ
Das bedeutet selbst für komplexe Passwörter mit der festgelegten Passwort-Länge von 16 Zeichen:

Sa3UnDCh)f&RiE"$

ergibt in der Umwandlung z. B:

SASUNDCHIFFRIERD

Im RAM, von Speicherzelle 0x0151 bis 0x0160, wird das Passwort entsprechend dargestellt:

S     A     S     U     N     D     C     H     I     F     F     R     I     E     R     D
0x03, 0x01, 0x03, 0x05, 0x0e, 0x04, 0x03, 0x08, 0x09, 0x06, 0x06, 0x02, 0x09, 0x0e, 0x02, 0x04

Nach der Abarbeitung der Passwort-Folge, Abbildung Seite 2 "Passwort-Verarbeitung", werden
in den Speicherzellen die Werte abgespeichert:
0x00750x00760x00770x00780x00790x007A0x007B0x007C
Hex: 0x0F, 0x1E, 0x2D, 0x3C, 0x4B, 0x5A, 0x69, 0x78, 0x87, 0x96, 0xA5, 0xB4, 0xC3, 0xD2, 0xE1, 0xF0
Die Werte sind immer ein Vielfaches von 15, dezimal.
Wichtig für die nachfolgende Betrachtung des Chiffrieralgorithmus ist das, die in den
Speicherzellen 0x0075 bis 0x007C, eingeschrieben Werte als Konstanten betrachtet werden
können. Diese werden nur überschrieben, wenn das Passwort geändert wird.

nicht anders verhält es sich mit dem Endergebnis des ersten Teiles der Funktion:
0x007D0x007E0x007F0x0080
Hex: 0x0F, 0x1E, 0x2D, 0x3C, 0x4B, 0x5A, 0x69, 0x78, 0x87, 0x96, 0xA5, 0xB4, 0xC3, 0xD2, 0xE1, 0xF0
Ergebnis ist immer ein Vielfaches von 15, dezimal
Die Ergebnisse im ersten Teil, in den Speicherzellen 0x0075 bis 0x0080 sind immer
ein Vielfaches von 15, dezimal.

Das Ergebnis des zweiten Teils ist auch trivial:
0x008A0x008B0x008C0x008D0x008E0x008F0x00900x00910x00920x00930x00940x00950x00960x00970x00980x0099
Hex: 0x0F, 0x1E, 0x2D, 0x3C, 0x4B, 0x5A, 0x69, 0x78, 0x87, 0x96, 0xA5, 0xB4, 0xC3, 0xD2, 0xE1, 0xF0
In Abhängigkeit von dem Ergebnis der Decoder-Funktion0xFF
Durch die Decoder-Funktion und der Maskierung des Passwortes sind die Speicherwerte immer:
4bit High = Invertierte 4bit LOW
4bit Low unverändert.

In der Tabelle sind entsprechend die Ergebnisse dargestellt:
0x000x010x020x030x040x050x060x070x080x090x0A0x0B0x0C0x0D0x0E0x0F
Die höherwertigen 4bit in der ersten Zeile spielen keine Rolle
0xF00xE10xD20xC30xB40xA50x960x870x780x690x5A0x4B0x3C0x2D0x1E0x0F
Die Möglichkeiten des Decoders, werden dadurch nicht genutzt.
Von den 64 möglichen Varianten werden nur 16 benutzt.
Für die Suche nach der Hintertür sind hier folgende Punkte interessant:
- Maskierung des Passwortes, Filterung der unteren 4 Bit,
- die Speicherzellen 0x0075 bis 0x007C werden nach der Passwort-Verarbeitung
  nicht mehr verändert und werden im Abschnitt Rundenschlüssel 2 genutzt,
- Verdichten und Filtern der Werte im Speicherbereich 0x007D bis 0x0080,
- Umkodierung des Passwortes in die Speicherbereiche 0x008A bis 0x0098,
- weiteres Verkürzen des Passwortes von 16 auf 15 byte,
- durch die erste Festlegung das in der Speicherzelle 0x0099 der Wert 0xFF eingeschrieben wird.

Zeichensatz der PX-1000
Abbildung des Zeichensatzes der PX-1000, sie ist für die Chiffrierung und Dechiffrierung
nicht bedeutend.
Für die Ausgabe auf dem LCD und der Chiffrierung und Dechiffrierung wird,
entsprechend dem 7-Bit ASCII-Zeichensatz, das höherwertige Bit ausgeblendet.
Bei der Ausgabe auf dem Drucker, wie Dargestellt, wird entsprechend der Parity gesetzt.

 RAW: E1 E2 63 E4 65 66 E7 E8 69 6A EB 6C ED EE 6F F0 71 72 F3 74 F5 F6 77 78 F9 FA
 Txt:  a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z

 RAW: 41 42 C3 44 C5 C6 47 48 C9 CA 4B CC 4D 4E CF 50 D1 D2 53 D4 55 56 D7 D8 59 5A
 Txt:  A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z

 RAW: B1 B2 33 B4 35 36 B7 B8 39 30 2D 3A BB 2E AC 8D
 Txt:  1  2  3  4  5  6  7  8  9  0  -  :  ;  .  , wr/zv

 RAW: 21 22 A3 24 82 84 05 DE 28 BD 2B 3C 3F AF DB                    // shift left
 Txt:  !  "  #  $  Ā  Ä  Ö  Ü  (  =  +  <  ?  /  [

 RAW: C0 A6 60 AA 03 7B FC 7E A9 FF A5 BE 27 5C DD                    // shift right
 Txt:  @  &  £  *  ā  ä  ö  ü  )  Ø  %  >  '  \  ]

Die Klartexte sind im Speicher dementsprechend abgespeichert.

Analyse des ersten Teil der Erzeugung des Rundenschlüssels

Die Substitutionstabelle, 0xFEDB, mit der UND-Verknüpfung sowie deren XOR-Verknüpfung mit dem
nachfolgenden Wert erzeugt eine Byte-Folge mit einer Länge von 32 byte.
Die kaskadierte Bearbeitung der Speicherinhalte sorgt für eine schrittweise Veränderung der Speicherinhalte.
In der Literatur wird diese Arbeitsweise auch polynome Substraktion genannt.
0x008A0x008B0x008C0x008D0x008E0x008F0x00900x00910x00920x00930x00940x00950x00960x00970x00980x0099
Tabelle: Kaskaden-Funktion
0xC30xB40x1E0x690x780xB40x960xE10xD20x690x0F0x1E0x690x0F0x0F0xFF
0x930xB40x1E0x690x780xB40x960xE10xD20x690x0F0x1E0x690x0F0x0F0xFF
0x930x290x1E0x690x780xB40x960xE10xD20x690x0F0x1E0x690x0F0x0F0xFF
0x930x290x6C0x690x780xB40x960xE10xD20x690x0F0x1E0x690x0F0x0F0xFF
0x930x290x6C0x960x780xB40x960xE10xD20x690x0F0x1E0x690x0F0x0F0xFF
0x930x290x6C0x960xb40xB40x960xE10xD20x690x0F0x1E0x690x0F0x0F0xFF
0x930x290x6C0x960xb40x280x960xE10xD20x690x0F0x1E0x690x0F0x0F0xFF
0x930x290x6C0x960xb40x280x6C0xE10xD20x690x0F0x1E0x690x0F0x0F0xFF
0x930x290x6C0x960xb40x280x6C0x970xD20x690x0F0x1E0x690x0F0x0F0xFF
0x930x290x6C0x960xb40x280x6C0x970xA00x690x0F0x1E0x690x0F0x0F0xFF
0x930x290x6C0x960xb40x280x6C0x970xA00xC20x0F0x1E0x690x0F0x0F0xFF
0x930x290x6C0x960xb40x280x6C0x970xA00xC20x4A0x1E0x690x0F0x0F0xFF
0x930x290x6C0x960xb40x280x6C0x970xA00xC20x4A0x790x690x0F0x0F0xFF
0x930x290x6C0x960xb40x280x6C0x970xA00xC20x4A0x790x930x0F0x0F0xFF
0x930x290x6C0x960xb40x280x6C0x970xA00xC20x4A0x790x930x0F0x0F0xFF
0x930x290x6C0x960xb40x280x6C0x970xA00xC20x4A0x790x930x0F0x1F0xFF
0x930x290x6C0x960xb40x280x6C0x970xA00xC20x4A0x790x930x0F0x1F0xAE
0x320x290x6C0x960xb40x280x6C0x970xA00xC20x4A0x790x930x0F0x1F0xAE
:
0x320x560xD90x280x6D0x500x880x3F0x010xC00xD50xF70x360x5E0x3A0xAE
Die letzte Zeile der Tabelle zeigt das Speicherabbild nach den 32 Runden, die der Rundenschlüssel 1
für jedes zu de- bzw. chiffrierende Zeichen durchläuft.
Es wird also die Speicherzelle 0x008A schrittweise mit den Werten der Substitutionstabelle 0xFEDB verknüpft,
in der Reihenfolge: 06 80 60 82 CC 2B 4B C3 CF 7B 18 E0 0C 78 0A 0B 06 80 60 82 CC 2B 4B C3 CF 7B 18 E0 0C 78 0A 0B

Der Teilabschnitt "Register schieben rechts" mit der XOR Verknüpfung:
Die anschließende Maskierung mit 0x55 erzeugt immer Werte deren Bit 0, 2, 4 und 6 auf 1 oder 0 stehen.
Also: 0, 1, 4, 5, 10, 11, 14, 15, 40, 41, 44, 45, 50, 51, 54, 55

Im weiteren "Register schieben links" mit der UND-Verknüpfung:
erzeugt, wie bei dem vorherigen Teil, Werte deren Bit 1, 3, 5 und 7 auf 1 oder 0 gesetzt werden.

Im Anschluß werden die beiden Teilabschnitte über ein ODER Verknüpft. Die ein komplettes
Abbild möglicher Bits haben können. Im Bereich von 0x00 bis 0xFF.

Die Ergebnisse werden in die Speicherzellen 0x008A bis 0x0099 geschrieben.

Es bildet die Grundlage für die im Rundenschlüssel 2 erfolgte Schlüsselbildung mittels
Substitution über die Tabellen 0xFE5B bis 0xFEDA.

Analyse des zweiten Teils der Erzeugung des Rundenschlüssels

Aus den erzeugten Byte-Folgen, die Speicherzellen 0x0075 bis 0x0099, wird im
ersten Abschnitt eine Substitution durchgeführt.

Über den High-Teil eines Bytes sowie dem Low-Teil des gleichen Bytes wird
auf Byte der Substitutionstabelle gezeigt, den Speicherzellen 0xFE5B bis 0xFE9A.
Die Substitutionstabelle 0xFE5B bis 0xFE9A stellt eine Permutationstabelle dar.
Die Anschließende OR-Verknüpfung setzt die zwei Substitute (Low) zu einem
neuen Wert zusammen die in High-Wert fest 0 und im Low-Wert 0 ... f betragen kann.
Der High-Wert des Byte wird über die XOR-Funktion aus den High-Wert des nach der
Passwort-Verarbeitung festen Werten, der Speicherzellen 0x0079 bis 0x007C, bestimmt.
Der Low-Wert ist der ermittelte Wert aus der Substitution der Permutationstabelle
XOR-Verknüpft mit den festen Low-Werten der Speicherzellen 0x0079 bis 0x007C.

Die in der Substitution verwendeten Speicherzellen, sind wie oben beschrieben,
0x0075 bis 0x007C, Konstanten. Das hat Auswirkungen auf die Ergebnisse der
weiteren Verknüpfungen. Betrachten wir uns das Ausgabeergebnis der ersten
Substitution:
- nach der OR-Verknüpfung von zwei 4-bit Werten wird das Ergebnis XOR-verknüpft
  mit der Konstante aus der Speicherzelle 0x007C,
- die Ausgabe der OR-Verknüpfung kann nur Werte im Bereich von 0x00 bis 0x0F
  annehmen,
- die XOR-Verknüpfung sorgt dafür das im Ergebnis der höherwertige Teil des
  Bytes den Wert der Konstante der Speicherzelle 0x007C annimmt,
  Bsp.: 0x0E XOR 0xA5 = 0xAB,
- betrachtet man jetzt die Decoder-Tabelle dann kann man auf alle drei Werte
  rückschließen:
  . das Ergebnis 0xAB führt zur Aussage das die Konstante 0xA5 lauten muß,
    daraufhin kann man rückwirkend 0xAB XOR 0xA5 = 0x0E berechnen.

Das Ergebnis wird in den Speicherzelle 0x0086 bis 0x0089 abgelegt.
Hier liegt ein Angriffspunkt, da in den Zellen 0x0086 bis 0x0089 die High-Werte
bekannte Größen - aus der Passwort-Verarbeitung - sind und der Low-Wert
entsprechend der Decoder-Tabelle ermittelt werden kann.

Im zweiten Teil erfolgt ebenfalls eine Substitution, wobei die Eingangsparameter
das Bit 7 der Speicher- 0x0083 bis 0x0089 Byte sind.
Im weiteren werden aus der Substitution, bezeichnet mit:
 Register A = 0xFE9B + B + Runde Nr. 1 ... 8
aus den Bytes wird nur ein Bit extrahiert das dann im Byte mit der nachfolgenden
doppelten XOR Verknüpfung überführt wird.
Es könnte als 8 Runden Feistel interpretiert werden.

Die doppelte Verknüpfung des Substituts mit den Speicherzellen 0x0082 und 0x0086
führt nicht zur Verbesserung.

Das anschließende rotierende Register der das erzeugte Additionsbyte, je nach
Anzahl des chiffrierten Textes Modulo 8, stellt eine Verschleierung dar. Wenn ein
Zyklus auftritt wird dieser durch die Rotation nur verschleiert - voraussgesetzt der
Zyklus ist ungerade. Ist dagegen der Zyklus gerade ist dieser trotz der Rotation
erkennbar.

Chiffrierung und CFB

Das Klartextzeichen bzw. zu dechiffrierende Geheimtextzeichen wird über das XOR
chiffriert bzw. dechiffriert. Entsprechend den Betriebsmodi wird das chiffrierte
Zeichen in das Register 0x0081 eingeschrieben. Beim Dechiffrieren wird das Geheim-
textzeichen zuerst in das Register 0x0081 eingeschrieben und dann anschließend
die folgenden Daten dechiffriert.

Jetzt kommen wir noch zu einer Besonderheit:
Das erste und das letzte chiffrierte Zeichen ist kein Zeichen des eingegebenen
Klartextes! Es handelt sich um ein Zeichen das vor dem ersten Klartextzeichen
im Speicher steht. Das ersten Zeichen ( = 0x28, und das letzte Zeichen
-wr/zv- = 0x0d.
Somit ist das Klartext- und chiffrierte Zeichen bekannt und es handelt sich bei
dem ersten und letzten Zeichen um ein Geheimtext-Klartext-Kompromittierung.
Sendet man nicht das erste Zeichen, kommt es bei der Dechiffrierung, bedingt
durch den CFB Betriebsmodus, zu keinem sinnvollen Klartext. Fehlerfortpflanzung.
Es liese sich anhand des letzten Zeichen eine Dechiffrierung trotzdem durchführen.

Aufbau des gesendeten Geheimtextes:

Kopf-Daten: 16 byte 0x00

Start-Block: 4 byte 0xFF

Chiffrat: 22 Zeichen ( 1 * "(", 20 * "A", 1 * "0x0d",
das erste und letzte Zeichen wird von der PX erstellt.

Fuß-Daten: 32 byte 0x04

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff ff ff ff
7b bc f8 50 7c 42 cd d0 50 8a 0e 43 74 8b d8 b4 e3 cb e8 36 a4 37
04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04

0x7b == dechiffrierter Klartext 0x28
0xbc 0xf8 0x50 0x7c 0x42 0xcd 0xd0 0x50 0x8a 0x0e |  entspricht dechiffriert
0x43 0x74 0x8b 0xd8 0xb4 0xe3 0xcb 0xe8 0x36 0xa4 |  20 mal A
0x37 == dechiffrierter Klartext 0x0d


PX-1000 Varianten und ihre Chiffrieralgorithmen
PX-1983
PX-1984
PX-1988
PX-1993
PX-1000
Baujahr1983198419881993
FirmaTEXT LITEWEST-TECWEST-TECTEXTLITE
Softwareversion1983V21000F/C1CRYPT/C
Textspeicher7400740073557366
ChiffrierverfahrenDESNSA
Startadr.0xe0000xe0000xc0000xc000
Programmgröße8kbyte8kbyte16kbyte16kbyte
BordH Rev 4F Rev 2
CPUHD6303RP
RAMHM6264LP-15
EPROM27C6427C6427C256
Latch74HC373PX-507
1-8 Decoder74HC138PX-506
NAND GateMC74HC00PX505
ModemTCM3101JTCM3105N
Spannungsregler -5VTCL7660CPA
Über- UnterspannungswächterTCL7665BCPA
Mikrofon-VerstärkerM51304LTA7330P
CPU Takt4 MHz
System Takt1 MHz
Modem Takt4,4336 MHz
LCDHD-44xx compatible
ProtokollV.23
Serielles Protokoll8E27E2
Geschwindigkeit300/1200 Baud600 Baud

Index-, Permutations- und Substitutionstabellen,
sind in allen Varianten, 1984 bis 1993, identisch.
Permutationstabelle
06 0A 01 02 0E 07 08 09 0C 04 03 0F 0B 00 05 0D
02 07 00 05 0F 03 01 09 0E 0D 0B 08 0C 0A 04 06
09 01 03 0C 02 00 0A 0E 0D 06 0B 07 05 08 0F 04
0B 06 09 00 05 0E 0F 08 04 0C 01 0D 02 07 03 0A

Substitutions-Tabelle
96 4B 65 3A AC 6C 53 74 78 A5 47 B2 4D A6 59 5A
8D 56 2B C3 71 D2 66 3C 1D C9 93 2E A9 72 17 B1
B4 E4 A3 4E 27 5C 8B C5 E8 95 E1 D1 87 B8 1E CA
1B 63 D8 2D D4 9A 99 36 8E C6 69 E2 39 35 6A 9C

Index+
0B 0A 78 0C E0 29 7B CF C3 4B 2B CC 82 60 80 06
0B 0A 78 0C E0 29 7B CF C3 4B 2B CC 82 60 80

Aussendung der PX-1000 Varianten, 1984 bis 1993
Bei diesen PX-1000 werden die Regelungen des V.23 eingehalten.
Die komplette Sendung erfolgt mit der Geschwindigkeit von 600 Baud.
Impulsbild der seriellen Aussendung
Bild oben: Gesamtsendung
Bild mitte: Kopf-Datei
Bild unten: Chiffrat
Audio-Beispiel
PX-1000 V2 Akustikkoppler
PX-1000 V2 Akustikkoppler
Akustikkoppler