XOR kryptering

Exclusive-OR (XOR) kryptering är enkel form av symmetrisk kryptering. Den är enkel att genomföra men för den som skall forcera en text krypterad med XOR med lång nyckel kan det ta lång tid.

XOR är en binär operation, som betyder ”antingen eller”. För att operationen skall returnera sant måste antingen a eller b vara sant, vilket tabellen nedan visar.

A | B | A xor B
--+---+---------
0   0      0
0   1      1
1   0      1
1   1      0


När man använder XOR för kryptering så låter man A vara texten som skall krypteras eller dekrypteras och B är nyckeln. Om längden på texten som skall krypteras är större än längden på nyckeln så repeteras nyckeln, om och om igen.

Om vi exempelvis har texten: ”hello”, och den skall krypteras med nyckeln: ”ENC” så behöver vi ta reda den binära representationen för varje bokstav.
Vi kommer här att visa både den decimala samt binära representationen av varje bokstav i både texten samt nyckeln.

h - 104 - 01101000
e - 101 - 01100101
l - 108 - 01101100
l - 108 - 01101100
o - 111 - 01101111

E - 69 - 01000101
N - 78 - 01001110
C - 67 - 01000011

För varje bokstav tar vi sedan och utför xor på varje bit. xor operationerna för första bokstaven blir då

a(h) b(E) XOR
0    0    0
1    1    0
1    0    1
0    0    0
1    0    1
0    1    1
0    0    0
0    1    1

Utifrån denna första operation får vi det binära talet 00101101 vilket i decimalform ger oss talet 45 och därmed tecknet: ”-”.

Den andra bokstaven blir

a(e) b(N) XOR
0    0    0
1    1    0
1    0    1
0    0    0
0    1    1
1    1    0
0    1    1
1    0    1

Den andra bokstaven konverterat till decimalform ger oss talet 43 och tecknet: ”+”.

Om vi fortsätter så får vi till slut fram alla talen (45, 43, 47, 41, 33) vilket ger oss strängen: ”-+/)!”

För att dekryptera ovanstående exempel så gör vi samma sak fast tvärtom. Jag ger exempel på första bokstaven igen.

a(-) b(E) XOR
0    0    0
0    1    1
1    0    1
0    0    0
1    0    1
1    1    0
0    0    0
1    1    0

Ovanstående XOR operation ger oss det binära talet 01101000 vilket decimalt blir 104 och ger oss – enligt asciitabellen – tecknet ”h”, som alltså är första bokstaven från ursprungstexten. Därmed har vi sett att både kryptering och dekryptering fungerar.

För att utföra XOR-operationer när man programmerar behöver man normalt inte gå igenom bit för bit, utan det räcker att ta en bokstav och sedan utföra xor av dess decimala form. I VB kan det exempelvis se ut såhär:

MessageBox.Show(Chr(Asc("h") Xor Asc("E")))

Om man däremot vill konvertera en bokstav (eller en hel text) till dess binära form kan man göra detta – i .NET – genom att utnyttja Convertklassen. Såhär kan det exempelvis se ut.

Dim text as String = "hello"
Dim sb As System.Text.StringBuilder = New System.Text.StringBuilder
Dim encoder As System.Text.Encoding = System.Text.Encoding.UTF8
Dim bytes() As Byte = encoder.GetBytes(text)
Dim b As Byte

For Each b In bytes
    sb.Append(String.Format("{0,8}", Convert.ToString(b, 2)).Replace(" ", "0"))
    sb.Append(separator)
Next

När man använder XOR är det mycket viktigt att man använder långa nycklar, annars är det enkelt att knäcka kryptot.

Microsoft använder XOR kryptering för att lagra lösenordet man matar in i accessdatabaser (95, 97, 2000, XP, 2003). Dessutom är det alltid samma nyckel som används vilket gör det mycket enkelt att forcera lösenordsskyddet i accessdatabaser.

För att forcera ett XOR krypto så är en lösning att generera slumpvärden av möjliga nycklar. Vi matar därför in den krypterade strängen samt ett värde i klartext som vi tror oss veta finns i den krypterade strängen. När värdet i klartext stämmer överens med värdet på den krypterade strängen xor-dekrypterat med den slumpmässigt skapade nyckeln stämmer överens så vet vi att vi har träffat rätt. Däremot vet vi inte om vi har hela nyckeln eller bara en del. Oavsett vilket så kan vi fortsätta med samma procedur genom hela vårt dokument och när vi har hittat den fullständiga nyckeln kan vi göra en enkel dekryptering på den.

2 kommentarer

  1. […] Problemet ligger i att det som ofta används för att kryptera är en vanlig XOR operation. Innan vi går vidare är det bra att du känner till hur XOR fungerar, om du inte vet exakt hur det fungerar eller om du vill färska upp minnet så kan du läsa mitt inlägg om XOR. […]

  2. […] – även kallad IV (Initialize Vector) – som det första blocket av data kör en XOR-operation mot. Fortsatta block använder istället föregående block som “nyckel” (IV) vilken […]

RSS feed for comments on this post

Kommentarer inaktiverade.

%d bloggare gillar detta: