Verschlüsselung
Ein Software-Rätsel von Heinz D.
Verschlüsselung
ist in aller Munde. Im Rätsel sind 16 Zeichen verschlüsselt abgelegt,
die entschlüsselt einen Begriff ergeben. Jedes Zeichen wird unabhängig
auf die gleiche Weise verschlüsselt (Codiere), wie es eine Tabelle auch
täte. Der Empfänger muss nur die Formel (Decoder) kennen, kein
Passwort. Sie sollen nicht das Lösungswort finden, sondern die Formel
für die Bitweise-Verschlüsselung finden (Lösungen bitte an
kainka@elektronik-labor.de). Die Codierung ist primitiv, leicht zu
knacken und kann allenfalls Verwirrung stiften. Sie können Codiere und
Decoder auch tauschen oder mehrfach anwenden, um andere Zeichenfolgen
zu erzeugen.
Das Programm sollte auch ohne LCD über TxD laufen.
Hilfestellung:
Es
handelt sich um eine 6-Bit-Standard 'Verwürfelung' für Zufallszahlen
oder Rauschgeneratoren. Sie sollten sich die Einzelbits notieren und
sehen, wie sie manipuliert werden.
Download: 1407-Raetsel-bas-hex.zip
'1407-Software-Rätsel (mit Pollin-LCD, TxD-Pin3 sollte auch funktionieren)
'
'In den Dta0-Zeilen sind 16 ASCII-Zeichen (cryptisch).
'Nach dem decodieren ergeben sie den Lösungs-String (16 ASCII-Zeichen).
'
'Analysieren Sie (nur) die Subroutine Decoder.
'Sub Codiere ist spielgelbildlich und kann den cryptischen String erzeugen.
'
'HINWEISE zur Verschlüsselung:
'
'Die Subs ver-/entschlüsseln nur asc(32) bis asc(94) = nur Grossbuchstaben = 6-Bit.
'Hat man die Übersetzungstabelle ermittelt, sieht man wie primitiv sie ist.
'Zu einer ernsthaften Verschlüsselung taugt das nicht, zur Verwirrung schon.
'
'HILFE:
'Der Algorytmus bildet die Erzeugung einer Zufallszahl nach.
'-------------------------------------------------------------------------------
$regfile = "attiny2313.dat"
$crystal = 1000000 'ab Werk
$crystal = 8000000
$baud = 9600
Lcdddr Alias Ddrd.6 : Lcdout Alias Portd.6 'Lcd
Set Lcdddr : Set Lcdout 'Lcd-Speisung
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Porta.0 , Rs = Porta.1
Initlcd : Cursor Off
Declare Sub Decoder
Declare Sub Codiere
Dim S As String * 1
Dim Index0 As Byte , Index1 As Byte
Dim Temp0 As Byte , Temp1 As Byte , Temp2 As Byte
'-------------------------------------------------------------------------------
Do
Restore Dta0 : Decoder 'Zeiger auf Rätsel-String
' Restore Dta1 : Codiere 'Zeiger auf Rätsel-String
Restore Dta2 : Decoder 'Zeiger auf Test-String
Restore Dta3 : Codiere 'Zeiger auf Test-String
Loop
End
'-------------------------------------------------------------------------------
Sub Decoder
Cls '1.Zeile zu 8 Zeichen
For Index0 = 0 To 1 '2 Zeilen
For Index1 = 1 To 8 'zu 8 Zeichen
Read S 'hol ein Zeichen
S = Ucase(s) 'nur Grossbuchstaben
Temp0 = Asc(s) - 32 'Bereich asc(32-95) auf 0-63 holen
Temp1 = Temp0 And 1
Shift Temp1 , Left , 5
Temp2 = Temp0 And 32
Temp1 = Temp1 Xor Temp2
Shift Temp0 , Right
Temp0 = Temp0 Or Temp1
Temp0 = Temp0 And 63
Temp0 = Temp0 + 32 'in den Bereich asc(32-95) verschieben
Lcd Chr(temp0) 'zeig
Print Chr(temp0);
Next
Locate 2 , 1 '2.Zeile zu 8 Zeichen
Print
Next
Wait 5
End Sub
'-------------------------------------------------------------------------------
Sub Codiere
Cls '1.Zeile zu 8 Zeichen
For Index0 = 0 To 1 '2 Zeilen
For Index1 = 1 To 8 'zu 8 Zeichen
Read S 'hol ein Zeichen
S = Ucase(s) 'nur Grossbuchstaben
Temp0 = Asc(s) - 32 'Bereich asc(32-95) auf 0-63 holen
Temp1 = Temp0 And 16
Shift Temp1 , Right , 4
Temp2 = Temp0 And 32
Shift Temp2 , Right , 5
Temp1 = Temp1 Xor Temp2
Shift Temp0 , Left
Temp0 = Temp0 Or Temp1
Temp0 = Temp0 And 63
Temp0 = Temp0 + 32 'in den Bereich asc(32-95) verschieben
Lcd Chr(temp0) 'zeig
Print Chr(temp0);
Next
Locate 2 , 1 '2.Zeile zu 8 Zeichen
Print
Next
Wait 5
End Sub
'-------------------------------------------------------------------------------
Dta0: 'Rätsel-String
Data "+"
Data "9"
Data "+"
Data "7"
Data "H"
Data "D"
Data "?"
Data "="
Data "3"
Data "7"
Data ":"
Data "9"
Data "#"
Data "%"
Data "?"
Data "D"
Dta1: 'Rätsel-String
Dta2: 'Test-String
Data "F"
Data "?"
Data "-"
Data "H"
Data "N"
Data "#"
Data "D"
Data "+"
Data ":"
Data "D"
Data "#"
Data "+"
Data "H"
Data "F"
Data "+"
Data "9"
Dta3: 'Test-String
Data "S" , "o" , "f" , "t" , "w" , "a" , "r" , "e"
Data "-" , "R" , "a" , "e" , "t" , "s" , "e" , "l"
'-------------------------------------------------------------------------------
' ______ 2313 ______
' 1-Reset Vcc-20 +4,5V
' TL1 2-D0/Rx Sck/B7-19 scl ***
' TL2 3-D1/Tx Miso/B6-18 ***
' RS(lcd4) 4-A1/X2 Mosi/B5-17 sda ***
' E (lcd6) 5-A0/X1 B4-16 Vo(lcd3) ***
' Ti0 6-D2/Int0 OC/B3-15 d7(lcd10)
' TL3 7-D3/Int1 OC/B2-14 d6(lcd9)
' TL4 8-D4/T0 Ain1/B1-13 d5(lcd8)
' Buzz 9-D5/T1 Ain0/B0-12 d4(lcd7)
' 10-Gnd D6-11 Vdd(lcd2) ***
'End
Eine Lösung von Axel Zechner
Aus
Spaß an der Freude hab ich die Frühstückspause genutzt um das kleine
Rätsel zu lösen. Es handelt sich um eine kleine Substitutionschiffre,
bei der also jeder Buchstabe durch einen anderen ersetzt wird:
Abgesehen von der ASCII nach 6-Bit Umwandlung passiert Folgendes:
Ausgangsbuchstabe: a=a5.a4.a3.a2.a1.a0
(Bits a5 ... a0)
Codiert: c=c5.c4.c3.c2.c1.c0=a4.a3.a2.a1.a0.(a4 xor a5)
Decodiert: d=(c0 xor c5).c5.c4.c3.c2.c1=a5.a4.a3.a2.a1.a0
mit (c0 xor c5)=(a4 xor a5) xor a4=a4 xor a4 xor a5=a5 xor 0=a5
Es wird also nur ein wenig geschoben und 2 Bits miteinander verknüpft.
Vielen Dank für das kurzweilige Rätsel!
(Dazu schreibt Heinz D.: Die Lösung ist korrekt.
Der letzte Term: 'mit (c0 xor c5)=(a4 xor a5) xor a4=a4 xor a4 xor
a5=a5 xor 0=a5' erschließt sich mir nicht ganz, weil die
AND-Verknüpfungen in Zeile 39+42 nur Bit0 XOR Bit5 -> Bit5 übrig
lassen und der Rest 'ausgenullt' wird. Das OR in Zeile 47 überschreibt
nur Bit5. Egal, richtig bleibt richtig.
Inzwischen habe ich
gelernt, dass man eine Tabellenverschlüsselung 'Cäsarverschlüsselung'
nennt. Auf den ersten Blick könnte man meinen, dass nach sechsmaliger
Anwendung (6-Bit-SRG) alles von vorn beginnt. Erst nach 2^6-1-maliger
(=63) Anwendung ist das SRG vollständig durchlaufen (000000 ist bei XOR
verboten, kommt nicht vor, 111111 ist bei XNOR verboten).
Eine
sichere Verschlüsselung erhält man, wenn mit einer weiteren
Pseudozufallszahl als Schiebetakt, jeder folgende Buchstabe anders
verschlüsselt wird. Dem Empfänger muss dann die Formel für die beiden
SRG und der Anfangswert = Passwort des 2.SRG bekannt sein. Mit einem
128-Bit-SRG werden ~10^38 Passworte möglich. )
Auflösung von Heinz D.
Es handelt sich um die Nachbildung eines linearen 6-Bit-Schieberegister mit XOR-Rückkopplung.
Decoder:
--------
Durch
UCASE(s) wird sichergestellt, das nur Zeichen bis asc(95) auftreten.
Die ASCII-Zeichen 32 bis 95 werden durch Subtraktion auf 0-63 (6-Bit)
reduziert. Eine 7- oder 8-Bit Verschlüsselung bietet sich hier nicht
an, weil die Ergebnisse in den Steuerzeichen 0-31 landen können. Dann
wird das letzte Bit0 isoliert, und an die Stelle Bit5 geschoben. Aus
dem Zeichen wird nun noch das Bit5 isoliert und die XOR-Verknüpfung
gebildet. Jedes Bit des Zeichens wird um 1Bit nach rechts verschoben.
Und das Ergebnis der XOR-Verknüpfung an die Stelle Bit5 hinzugefügt.
Zum Schluss wird das Ergebnis mit +32 wieder in den darstellbaren
Bereich gehoben.
Codiere:
--------
Hier wird Bit4 und Bit5 isoliert, XOR-verknüpft und nach der Linksverschiebung in Bit0 geschrieben.
Ich hoffe Sie hatten viel Spaß beim Knobeln. (Für ganz genaue: Space wird nicht umgeschlüsselt.)
Download: 1407-Raetsel-Loesung-bas-hex.zip
'Lösung:
'-------
'1407-Software-Rätsel (mit Pollin-LCD, TxD-Pin3 sollte auch funktionieren)
'-------------------------------------------------------------------------------
$regfile = "attiny2313.dat"
$crystal = 1000000 'ab Werk
$crystal = 8000000
$baud = 9600
Lcdddr Alias Ddrd.6 : Lcdout Alias Portd.6 'Lcd
Set Lcdddr : Set Lcdout 'Lcd-Speisung
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Porta.0 , Rs = Porta.1
Initlcd : Cursor Off
Declare Sub Decoder
Declare Sub Codiere
Dim S As String * 1
Dim Index0 As Byte , Index1 As Byte
Dim Temp0 As Byte , Temp1 As Byte , Temp2 As Byte
'-------------------------------------------------------------------------------
Do
Restore Dta0 : Decoder 'Zeiger auf Rätsel-String
Restore Dta1 : Codiere 'Zeiger auf Rätsel-String
Restore Dta2 : Decoder 'Zeiger auf Test-String
Restore Dta3 : Codiere 'Zeiger auf Test-String
Loop
End
'-------------------------------------------------------------------------------
' lineares Schieberegister: Bit5 XOR Bit0, nach Rechtsverschiebung in Bit5
Sub Decoder
Cls '1.Zeile zu 8 Zeichen
For Index0 = 0 To 1 '2 Zeilen
For Index1 = 1 To 8 'zu 8 Zeichen
Read S 'hol ein Zeichen
S = Ucase(s) 'nur Grossbuchstaben
Temp0 = Asc(s) - 32 'Bereich asc(32-95) auf 0-63 holen
Temp1 = Temp0 And 1 'Bit0 isolieren
Shift Temp1 , Left , 5 'nach Bit5 schieben
Temp2 = Temp0 And 32 'Bit5 isolieren
Temp1 = Temp1 Xor Temp2 'XOR-Verknüpfung des Bit5
Shift Temp0 , Right 'alle Bits eins runter
Temp0 = Temp0 Or Temp1 'Bit5 überschreiben
Temp0 = Temp0 And 63 'oberen 2Bit löschen
Temp0 = Temp0 + 32 'in den Bereich asc(32-95) verschieben
Lcd Chr(temp0) 'zeig
Print Chr(temp0);
Next
Locate 2 , 1 '2.Zeile zu 8 Zeichen
Print
Next
Wait 5
End Sub
'-------------------------------------------------------------------------------
' lineares Schieberegister Bit5 XOR Bit4, nach Linksverschiebung in Bit0
Sub Codiere
Cls '1.Zeile zu 8 Zeichen
For Index0 = 0 To 1 '2 Zeilen
For Index1 = 1 To 8 'zu 8 Zeichen
Read S 'hol ein Zeichen
S = Ucase(s) 'nur Grossbuchstaben
Temp0 = Asc(s) - 32 'Bereich asc(32-95) auf 0-63 holen
Temp1 = Temp0 And 16 'Bit4 isolieren
Shift Temp1 , Right , 4 'nach Bit0 schieben
Temp2 = Temp0 And 32 'Bit5 isolieren
Shift Temp2 , Right , 5 'nach Bit0 schieben
Temp1 = Temp1 Xor Temp2 'XOR-Verknüpfung des Bit0
Shift Temp0 , Left 'alle Bit eins hoch
Temp0 = Temp0 Or Temp1 'Bit0 überschreiben
Temp0 = Temp0 And 63 'oberen 2Bit löschen
Temp0 = Temp0 + 32 'in den Bereich asc(32-95) verschieben
Lcd Chr(temp0) 'zeig
Print Chr(temp0);
Next
Locate 2 , 1 '2.Zeile zu 8 Zeichen
Print
Next
Wait 5
End Sub
'-------------------------------------------------------------------------------
Dta0: 'Rätsel-String
Data "+"
Data "9"
Data "+"
Data "7"
Data "H"
Data "D"
Data "?"
Data "="
Data "3"
Data "7"
Data ":"
Data "9"
Data "#"
Data "%"
Data "?"
Data "D"
Dta1: 'Rätsel-String
Data "E" , "l" , "e" , "k" , "t" , "r" , "o" , "n"
Data "i" , "k" , "-" , "L" , "a" , "b" , "o" , "r"
Dta2: 'Test-String
Data "F"
Data "?"
Data "-"
Data "H"
Data "N"
Data "#"
Data "D"
Data "+"
Data ":"
Data "D"
Data "#"
Data "+"
Data "H"
Data "F"
Data "+"
Data "9"
Dta3: 'Test-String
Data "S" , "o" , "f" , "t" , "w" , "a" , "r" , "e"
Data "-" , "R" , "a" , "e" , "t" , "s" , "e" , "l"
'-------------------------------------------------------------------------------
' ______ 2313 ______
' 1-Reset Vcc-20 +4,5V
' TL1 2-D0/Rx Sck/B7-19 scl ***
' TL2 3-D1/Tx Miso/B6-18 ***
' RS(lcd4) 4-A1/X2 Mosi/B5-17 sda ***
' E (lcd6) 5-A0/X1 B4-16 Vo(lcd3) ***
' Ti0 6-D2/Int0 OC/B3-15 d7(lcd10)
' TL3 7-D3/Int1 OC/B2-14 d6(lcd9)
' TL4 8-D4/T0 Ain1/B1-13 d5(lcd8)
' Buzz 9-D5/T1 Ain0/B0-12 d4(lcd7)
' 10-Gnd D6-11 Vdd(lcd2) ***
'End