Verschlüsselung           

Ein Software-Rätsel von Heinz D.                      

Elektronik-Labor  Projekte  AVR 


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





Elektronik-Labor  Projekte  AVR