Felen var som någon påpekade att jag hade missat for range funktionens ändläge, och missbedömt hur stora jag skulle göra modolus på hjulen. Som koden är skriven nu använder man 10st hjul med vardera 29 possitioner(primtal för att rotationen inte ska jag att ett begränsat antal positioner används). Det ger 4,2*10^14 möjliga nycklar, vilket motsvarar 48-bitar i nyckelstorlek ungefär.
För att öka antalet möjliga nycklar verkar ryssarna och tyskarna på sina enigma/faikla maskiner ha gjort så att hjulen kan flyttas i ordning, på min "maskin" finns det 10 hjul med lika många platser, vilket borde göra att man skulle kunna få 3,6miljoner möjliga kombinationer. Använder man detta så får man totalt 1,5*10^21 möjliga nycklar vilket är strax under 72-bitar, vilket nog kan betraktas som en säker nyckel.
Ett annat alternativ är att ändra hur hjulen roterar, dvs hur många steg dessa tar efter varje kodning. Om man kan välja att varje hjul ska ta mellan 1 och 10 steg efter varje kodat tecken, så borde det finnas 10 miljarder olika möjligheter, vilket tillsammans med hjulens startpositioner skulle ge 2,4*10^24 möjliga nycklar, 80-bitar.
Jag har valt att gå på den sistnämnda modellen, krypteringsnycklarna är därför nu uppdelade i en "meddelandenyckel" och en "pin nyckel" som avgör hur mycket hjulen snurrar efter varje tecken.
Kod: Markera allt
import array as arr
#Detta är dom fyra kodhjulen
a = arr.array('l', [12,24,16,3,11,4,7,21,19,22,6,1,20,14,15,26,9,10,25,5,13,23,2,8,17,18,0,27,28])
b = arr.array('l', [4,9,18,10,8,13,24,7,5,2,22,28,14,27,3,1,25,11,26,20,0,19,6,15,16,21,23,12,17])
c = arr.array('l', [10,14,4,11,28,25,26,17,5,21,27,23,0,13,18,24,7,1,15,22,20,16,2,6,8,9,3,19,12])
d = arr.array('l', [28,6,21,19,1,22,18,10,7,3,14,11,27,15,16,0,8,20,24,25,5,9,23,2,17,13,26,4,12])
e = arr.array('l', [10,6,24,13,9,25,3,16,23,8,19,15,22,12,21,17,5,1,18,28,7,2,11,0,20,14,4,26,27])
f = arr.array('l', [1,11,27,17,7,13,16,21,2,24,23,12,4,20,19,15,6,25,14,10,0,18,8,5,22,26,9,28,3])
g = arr.array('l', [12,24,16,3,11,4,7,21,19,22,6,1,20,14,15,26,9,10,25,5,13,23,2,8,17,18,0,27,28])
h = arr.array('l', [4,9,18,10,8,13,24,7,5,2,22,28,14,27,3,1,25,11,26,20,0,19,6,15,16,21,23,12,17])
i = arr.array('l', [28,6,21,19,1,22,18,10,7,3,14,11,27,15,16,0,8,20,24,25,5,9,23,2,17,13,26,4,12])
j = arr.array('l', [1,11,27,17,7,13,16,21,2,24,23,12,4,20,19,15,6,25,14,10,0,18,8,5,22,26,9,28,3])
#Meddelandenyckel
msgkey = arr.array('l', [2,5,21,3,16,3,22,13,8,25])
#Meddelandenyckel
pinkey = arr.array('l', [1,5,10,4,6,3,2,10,9,2])
#Meddelandet som ska kodas
msg = arr.array('l', [3, 1, 8, 28])
#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 = msgkey[0]
PosB = msgkey[1]
PosC = msgkey[2]
PosD = msgkey[3]
PosE = msgkey[4]
PosF = msgkey[5]
PosG = msgkey[6]
PosH = msgkey[7]
PosI = msgkey[8]
PosJ = msgkey[9]
#skriv ut meddelandet
print('Meddelande: ',msg)
#Kyptering
for x in range(4):
PosY = (PosA+msg[x])%29
outbyte = a[PosY]
PosX = (PosB+outbyte)%29
outbyte = b[PosX]
PosZ = (PosC+outbyte)%29
outbyte = c[PosZ]
PosY1 = (PosD+outbyte)%29
outbyte = d[PosY1]
PosY2 = (PosE+outbyte)%29
outbyte = e[PosY2]
PosY3 = (PosF+outbyte)%29
outbyte = f[PosY3]
PosY4 = (PosG+outbyte)%29
outbyte = g[PosY4]
PosY5 = (PosH+outbyte)%29
outbyte = h[PosY5]
PosY6 = (PosI+outbyte)%29
outbyte = i[PosY6]
PosY7 = (PosJ+outbyte)%29
outbyte = j[PosY7]
enc[x] = outbyte
#Rotering av hjul, efter pinkey.
PosA = PosA + pinkey[0]
PosB = PosB + pinkey[1]
PosC = PosC + pinkey[2]
PosD = PosD + pinkey[3]
PosE = PosE + pinkey[4]
PosF = PosF + pinkey[5]
PosG = PosG + pinkey[6]
PosH = PosH + pinkey[7]
PosI = PosI + pinkey[8]
PosJ = PosJ + pinkey[9]
print('Krypterat: ',enc)
#Dekryptering, börja med att nollställa nyckeln
PosA = msgkey[0]
PosB = msgkey[1]
PosC = msgkey[2]
PosD = msgkey[3]
PosE = msgkey[4]
PosF = msgkey[5]
PosG = msgkey[6]
PosH = msgkey[7]
PosI = msgkey[8]
PosJ = msgkey[9]
#Dekryptera, baklänges genom hjulen
for y in range(4):
for x in range(29):
if j[x] == enc[y]:
valJ = (x-PosJ)%29
for x in range(29):
if i[x] == valJ:
valI = (x-PosI)%29
for x in range(29):
if h[x] == valI:
valH = (x-PosH)%29
for x in range(29):
if g[x] == valH:
valG = (x-PosG)%29
for x in range(29):
if f[x] == valG:
valF = (x-PosF)%29
for x in range(29):
if e[x] == valF:
valE = (x-PosE)%29
for x in range(29):
if d[x] == valE:
valD = (x-PosD)%29
for x in range(29):
if c[x] == valD:
valC = (x-PosC)%29
for x in range(29):
if b[x] == valC:
valB = (x-PosB)%29
for x in range(29):
if a[x] == valB:
valA = (x-PosA)%29
dec[y] = valA
#Rotera hjulen efter pinkey
PosA = PosA + pinkey[0]
PosB = PosB + pinkey[1]
PosC = PosC + pinkey[2]
PosD = PosD + pinkey[3]
PosE = PosE + pinkey[4]
PosF = PosF + pinkey[5]
PosG = PosG + pinkey[6]
PosH = PosH + pinkey[7]
PosI = PosI + pinkey[8]
PosJ = PosJ + pinkey[9]
#Skriv ut den dekrypterade texten
print("Dekrypterat: ",dec)