Zurück
Grundlage der Analyse bildet die Chiffrier- bzw. Dechif-
frierfunktion des Pascal-Source-Codes TC850.pas.

Festlegungen:
Strukturschlüssel: 1101011010111111
                   1010010011110111
                   0011000000111110
                   0100001100001010
                   0011010001001110
                   1101011100110001
                   1100101111101010
                   1110011100001000

Grundschlüssel: "GYFXFMBFJXIDFKMN"

Spruchschlüssel: "WWWNN NOOOL LLRRR KKKAA APPPS SSBBB"

Grund- und Spruchschlüssel Kodierung
Grund- Spruchschlüssel"ITA 2" XOR SHL 3für die MATRIX
BuZiITA-2SHL 301234567gebildetes Element
A-0x140xa0010000010xb4
B?0x130x98011111100x8b
C:0x0e0x70011101010x7e
D@0x120x90000111100x82
E30x100x80100111010x90
F@0x160xb0010101000xa6
G@0x0b0x58111000010x53
H@0x050x28001101010x2d
I80x0c0x60011100000x6c
J@0x1a0xd0011001000xca
K(0x1e0xf0001000110xee
L)0x090x48011000000x41
M.0x070x38100001110x3f
N,0x060x30110110100x36
O90x030x18110001010x1b
P00x0d0x68110100100x65
Q10x1d0xe8110110000xf5
R40x0a0x50010100110x5a
S'0x140xa0011001110xb4
T50x010x08100001110x09
U70x1c0xe0001100100xfc
V=0x0f0x78100111100x77
W20x190xc8011100010xd1
X/0x170xb8101011000xaf
Y60x150xa8110101100xbd
Z+0x110x88000010000x99
Reg III0x000x00101110100x00
wr0x020x10010011010x12
Spc0x040x20100101010x24
zv0x080x40010000110x48
Reg II0x1b0xd8011010100xc3
Reg  I0x1f0xf8000110000xe7
Tabelle: Substitution für die Grund- und Spruchschlüssel
Aus dem Grundschlüssel (MatrixB) wird
aus 16 Zeichen:
"GYFXFMBFJXIDFKMN"

die 10 kodierte Bytes:
"0xf5, 0x99, 0xa6, 0xaf, 0xa6, 0x3f, 0x8b, 0xa6, 0xca, 0xaf"

Die unterstrichenen Werte werden nicht genutzt!

Der  Grundschlüssel wird verlängert mit den Bytes 2 … 7 des
Grundschlüssels, in die 16 kodierten Bytes:
"0xf5, 0x99, 0xa6, 0xaf, 0xa6, 0x3f, 0x8b, 0xa6,
 0xca, 0xaf, 0xa6, 0xaf, 0xa6, 0x3f, 0x8b, 0xa6"

Aus dem Spruchschlüssel (MatrixD) wird aus den 30 Buchstaben:
"WWWNN NOOOL LLRRR KKKAA APPPS SSBBB"

zuerst 10 Buchstaben extrahiert:
"WNOLRKAPSB"

dann in 10 kodierte Bytes:
"0xd1, 0x36, 0x1b, 0x41, 0x5a, 0xee, 0xb4, 0x65, 0xb4, 0x8b"

Der Spruchschlüssel (MatrixD) wird verlängert mit den Bytes
1 … 6 des Spruchschlüssels, in die 16 kodierte Bytes:
"0xd1, 0x36, 0x1b, 0x41, 0x5a, 0xee, 0xb4, 0x65,
 0xb4, 0x8b, 0x36, 0x1b, 0x41, 0x5a, 0xee, 0xb4"

Aus den Matrizzen MatrixB und MatrixD wird ein neues Feld gebildet
die die Dimension von 31 bytes hat, Regist[31], entsprechend folgendem
Algorithmus:

Regist[1] ist markiert mit 0xff.
Regist[x+1] = MatrixD[x] xor MatrixB[x]
wobei x im Wertebereich von 1 bis 10 liegt.
Folgend der Wertebreich von 11 bis 16,
Regist[x+1] =  MatrixD[1:6] xor MatrixB[x].
Folgend der Wertebreich von 17 bis 20,
Regist[x+1] =  MatrixD[7:10] xor MatrixB[1:4].
Folgend der Wertebreich von 21 bis 26,
Regist[x+1] =  MatrixD[1:6] xor MatrixB[5:10].
Folgend der Wertebreich von 27 bis 30,
Regist[x+1] =  MatrixD[7:10] xor MatrixB[2:5].

In die Matrizze MatrixP[8,16] wird transformiert:
MatrixP[0:7,0:15] = Strukturschlüssel_bit0[] xor MatrixD[] xor MatrixB[]

