Om entropi

Jeg har skrevet om entropi og Theil-indeks da jeg, for få år siden, havde en elev som skulle skrive en SRP (et studieretningsretningsprojekt) om ulighed. Da man typisk i 2.g ser på gini-koefficient, besluttede vi os for at se på et anden mål for ulighed, nemlig Theil-indekset. Det var svært at finde materiale på dansk om Theil-indekset, det var i det hele taget svært at finde noget for en gymnasielev om Theil-indekset. Vi koblede Theil-indekset med entropi, for på den måde at få lidt teoretisk dybde.

Indholdet er inspireret af Flemming Topsøes bog ‘Informationsteori’ fra 1973.

Man kan spørge hvad entropi har at gøre med kryptologi; måske ikke så meget, men entropi hænger sammen med informationsteori og dermed pakning af data, dvs. kodningsteori.

Vi vil her se på hvad der menes med begrebet entropi. Entropi er en størrelse der beskriver mængden af uorden i et system. Jo mere uorden, jo større er entropien.

Vi definerer den reelle entropi \(H_0\) som det antal ja/nej spørgsmål man, i gennemsnit, i en given situation skal stille, for at få klarhed.

Vi skal senere se på den ideelle entropi \(H\).

Den reelle entropi \(H_0\) er altså et tal. Er den reelle entropi \(H_0 = 3\) i en eller anden situation, så skal man altså, i gennemsnit, stille 3 spørgsmål for at få klarhed. Det er klart at det antal spørgsmål man skal stille afhænger af hvor snedigt man spørger, så vi antager at vi spørger så snedigt som muligt. Man snakker så om en optimal spørgestrategi.

Lad os begynde med at se på nogle eksempler.

Person A slår plat eller krone med en mønt. Person B er interesseret i at få at vide om det blev plat eller krone. Det er klart at person B skal stille ét spørgsmål for at få klarhed, så den reelle entropi ved forsøget er 1.

Person A tager et tilfældigt kort fra et kortspil. Person B er interesseret i hvilken kulør kortet har. Peron B kan ikke spørge hvilken kulør kortet har, for person B skal stille et ja/nej spørgsmål. Der er forskellige måder at spørge på.

Spørgestrategi 1 : Person B kan først spørge om kuløren har farven rød, og herefter, hvis svaret er ‘ja’, om kuløren er hjerter, hvis ‘nej’ så er kuløren hjerter. Hvis svaret på om kuløren er rød er ‘nej’, så kan man spørge om kuløren er klør, hvis ‘ja’ så er kuløren klør, eller må den være spar.

Spørgestrategi 2 : Person B kan også straks spørge om kuløren er klør, hvis ‘ja’, så kendes kuløren, hvis ‘nej’, så spørges om kuløren er hjerter. Hvis ‘ja’, så kendes kuløren, hvis ‘nej’, så spørges om næste kulør. Det virker meget kompliceret og uoverskueligt med al den tekst, det er bedre at opstille et ‘spørge-træ’:

Men hvad med den reelle entropi? Den reelle entropi er antallet af spørgsmål, men i gennemsnit skal stille, for at få svar på spørgsmålet ‘Hvilken kulør blev der så?’

Spørgestrategi 1 : Vi bliver nødt til at bruge sandsynligheder for at beregne den reelle entropi . Spørger man om farven er ‘rød’, så er der 50% for ‘ja’, og 50% for ‘nej’. Er farven sort, og spørger man om ‘klør’, så er der 50% for ‘ja’, og farven er klør, og 50% for ‘nej’ og farven er spar. Samme hvis farven er rød, så er der 50% for hjerter og 50% for ruder.

Hver af de fire muligheder har en sandsynlighed på 25%, og de kræver hver to spørgsmål. Det gennemsnitlige antal spørgsmål er dermed

\( p = 0.25 \cdot 2 + 0.25 \cdot 2 + 0.25 \cdot 2 + 0.25 \cdot 2 = 2 \)

