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å repteras 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 operationen 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 exemlpelvis se ut såhär:
1 2MessageBox.Show(Chr(Asc("h") Xor Asc("E"))) 3
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.
1 2Dim text as String = "hello" 3Dim sb As System.Text.StringBuilder = New System.Text.StringBuilder 4Dim encoder As System.Text.Encoding = System.Text.Encoding.UTF8 5Dim bytes() As Byte = encoder.GetBytes(text) 6Dim b As Byte 7 8For Each b In bytes 9 sb.Append(String.Format("{0,8}", Convert.ToString(b, 2)).Replace(" ", "0")) 10 sb.Append(separator) 11Next 12
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.
|