Von den gebildeten 128 bit muß die Anzahl der "1" größer 33 und
kleiner 95 sein. Ist das nicht der Fall, wird der Struktur-
schlüssel[0:7, 0:14] geladen mit Strukturschlüssel[0:7, 1:15]
und die vorherige Funktion wiederholt.
Im ungünstigsten Fall wird das letzte Bit des Strukturschlüssel,
"0 oder 1", solange mit "0" oder "1" gefüllt bis
die Bedingung erfüllt ist!
Hier ist ersichtlich welche Qualität der Strukturschlüssel
haben muß um nicht in den o.g. Zustand zu kommen.
Hier liegt die "0/1" Verteilung bei min. 26% und max. 74%.
Für eine gute Gleichverteilung sollten diese min. 45% und max. 55% haben.

Im weiteren wird die Parität der gebildeten "1" der MatrixP ermittelt.
Ist das Ergebnis eine gerade Parität, wird das erste Bit der
MatrixP[0,0] XOR "1" verknüpft.
Somit ist die Parität immer ungerade.

Normalerweise sind jetzt alle Vorbereitungen getroffen worden
für das Chiffrieren bzw. Dechiffrieren. Nun wird aber der
Spruchschlüssel als Schlüsselelement des Algorithmus verwendet
und stellt keinen Initialisierungsvektor (IV) im herkömmlichen
Sinn dar. Dies wird jetzt durch eine Funktion mit einem festen
Vektor realisiert. Im Programm als VORLAUF benannt, führt
150 Runden als IV durch.

Die Matrizze REGIST[], aus MatrixD und MatrixB erzeugt, wird
über eine feste Matrix

MASKE: $14,$73,$A3,$33,$8F,$25,$67,$BD,$16,$B6,$B4,$4C,$0C,$B4,$51,
       $90,$6B,$1A,$6B,$09,$E0,$59,$0D,$A8,$18,$E1,$70,$61,$C1,$01,$81

durch die Anwendung der AND-Funktion die festgelegten Bits,
definiert durch die Maske, extrahiert. Andere Bits werden ver-
worfen. Danach mit dem vorherigen extrahierten Wert XOR verküpft.
Die Matrizze REGIST wird mit dem neuen Wert geladen und um eine
Position in der Matrix verschoben. Der letzte berechnet Wert,
einer Runde, wird im Byte C gespeichert. Aus C wird noch ein
Paritätsbit ZT gebildet. Bei einer ungeraden Anzahl von "1"
ist das Paritätsbit ZT = 1.
Kaskade
Auffällig ist, daß die Funktion RegSatzVer, bis auf die Parameter,
identisch ist mit der Funktion in der PX-1000NSA
Die Parameter im Vergleich:
PX1000NSATC-850
Runden:1631
Feld:16 byte31 byte
Maske:4 bit8 bit
Ausgabe:1 byte1 byte
Tabelle: Parameter der Rekursionsfunktion
In Bruce Schneider, Applied Cryptography bzw. Angewande Kryplogie
wird auf das NSA Patent US 5.237.615 verwiesen. Bereits 1963 wurde im
US Patent US 3.364.308 sowie weiteren Patenten so verfahren.

Nun sind für die Bildung der Additionsreihen folgende Matrizzen
und Bytes erzeugt worden:

ZT   (1 byte)    aus zt = zt XOR Summe vek[1:8]
C    [8 Bit]     aus c[] = Rekursion XOR REGIST[1:31] AND MASKE[1:31]
REGIST[31 byte]  aus MtxB[1:16, 1:8] und MtxD[1:16, 1:8]
MtxP [128 byte]  aus MtxP[0:7,0:31] XOR MtxD[1:16,8:1] XOR MtxB[1:16,8:1]
MtxB [128 byte]  aus Grundschlüssel
MtxD [128 byte]  aus Spruchschlüssel

Die Variablen bzw. Felder C, ZT und REGIST unterliegen während
der Chiffrierung bzw. Dechiffrierung permanenter Änderung.

Zur De- bzw. Chiffrierung werden die Zeichen:
Reg I … III, WR, ZV, Leerzeichen in einem Bigramm mit einem
führenden "Y" umgewandelt.
Register I … III = Register 32., Bu, Zi.
KlartextSubstitutDechiff.
 YYSY
WRYOWr
ZVYLZv
BuYKBu
ZiYJZi
' 'YH' '
32.YT|
Die Symbole in Dechiff. werden als Zeichen bzw. Steuerzeichen umgesetzt.
Im folgenden wird der Klar- bzw. Geheimtext chiffriert.
GTX = Klartext XOR Additionsreihe
Klartext = GTX XOR Additionsreihe