Spørgestrategi 2 : Betragt træet herover. Først spørger vi om det er en klør. Er det en klør, så har vi fået svar ved brug af ét spørgsmål. Sandsynligheden for, at det er en klør, er naturligvis 1/4. Så sandsynligheden for, at vi kun skal stille et spørgsmål, er 1/4. Er det ikke en klør, så er næste spørgsmål “er det en hjerter”. Hvis svaret på dette er et ja, så har vi fået svar ved brug af to spørgsmål. Sandsynligheden for at vi får svar med to spørgsmål er 3/4 for at det ikke er en klør, ganget med 1/3 for at det er en hjerter. De sidste to kølører kræver begge tre spørgsmål. Beregningen er vist herunder.

\( p = \frac{1}{4} \cdot 1 + \frac{3}{4} \cdot \frac{1}{3} \cdot 2 + \frac{3}{4} \cdot \frac{2}{3} \cdot \frac{1}{2} \cdot 3 + \frac{3}{4} \cdot \frac{2}{3} \cdot \frac{1}{2} \cdot 3 = \frac{1}{4} + \frac{1}{2} + \frac{3}{4} + \frac{3}{4} = \frac{9}{4} = 2,25 \)

Bemærk at vi, for hvert ‘blad’ på træet ganger ‘antal grene der fører til bladet’ med alle de sandsynligheder der er undervejs, hvorefter vi lægger dette sammen for alle blade.

Ved at lade en computer vælge et tilfældigt kort (et tilfældigt tal blandt 1, 2, 3 eller 4), og så bruge spørgestrategi 2 til at gætte det udtrukne tal, så kan man let teste resultatet 2,25. Ved 100 gennemløb ender jeg med en reel entropi på 2,23. Ved 1000 gennemløb ender jeg med en reel entropi på 2,254. Ved 1 mio. gennemløb ender jeg med en reel entropi på 2,249.

Her er mit lille Basic-program:

10 rem Antallet af gennemløb kaldes for n
20 rem Det totale antal spørgsmål brugt kaldes for l
30 rem Der vælges så et tilfældigt tal blandt 1, 2, 3, 4
40 rem Hvis r=1 skal antal spørgsmål forøges med 1
50 rem Hvis r=2 skal antal spørgsmål forøges med 2
60 ren hvis r = 3 eller r = 4 skal antal spørgsmål forøges med 3
70 let n = 1000000
80 let l = 0
90 for i = 1 to n
100   let r = rnd(4)+1
110   let l = l+r
120   if r = 4 then let l = l-1
130 next i
140 print n,l/n

Vi ser altså, at den første spørgestrategi var mere effektiv end den anden spørgestrategi. Da den reelle entropi er det gennemsanitlige antal spørgsmål i den optimale spørgestrategi, så er den reelle entropien altså højst 2. Vi ved nemlig ikke om der er en spørgestrategi der er bedre end spørgestrategi 1.

Men det vender vi tilbage til…

Om RSA-kryptering

Når man krypterer en tekst med RSA-krypteringsmetoden, så krypterer man teksten ved brug af en nøgle. Den krypterede tekst sendes så til modtageren. Modtageren dekrypterer det vedkommende har modtaget, og står tilbage med den oprindelige tekst.

I RSA-kryptering har en person en privat nøgle og en offentlig nøgle. Den private nøgle holder personen for sig selv. Den offentlige nøgle kan offentliggøres.

Hvis man f.eks. skal sende en besked til banken, så henter man bankens offentlige nøgle. Man krypterer så beskeden ved brug af den offentlige nøgle. Så sender man den krypterede besked til banken. Når banken har modtaget den krypterede besked, så dekrypterer de den med deres private nøgle, og de kan så læse beskeden. Man så at sig ‘låser beskeden’ med den offentlige nøgle, og man ‘låser beskeden op’ med den private nøgle.

Principperne bag RSA-kryptering

Man finder først to store primtal \(p\) og \(q\).

Man ganger de to primtal med hinanden, resultatet kalder man \(n\) :

