DIY Rotorchiffer/Subsitutionschiffer i Python
Postat: 12 maj 2019, 11:27:17
Förr i tiden(före digitalelektronikens tid) så användes mekaniska skiffer av olika sorter, ett exempel är tyskarnas enigma, ett annat är det ryska Fialka. Dessa fungerade i princip på samma sätt, ett antal rotorer som var länkade på olika sätt och ställdes i olika possitioner beroende på vilken nyckel man ville använda. Enigma maskinen hade faktiskt en nyckelstorlek på 80bitar har jag för mig.
Idag görs säkert skiffer på bättre och säkrare sätt, men det hade varit roligt att göra ett eget skiffer, man är ju inte längre begränsad av mekaniken i rullarna som kan kärva tex. Jag har lyckats göra detta i Pyhton, med 3st rotorer så får man en nyckel på runt 14-bitar, men fler är ju inte något problem att lägga till.
Programmet är enkelt. Varje rotor länkar in i en "rotor"(int array) på possitionen i arrayen, och ut på värdet. Därefter går den in i nästa osv... när variabeln gått ut ur den sista, C-rotorn, så snurras första rotorn ett klick, andra 2, och tredje 3.
Jag är inte någon mästa på varesig python eller skiffer som ni säkert förstår, men det verkade vara ett roligt projekt.
Kritik mottages gärna!(helst possitiv iofs...)
Något gör så att den avkodade arrayen ibland skiljer sig på någon siffra, ibland inte, beroende på nyckeln....
Idag görs säkert skiffer på bättre och säkrare sätt, men det hade varit roligt att göra ett eget skiffer, man är ju inte längre begränsad av mekaniken i rullarna som kan kärva tex. Jag har lyckats göra detta i Pyhton, med 3st rotorer så får man en nyckel på runt 14-bitar, men fler är ju inte något problem att lägga till.
Programmet är enkelt. Varje rotor länkar in i en "rotor"(int array) på possitionen i arrayen, och ut på värdet. Därefter går den in i nästa osv... när variabeln gått ut ur den sista, C-rotorn, så snurras första rotorn ett klick, andra 2, och tredje 3.
Jag är inte någon mästa på varesig python eller skiffer som ni säkert förstår, men det verkade vara ett roligt projekt.
Kritik mottages gärna!(helst possitiv iofs...)
Något gör så att den avkodade arrayen ibland skiljer sig på någon siffra, ibland inte, beroende på nyckeln....
Kod: Markera allt
import array as arr
#Detta är dom fyra kodhjulen
a = arr.array('l', [12,24,1,3,11,4,7,21,19,22,6,16,20,14,15,26,9,10,25,5,13,23,2,8,17,18])
b = arr.array('l', [20,9,3,22,19,21,14,5,17,2,26,12,23,25,10,8,18,6,24,15,16,1,7,4,11,13])
c = arr.array('l', [21,19,4,16,26,18,2,12,8,11,14,20,3,13,24,23,25,1,15,10,9,17,22,5,7,6])
#Krypteringsnyckeln
key = arr.array('l', [1,9,7])
#Meddelandet som ska kodas
msg = arr.array('l', [3, 17, 12, 22])
#det krypterade meddelandet
enc = arr.array('l',[1,1,1,1])
#det dekrypterade meddelandet
dec = arr.array('l',[1,1,1,1])
#Kodinställning, startpossition per hjul
PosA = key[0]
PosB = key[1]
PosC = key[2]
#skriv ut meddelandet
print(msg)
#Kyptering
for x in range(4):
PosY = (PosA+msg[x])%26
outbyte = a[PosY-1]
PosX = (PosB+outbyte)%26
outbyte = b[PosX-1]
PosZ = (PosC+outbyte)%26
outbyte = c[PosZ-1]
#Rotera hjulen
PosA = PosA + 1
PosB = PosB + 2
PosC = PosC + 3
enc[x] = outbyte
print(enc)
#Dekryptering
PosA = key[0]
PosB = key[1]
PosC = key[2]
for y in range(4):
#Avkoda genom C
for x in range(25):
if c[x] == enc[y]:
# print((x+1-PosC)%26)
valC = (x+1-PosC)%26
#Avkoda genom B
for x in range(25):
if b[x] == valC:
#print((x+1-PosB)%26)
valB = (x+1-PosB)%26
#Avkoda genom A
for x in range(25):
if a[x] == valB:
valA = (x+1-PosA)%26
PosA = PosA + 1
PosB = PosB + 2
PosC = PosC + 3
dec[y] = valA
print(dec)