Bei der Chiffrierung und Dechiffrierung wird bei dem Einsatz der
Bigramme, trotzdem die Additionsreihe weitergebildet aber das
nächste Element wird nicht verwendet.

Ein Beispiel:
Der Klartext lautet: YPS
Erstes chiffriertes Element:
GTX[1] = KTxt[1] XOR Add[1] = 0x15
Nächstes gebildetes Additionselement bleibt ungenutzt.
Zweites chiffrierte Element.
GTX[2] = KTxt[2] XOR Add[3] = 0x01
Der Geheimtext sieht entsprechend aus: YSE.
Drittes chiffrierte Element.
GTX[2] = KTxt[3] XOR Add[4] = 0x01
Der Geheimtext sieht entsprechend aus: YSEE.

Beim Dechiffrieren wird ebenfalls so gearbeitet:
Erstes chiffriertes Element:
KTxt[1] = GTX[2] XOR Add[1] = 0x14
Nächstes gebildetes Additionselement bleibt ungenutzt.
Zweites chiffrierte Element.
KTxt[2] = GTX[3] XOR Add[3] = 0x0d
Im Klartext sieht das entsprechend aus: YP.
Zweites chiffrierte Element.
KTxt[3] = GTX[4] XOR Add[4] = 0x05
Im Klartext sieht das entsprechend aus: YPS.

Ein Schelm wer da Böses denkt, aber abwegig ist es nicht.
Es wird ein auftretender Zyklus, Wiederholung der Folgen, verschleiert.
Denn wozu muß die Additionsreihe synchron sein?
Dazu findet man auch einen guten Hinweis in der Literatur
bei Res Strehle: Operation Crypto und Verschlüsselt.
Beschrieben wird dort wie ein Verkaufsingenieur der Crypto-AG den
jugoslawischen Offizieren erklären soll warum ständig der aktuelle
Stand des Schlüssels übertragen wird.

In den Chiffrierverfahren ARGON und DUDEK wird bei der
Nutzung des Kodeumsetzer die Umwandlung der chiffrierten
Zeichen in Bigramme durchgeführt. Aber im Gegensatz zum
oben genannter Vorgehensweise wird das nächste zu chiffrierende
Zeichen auch mit dem nächsten Element der Additionsreihe
chiffriert. Bei der Dechiffrierung erfolgt die Umsetzung
des Bigramm in das entsprechenden Zeichen und wird dann
dechiffriert.

Die Bildung der Additionsreihen erfolgt durch folgende Schritte:

In einer Schleife mit 5 Runden.
Bei einer geplanten ASCII Chiffrierung, sind 7 Runden notwendig.
- Rekursionsregister:
  · 31 Runden, Bearbeitung MtxP
  · Extrahieren eines Bytes "C",
- Gamma( Gam, MtxP, C, ZT):
  · Spaltentransposition Pij, aus MtxP[] und C
  · Gam = Pij XOR C[8] XOR ZT
- Add << 1
- Add = Add XOR Gam
- ELMZT(ZT,C)
  · ZT = Parität C
- Ausgabe maskiert auf 0x1f, ITA-2 Zeichen.

Schluß endlich wird der Klar- bzw. Geheimtext mit dem gebil-
deten Additionsreihe XOR verknüpft.

Dabei wird die Substitution der Steuerzeichen und des "Y"
berücksichtigt sowie wie oben bereits beschrieben ein "Leertakt eingefügt"!

Offen ist noch eine Analyse der Variable C - der Additionsreihe!

Welche Programmabschnitte sehe ich als Kritisch an:
- die Verkürzung des Spruchschlüssels mit anschließender
- Verlängerung des Grund- und Spruchschlüssel, die ein
  Zyklus darstellt;
- die Substitution des 5 Bit ITA-2 in die 8bit Kodierung;
- die Bildung von C mittels der Kaskadenverknüpfung;
- die Maske in der Kaskadenverknüfung;
- die Beibehaltung der Matrix P, die sich während der
  Chiffrierung nicht verändert;
- das Einfügen eines Leerschrittes bei der "Y"
  Substitution.

Experimentell wurde die Maske für die Kaskadenverknüpfung
ersetzt durch die dynamischen Werte aus dem Feld REGIST,
das in der Kaskadenverknüpfung ständiger Veränderung
unterliegt. Das Ergebnis waren bessere Zufallswerte.

In der Software zur Ermittlung von Klartexten und Schlüsseln
aus der Verknüpfung von mehreren Geheimtexten sind ein Beleg
dafür das viele schlüsselgleiche Sprüche erzeugt werden.
Die nur aus der Betrachtung des Geheimtextes erst mal nicht
sofort erkennbar sind.
Genannt sei dabei Zyklus, Redundanz und in Teilen identische
Geheimtexte als Kriterium für die Dekryptierbarkeit.