\( n = p \cdot q \)

Beregn så størrelsen \(\varphi(n)\)

\(\varphi(n) = (p-1) \cdot (q-1)\)

Find et tal \(e\) som er primisk med \(\varphi(n)\).

Da \(e\) og \(\varphi(n)\) er primiske, så vil man, med Euklids ‘omvendte algoritme’, kunne bestemme to tal \(d\) og \(k\), således at

\(e \cdot d + k \cdot \varphi(n) = 1 \)

Den private nøgle er så talparret \((d,n)\).
Den offentlige nøgle er talparret \((e,n)\).

Du tager nu din meddelelse \(m\). Beregn størrelsen

\(c = m^e \mod n\)

Dette er den krypterede meddelelse.

Du sender den krypterede meddelelse til modtageren. Modtageren beregner så værdien

\(c^d \mod n\)

Dette giver den oprindelige meddelelse \(m\).

For at gøre rede for hvorfor vi ender med den oprindelige meddelelse, så skal vi bruge Euler-Fermats sætning som siger, at er \(m\) og \(n\) indbyrdes primiske, så er

\(m^{\varphi(n)} = 1 \mod n\)

Dermed har vi at

\((m^e)^d = m^{ed} = m^{1-k \cdot \varphi(n)} = m \cdot m^{-k \cdot \varphi(n)} \newline \qquad \quad = m \cdot (m^{\varphi(n)})^{-k} = m \cdot 1^{-k} = m \mod n   \)

Hvorfor kryptering?

Antag at du vil sende en meddelelse til en ven via internettet. Måske vil du sende en ganske almindelig e-mail. Du skriver måske din meddelelse i dit favorit e-mail program, og trykker ‘send’; så sendes din meddelelse til din ven, som så, når vedkommende har modtaget den, kan læse hvad du skrev. Problemet er, at den meddelelse du har sendt, kan læses af enhver der ‘opsnapper’ meddelelsen mens den er undervejs.

Det er præcis samme problem du står med, hvis du vil sende et ganske elmindeligt brev. Fra du afleverer det i postkassen til modtageren har fået det, har du ikke kontrol over hvad der sker med det. Det kan være at postmanden åbner det undervejs og læser det. Det kan være at de på postkontoret læser al post. Det kan også være at naboen er interesseret i hvad du får af post, bryder ind i din postkasse, tager dine breve op, læser dem, lukker dem igen, og lægger dem tilbage i din postkasse.

For at undgå at uvedkommende kan læse dine meddelelser, så kan du kryptere dem. Du skriver altså en helt almindelig meddelelse. Så krypterer du den, dvs. du oversætter meddelelsen til noget kode-skrift ingen kan læse, udover dig selv og den der skal modtage meddelelsen. Du sender så den kryptere meddelelse til din ven. Vedkommende modtager en masse kode-skrift, men ved så hvordan denne kode-skrift skal omdannes til den oprindelige meddelelse. Hvis nogen opsnapper meddelelsen undervejs, så står vedkommende med det problem at meddelelsen indeholder en masse uforståeligt kodeskrift.

RSA med Maple

Jeg viser her hvordan man kan bruge matematik-programmet Maple til at kryptere og derefter dekryptere en meddelelse vha. RSA kryptering.


Trin 1: Først skal vi bruge to primtal p og q.

Man kan naturligvis tage de to primtal 11 og 13, eller andre små primtal man kender.

Man bør dog, hvis vi snakker sikkerhed, bruge meget store primtal, men princippet vises lettest ved at anvende små primtal.

Metoden jeg viser her kan bruges til vilkårligt store tal. Det skyldes at Maple ikke er begrænset af at skulle regne med tal med f.eks. 10 cifre.

Med Maple kan vi let finde lidt større primtal. Funktionen nextprime(tal) i Maple giver nemlig det første primtal der er større end tallet tal.

Eksempel: Vi vil bestemme det første primtal efter tallet 10:

\(nextprime(10)=11\)

