Nån form av inledning
Jag vet att jag har skrivit sånt här förut, men upprepning är alltid bra har jag hört.
Dessutom så känns det som att ämnet är något många känner att man borde göra, men det är ju så komplicerat och jobbigt och man vet inte hur eller varför egentligen så därför faller det i glömska.
Sen var det länge sen jag ordbajsade fritt…
Varför kryptering?
Genom alla tider har människor haft behov av att kunna skydda meddelanden av olika slag och av olika anledningar, från ganska oskyldiga saker som kärleksbrev till statshemligheter.
De flesta anser att brev är privata och att endast mottagaren har rätten att bestämma vem som får se innehållet, när telegrafen infördes så blev det ganska vanligt att gemene man utnyttjade enklare krypteringar för att inte telegrafisten skulle kunna ta del av meddelandets egentliga innehåll.
Bilden av ett brev i ett kuvert är något många ser framför sig när man pratar e-mail också, bilden brukar vara att brevet går från sändaren till mottagaren och att ingen på vägen läser det. Denna bilden är helt felaktig.
Att diverse säkerhetstjänster trålar internet efter information är belagt i dagsläget, men vad många inte tänker på är att andra aktörer såsom google, hotmail och yahoo samt mer ljuskygga organisationer gör samma sak för att kartlägga våra vanor och informationsmönster i olika syften. Och även om våra e-mail inte innehåller några hemligheter så är de privata och endast för mottagarens ögon.
Så för att skydda information och se till att endast rätt personer kan läsa den får man ta till kryptering. Dock så lider kryptering av ett stort problem nämligen; hur tusan ska man kunna överföra nyckeln som låser upp informationen till mottagaren på ett säkert sätt?
Lösningen är att man skapar ett system med två nycklar där den ena används för att kryptera informationen och den andra för att dekryptera den, istället för en som används till båda sakerna. Nyckeln som används för kryptering kan spridas till vem som helst medan nyckeln för dekryptering behålls hemlig.
Så vad gör GPG?
Krypterar information. Bland annat…
Det längre svaret är att GPG är ett såkallat hybridsystem som krypterar informationen med en slumpmässigt skapad symmetrisk nyckel (alltså en nyckel som både krypterar och dekrypterar), denna slumpmässiga nyckel krypteras sedan med mottagarens publika nyckel och läggs till som ett huvud till informationen. Mottagaren kan sedan dekryptera den slumpmässiga nyckeln och därefter dekryptera resten av informationen.
Varför gör man det då så komplicerat?
Jo, systemen som utnyttjar två nycklar är extremt långsamma jämfört med systemen med en nyckel (sist jag såg siffror på det handlade det om tiopotenser i skillnad). Men problemet med systemen med en nyckel är just hur man överför nyckeln till mottagaren.
Vidare så ger tvånyckelsystemen en annan fördel; man kan skapa digitala signaturer med dem. Grundteorin här är att man istället för att kryptera informationen med mottagarens publika nyckel så krypterar man med sin egna privata nyckel. Detta får till följd att alla (som har personens publika nyckel) kan dekryptera informationen och på så vis konstatera att någon med tillgång till den privata nyckeln är den som är avsändare av meddelandet.
Jaja, så var får jag tag på GPG?
Man hoppeliskuttar till http://www.gnupg.org/, klickar på download och scrollar lite.
Hur skapar jag en nyckel?
Det är nu det kommer börja bli rörigt, eftersom det skiljer sig en del åt för olika plattformar men jag tänker göra ett försök…
Kommandorad (*nix, men troligen de andra också)
Den mest rakt på metoden, inget fancy och lull-lull. Dock kanske skrämmande för en del.
1. Öppna en kommandotolk på valfritt sätt.
2. Om gpg finns i din sökväg behöver du inte göra något, annars får du ta dig till rätt katalog.
3. Skriv följande:
gpg --gen-key [enter]
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
Den eviga frågan är här vilken man ska välja, val 1 och 2 är jämförbara säkerhetsmässigt (det finns några quirks med val 2, men de är inte direkt allvarliga) och det finns prestandamässiga skillnader mellan dem i olika fall. Val 1 är dock standard så man kan lika väl köra på det. Den som är intresserad kan alltid googla ”gpg rsa vs. elgamal” och fundera själv ;)
1[enter]
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
1024 bitar räcker troligen om man vill vara säker, 2048 räcker definitivt, men med dagens processorer finns ingen anledning att inte köra på max.
4096[enter]
Requested keysize is 4096 bits
Please specify how long the key should be valid.
0 = key does not expire
n = key expires in n days
nw = key expires in n weeks
nm = key expires in n months
ny = key expires in n years
Key is valid for? (0)
Här finns lite olika skolor hur man bör/kan tänka. Värt att notera är att nyckeln inte slutar fungera helt när den gått ut, man kan dekryptera saker och man kan verifiera signaturer med en utgången nyckel. Man kan dock inte signera eller kryptera med en utgången nyckel.
Mitt upplägg är att jag har en ”huvudnyckel” som inte går ut, som används för att signera andra nycklar (mer om det senare), med ett antal subnycklar (kommer nog mer om det också) som har en livslängd på ett år.
0[enter]
Key does not expire at all
Is this correct? (y/N)
y[enter]
You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
”Heinrich Heine (Der Dichter) ”
Real name: otyg test [enter]
Email address: otyg@gallowsground.lan [enter]
Comment: Testkey [enter]
You selected this USER-ID:
”otyg test (Testkey) ”Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?
O[enter]
You need a Passphrase to protect your secret key.
Se till att skapa en bra lösenfras, som du kan komma ihåg… Och spara den nånstans säkert!
Tappar du bort den så är det kört, det finns INGET sätt (för oss dödliga, och troligen inte för de odödliga heller) att knäcka nycklarna så tappas lösenfrasen bort så är nycklarna oanvändbara (eller ja, den publika kan användas…).
Efter lösenfrasen skapas nyckeln, och till det behövs en massa slump så programmet kommer be dig skriva på tangentbordet och annat för att den ska kunna samla tillräckligt med underlag till slumpgeneratorn. Därefter är nycklarna klara att användas.
Jag kommer återkomma hur man gör ovanstående i gui-varianterna (gpg4win främst eftersom jag inte har tillgång till nån Apple-maskin) när jag riggat miljö för det.
Vad gör jag med mina nycklar nu då?
Den hemliga skyddar du med ditt liv och ser till att ta backup på, filen heter secring men man kan exportera en specifik hemlig nyckel också på ungefär samma sätt som med den publika nyckeln vilket jag kommer gå igenom nedan.
Den publika sprider du antingen helt öppet eller till specifika personer, helt beroende på tycke och smak.
Att sprida den publika nyckeln fritt för vinden är löjligt enkelt, man skickar upp den till en s.k. nyckelserver (det finns en drös och majoriteten av dem synkar mellan varandra). Såhär går man tillväga för att skicka nycklarna till en server:
gpg --send-keys [nyckel-id]
Nyckel-id visades när du skapade din nyckel, men kan även tas fram med kommandot gpg –list-key som genererar nåt liknande det nedan:
pub 2048R/1EC847E0 2011-08-21
uid otyg [otyg@gallowsground.lan]
I ovanstående fall är nyckel-id 1EC847E0 eller 0x1EC847E0.
Om man nu av en eller annan anledning inte vill sprida sin nyckel till vemsomhelst så kan man exportera den till en fil som kan skickas till personen (såhär kan man även exportera sina privata nycklar) på följande sätt
gpg -a --export [nyckel-id] > [filnamn]
Flaggan a gör att saker trillar ut som ASCII och därmed kan skickas på valfritt sätt utan problem.
Det som trillar ut är något i stil med
—–BEGIN PGP PUBLIC KEY BLOCK—–
Version: GnuPG v1.4.11 (GNU/Linux)mQSuBFLgyIsRDADT0Xa9fYM+GGRLenwJC8b6OwhCnEh6coqsLrWi+MRbNWRQqLvF
(…)
7K3vIpoIqTnh1M/4kCxjfQ==
=OF6I
—–END PGP PUBLIC KEY BLOCK—–
Hur kryptera/dekryptera/signera/kontrollera signatur?
Återigen så blir det kommandorad, och det blir att hantera filer på disk (gpg4win gör att man kan högerklicka och kryptera/dekryptera/signera/kontrollera en fil vet jag).
För att kryptera en fil är något av kommandona
gpg -e -r [mottagare] [fil]
gpg -ae -r [mottagare] [fil]
som gäller. Det senare ger en ASCII-fil medan det förra ger en binärfil som kan ställa till problem vid överföring.
För att signera en fil gör man något av följande
gpg -[a]s [fil]
gpg --clearsign [fil]
gpg --detach-sign [fil]
och uppger sin lösenfras. Den första ger en binär signatur av filen, om inte a-flaggan tas med, den andra ger en ascii-signatur av filen och den tredje ger ett separat ”certifikat” för filen. Dom mer tekniska skillnaderna mellan varianterna lämnar jag till den intresserade läsaren att utforska. Generellt så använder jag clearsign när jag bara signerar och -[a]es när jag krypterar och signerar.
För att dekryptera eller kontrollera en fil skriver man bara
gpg [filnamn.ändelse].{asc,sig,gpg}
Är den krypterad kommer du få frågan om din lösenfras, är den signerad kommer det visas av vem den är signerad och i båda fallen kommer en ny fil skapas som saknar ”extraändelsen”.
…mottagarens nyckel?
Hur får man då tag på en mottagares nyckel?
Precis som i fallet med att sprida sin egen nyckel kan man antingen plocka den från en exporterad fil som man har fått från personen, eller genom att hämta den från en nyckelserver.
Har man fått den exporterade nyckeln i en fil är operationen enkel.
gpg --import [filnamn]
För att hämta nycklarna från en nyckelserver kör man följande
gpg --recv-key [nyckel-id] --keyserver [nyckelserver]
För att hitta en persons nyckel kan man köra kommandot
gpg --search-keys [namn email] --keyserver [nyckelserver]
som även importerar den.
Slutligen så kan man importera den direkt från en url med kommandot
gpg --fetch-keys [url]
Men hur fasen vet jag att det är person Xs nyckel jag har?
Det korta svaret är: det vet du inte om du har hämtat den från en nyckelserver, e-mail eller url.
Men för att kunna avgöra ifall man kan lita på att en nyckel kommer från den person som man tror att den tillhör så kan andra personer signera en nyckel, och om tillräckligt många personer som du litar på bevisligen har signerat en nyckel så kan man anta att den nyckeln tillhör en person de litar på.
Ett exempel som tillämpar en annan modell är SSL-certifikaten som man använder när man surfar säkert, dessa är hierarkiskt signerade av en rot-auktoritet som säger att den litar på utfärdarna av certifikaten som säger att de litar på de som vill ha sina certifikat signerade.
Tillitsmodellen i gpg är decentraliserad och du väljer själv ifall du litar på en publik nyckel eller ej, och du väljer själv att berätta för omvärlden att du litar på en nyckel eller ej. Om man litar på att en nyckel kommer från den som den verkar komma ifrån så signerar man den, exporterar och skickar till ägaren av nyckeln (som sedan väljer ifall den vill publicera den signerade nyckeln eller ej). På detta sättet byggs ett nät av tillit upp runt en nyckel, dock så är många signaturer på en nyckel inte samma sak som att nyckeln är att lita på.
Tanken är snarare att man ska kunna hitta en kedja från en okänd nyckel till en person som man litar på, den där six degree of separation-grejen.
Så hur signerar man en nyckel då? Såhär:
gpg --sign-key [nyckel-id]
gpg -a --export [nyckel-id]
Den sista är bara om man vill skicka den till ägaren till nyckeln så att hän vet att ytterligare en person litar på nyckeln.
Check… Låter jobbigt… Kan man göra det roligt?
Jadå, man kan dra ihop en nyckelsigneringsfest och beroende på antalet deltagare kan man göra det hur jobbigt (och roligt) som helst. Grundbulten här är att alla ska kunna identifieras och kunna kopplas med deras nyckel-id och nyckel-fingeravtryck, sen kan man antingen på plats signera varandras nycklar eller göra det i hemmets lugna vrå.
För mer info och idéer hur det ska gå till; se dessa sidor!
Ok, fint. Men hur får jag skiten att funka med min mejlklient/gmail/whatever?
Det är här det riktigt jobbiga börjar. Det finns plugins till de flesta mejlklienter som är mer eller mindre användarvänliga, till Thunderbird (och derivat) rekommenderar jag EnigMail, gpg4win tror jag har en del plugins eller integrationer till Outlook och windows mail, men det enklaste är att googla.
Kör man webmail som gmail eller hotmail så får man leta reda på plugins till webbläsaren som kan sköta operationerna via klipp-klistra, WebPG är ett sådant plugin till Firefox och Chrome(/ium) som jag har använt med skiftande resultat.
Fattigmansversionen är att skriva det man vill i lämplig editor, kryptera/signera till ascii-armoured och klippa ut och klistra in manuellt.
Das Ände
Helt ärligt så är jag inte särskilt nöjd med ovanstående textvägg, men jag hoppas att någon någonstans kommer finna den användbar på ett eller annat sätt.
För den som vill hitta åt min gpg-nyckel så finns den här.