Hvis vi derfor vil finde et primtal med f.eks. 3 cifre, så kan vi skrive nextprime(1000). Maple fortæller, at det første primtal, større end 1000, er tallet 1009. Dette kunne så være tallet p.

På samme måde kan vi finde det andet primtal q. Her tager vi f.eks. det første primtal større end 2000:

\(p:=nextprime(1000)=1009\)
\(q:=nextprime(2000)=2003\)

Vi skal nu beregne tallet n = pq. Det er bare at gange p og q sammen, og kalde resultatet for n:

\(n:=p \cdot q = 2021027\)


Trin 2: Nu skal vi beregne \(\varphi(n)\). Denne funktion \(\varphi(n)\) er Eulers \(\varphi\) -funktion.

Da n er et produkt af to primtal p og q, kan \(\varphi(n)\) beregnes således:

\(\varphi(n) = (p-1) \cdot (q-1) = 2018016\)


Trin 3: Vi skal nu finde et tal e, mellem 0 og \(\varphi(n)\), således at \(\gcd(e,\varphi(n)) = 1 \).

\(\gcd\) betyder ‘greatest common divisor’, eller på dansk; ‘største fælles divisor’.

At \(\gcd(e,\varphi(n)) = 1 \) betyder derfor, at det største tal, der både går op i e og \(\varphi(n)\), skal være tallet 1.

Vælger vi e som et primtal større end \(\varphi(n)/2\), så er vi hjemme: Da \(\varphi(n)\) er et primtal, går kun tallene 1 og \(\varphi(n)\) op i \(\varphi(n)\). Da e er valgt større end \(\varphi(n)/2\), så kan \(\varphi(n)\) ikke gå op i n. Den største fælles diviser for \(\varphi(n)\) og n er dermed 1.

Vi bruger igen nextprime for at finde e:

\(e:=nextprime(\frac{\varphi(n)}{2})=1009037\)

Nu skal vi finde endnu et tal d, således at \(e \cdot d \equiv 1 \mod \varphi(n)\). Det er en ligning Maple kan løse:

\( msolve(e \cdot d = 1,\varphi(n))=730661\)

Nu har vi altså tallene \(p, q, n = p \cdot q\), og de to tal \(e\) og \(d\).

Den offentlige nøgle er talparret \(n,e\).

\(n = 2021027 \) og \( e = 1009037\)

Den private nøgle er talparret \(n,d\).

\(n = 2021027 \) og \( d = 730661\)


Trin 4: Kryptering og dekryptering.

En tekst omsættes let til en række tal, f.eks. kan man bruge at bogstavet ‘A’ svarer til tallet 1, bogstavet ‘B’ svarer til tallet 2, o.s.v.

Vi forestiller os at vi har oversat en vigtig tekst til tallet \(m = 342391\).

Dette tal skal vi nu kryptere med vores RSA krypterings metode. Vi beregner

\(c = m^e \mod n = 169931\)

Den vigtige meddelelse 342391 krypteres altså til tallet 169931. Dette tal sendes til modtageren, og modtageren skal så dekryptere tallet 169931 til den vigtige besked 342391.

Modtageren beregner så

\(c^d \mod n = 342391\)

Den krypterede meddelelse 169931 dekrypteres altså til den oprindelige meddelelse 342391.


Alt i alt med Maple:

Bestemmer p, q og n:
\(p:=nextprime(1000)=1009\)
\(q:=nextprime(2000)=2003\)
\(n:=p \cdot q = 2021027\)

Bestemmer \(\varphi(n)\)
\(\varphi:= (p-1) \cdot (q-1) = 2018016\)

Bestemmer e :
\(e:=nextprime(\frac{\varphi}{2})=1009037\)

Bestemmer d:
\(msolve(e \cdot d = 1,\varphi)=730661\)
\(d:=730661\)

Meddelsen skrevet som et tal:
\(m:=342391\)

Den krypterede meddelelse:
\(c := m^e \mod n = 169931\)

Den dekrypterede meddelelse:
\(c^d \mod n = 342391\)