<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE artikkel PUBLIC "-//infoweb.ntnu.no//DTD Infoweb 1.0//NO"
"http://infoweb.orakel.ntnu.no/infoweb.dtd">

<artikkel spraak="no">
<tittel>Kryptografi og PGP</tittel>
<forfatter>grip</forfatter>
<sammendrag>Generell informasjon om kryptografi og bruk av PGP</sammendrag>

<hoveddel>

<os2>Litt om kryptografi</os2>
<avsnitt>
  Formålet med kryptografi er overføring av informasjon mellom to punkter, der kun avsender og mottaker
  kan forstå innholdet. Dette gjøres ved at senderen gjør den opprinnelige informasjonen om til uforsåelig, "kryptisk" 
  informasjon, slik at den ikke gir mening for utenforstående som eventuelt snapper den opp. Det må
  imidlertid være mulig for mottaker å forstå informasjonen. Dette oppnås ved hjelp av en krypteringsalgoritme, som benytter seg av en eller flere krypteringsnøkler, som fastsettes av de involverte partene. Både sender og mottaker har en nøkkel, som brukes til henholdsvis kryptering og
  dekryptering av informasjonen.
</avsnitt>

<os3>Konvensjonell kryptografi</os3>
<avsnitt>
  Den tradisjonelle, konvensjonelle formen for kryptografi er såkalt symmetrisk, 
  som innebærer at sender og mottaker sitter
  inne med samme informasjon. Ved bruk av nøkler kalles dette også hemmelig nøkkel-kryptografi.
  Sender bruker nøkkelen til å kryptere innholdet, mens mottaker reverserer prosessen
  ved å bruke den samme nøkkelen. Flere symmetriske krypteringsalgoritmer brukes i utstrakt grad. Den
  mest kjente er DES-algorimen (Data Encryption Standard), utviklet av IBM på 1970-tallet. Denne
  typen kryptering medfører imidlertid et problem. Krypteringsnøkkelen må holdes hemmelig, men den må 
  i utganspunktet utveksles
  mellom de to partene som skal benytte den, uten at noen andre får fatt i den. 
  Hvis selve nøkkelen blir kompromittert er
  krypteringen selvsagt verdiløs og gir en falsk trygghet. Da kan
  utenforstående både forstå informasjonen som blir utvekslet, og selv sende ut forfalsket informasjon,
  kryptert med nøkkelen.
</avsnitt>

<os3>Offentlig nøkkel</os3>

<avsnitt>
  En moderne form for kryptografi er såkalt offentlig nøkkel-kryptografi.  Mye brukte krypteringsalgoritmer av denne typen er RSA, DH og DSA. Med denne typen
  kryptografi har sender og mottaker forskjellige nøkler. Hver person som ønsker å utveksle kryptert
  informasjon genererer sitt eget sett med nøkler, som inneholder én privat nøkkel, og én offentlig
  nøkkel. Den offentlige nøkkelen distribueres så fritt til alle som man vil utveksle
  kryptert informasjon med. Det gjør ingen ting om denne snappes opp av utenforstående. Den offentlige
  nøkkelen kan nemlig kun benyttes til kryptering. For å dekryptere innholdet igjen må den private
  nøkkelen benyttes, og denne er det kun eieren av nøkkelsettet som har. En utveksling av informasjon
  foregår dermed på følgende måte, hvis A vil sende en kryptert epost til B: 
</avsnitt>

  <ul>
  <li>Hvis A ikke allerede har Bs offentlige nøkkel, må han få den. Denne kan for eksempel sendes i 
  en epost fra B til A (ukryptert), eller legges ut på Bs web-side så A kan hente den derfra.</li>
  <li>A krypterer eposten med Bs offentlige nøkkel, og sender den til B. Eventuelt utenforstående 
  som snapper opp eposten på veien kan ikke dekryptere innholdet, selv om de også innehar Bs 
  <kursiv>offentlige</kursiv> nøkkel.</li>
  <li>Når B mottar eposten, dekrypterer han den til den opprinnelige meldingen med sin private
  nøkkel.</li>
  </ul>

<avsnitt>
  Denne formen for kryptografi er prinsippielt basert på store primtall, og det faktum at det er, med den
  kunnskap man har i dag, langt vanskeligere å faktorisere et produkt av store primtall enn å
  multiplisere primtallene for å danne produktet. Det er ikke matamatisk bevist at faktorisering 
  er vanskelig, men det har så langt vist seg vanskelig i praksis.
  Dersom man skal knekke krypteringen må man foreta
  faktoriseringen for å finne de opprinnelige primtallene. Denne matamatiske koblingen mellom den
  offentlige og den private nøkkelen gjør det altså teoretisk mulig å finne den private nøkkelen
  dersom man har den offentlige, det krever bare abnormt stor datakraft og lang tid. Hvor vanskelig det er å
  knekke krypteringen er derfor helt avhengig av hvor store tall man har med å gjøre. Derfor angis
  styrken på krypteringen i antall bits. Jo flere bits' kryptering, jo større regnekapasitet kreves for å
  knekke den. Konvensjonell kryptografi er også basert på enormt store tall, men denne typen kryptografi krever ikke på langt nær så store tall som offentlig nøkkel-kryptografi for å være sikker.
</avsnitt>

<os3>Digitale signaturer</os3>

<avsnitt>
  En digital signatur er en analogi til en vanlig fysisk signatur. Når man signerer noe digitalt,
  benyttes den <kursiv>private</kursiv> nøkkelen til å lage signaturen. Signaturen kan så leses
  av en mottaker ved hjelp av den <kursiv>offentlige</kursiv> nøkkelen, på sett og vis omvendt fra
  selve krypteringen. Dersom signaturen kan leses av den offentlige nøkkelen, må den være laget med den
  private, og dette bekrefter avsenderens identitet. Signaturen dannes ut ifra innholdet i det som
  signeres og den private nøkkelen, og dermed kan ikke en signatur skilles fra innholdet. Det er derfor ikke
  mulig å benytte en signatur i ett dokument til å forfalske en signatur i et annet.
</avsnitt>

<os3>Sertifikater</os3>

<avsnitt>
  Et åpenbart problem med offentlig nøkkel-prinsippet er at, med mindre man får overrakt den offentlige 
  nøkkelen fysisk fra en person, kan man aldri være sikker på at man har mottatt riktig nøkkel, og ikke
  en forfalskning. Dette er grunnen til at offentlige nøkler distribueres med et digitalt sertifikat. Dette
  består i praksis av informasjon om identiteten til nøkkeleieren (som navn og epost-adresse), samt en
  eller flere digitale signaturer som bekrefter sammenhengen mellom identiteten og nøkkelen. 
  Det hele er basert på tillit. Sertifikatet må være signert av noen som mottaker stoler på, en
  autoritet. Mottaker stoler da på at denne autoriteten serverer sannheten, gjennom den digitale
  bekreftelsen. Dette forutsetter at mottakeren allerede innehar den offentlige nøkkelen til denne
  autoriteten, og dermed kan lese signaturen. Enkelte selskaper lever av å gi sin garanti gjennom slike
  sertifikater.
</avsnitt>

<os3>Fingeravtrykk</os3>

<avsnitt>
  En annen måte å sjekke om en offentlig nøkkel er autentisk er gjennom såkalte fingeravtrykk. Et
  fingeravtrykk er en såkalt hash av nøkkelen. Hash'en genereres av en enveis hash-funksjon. Denne
  returnerer informasjon av en bestemt størrelse, selv om argumentet kan være av variabel størrelse. Hash-funksjonen er slik at dersom argumentet forandres, vil hashen bli forskjellig. Funksjonen er konstruert slik at dette gjelder selv for en forandring i kun èn bit i de størst tenkelige argumentene den vil motta. Det er ikke mulig å reversere prosessen og utlede den opprinnelige informasjonen ut ifra hash'en. Et fingeravtrykk er en hash av en offentlig nøkkel som er relativt liten i størrelse og lett 
  lesbar. Dette kan for eksempel benyttes dersom man kjenner stemmen til eieren av nøkkelen, og kan
  kontakte ham/henne på telefon. Eieren får også generert fingeravtrykket av sin nøkkel, og man kan sammenligne disse over telefonen.
</avsnitt>

<os2>PGP</os2>
<avsnitt>
  PGP står for Pretty Good Privacy og ble opprinnelig utviklet av amerikaneren Philip R. Zimmermann 
  som et freeware-produkt. Det er i dag den mest
  brukte krypteringprogramvaren for epost i verden. PGP er nå et kommersielt produkt, men distribueres
  gratis for ikke-kommersiell bruk. PGP navngir i praksis en protokoll for kryptert informasjon, signaturer og sertifikater for utveksling av
  offentlige nøkler, som definert i OpenPGP-standarden. En gratis programvare som følger denne standarden er GnuPG (Gnu Privacy 
  Guard). Du kan laste ned PGP-programvare for forskjellige platformer <ekstern
  uri="http://www.pgpi.org">her</ekstern>.
</avsnitt>

<os3>Prinsippene bak PGP</os3>

<avsnitt>
  PGP benytter seg av en kombinasjon av flere av teknikker. 
</avsnitt>

<ul>
<li>Først komprimeres informasjonen, for å
  minske størrelsen og øke sikkerheten ved å redusere gjentakelser.</li> 
<li>En tilfeldig
sesjonsnøkkel blir opprettet ut fra uforutsigbare inn-verdier, som tiden mellom hvert tastetrykk på tastaturet eller musens bevegelse. Denne sesjonsnøkkelen benyttes kun denne ene gangen. Neste gang noe krypteres genereres en ny. Dette gjør at dersom man krypterer samme informasjon to ganger med samme nøkkel, vil resultatet bli helt forskjellig.</li>

<li>Sesjonsnøkkelen er en krypteringsnøkkel som brukes til å kryptere informasjonen med en konvensjonell
  <kursiv>symmetrisk</kursiv> algoritme. Årsaken til dette er at symmetrisk kryptering er mye raskere
  enn kryptering med offentlig nøkkel.</li>
<li>Sesjonsnøkkelen krypteres med mottakerens offentlige nøkkel, og legges ved den allerede krypterte informasjonen.
  På den måten kan kun mottakeren finne fram til den symmetriske nøkkelen brukt i krypteringensprosessen, og således dekryptere informasjonen.</li>
<li>Til slutt signeres informasjonen. Signaturen genereres imidlertid ikke direkte ut ifra informasjonen som skal sendes og den private nøkkelen. Dersom man hadde gjort det slik, ville man fått en enormt stor signatur, og
  det hele ville tatt lang tid.
  Derfor genereres det istedet en hash av informasjonen, og signaturen
  genereres ut ifra hash'en og senderens private nøkkel. Dette fungerer fordi, dersom innholdet blir forandret på veien fra sender til mottaker, vil også hash'en forandres og signaturen vil ikke være gyldig.</li>
</ul>

  
<os2>PGP i praksis</os2>

<avsnitt>
  Her følger en liten oversikt over bruk av PGP, basert på et kommandolinje-grensesnitt. For forskjellige programvarer/versjoner vil syntaksen vaiere noe, men prinsippene er de samme. Her vises noen enkle kommandoer for PGP versjon 6.5.8 og GnuPG versjon 1.2.1 for unix.
</avsnitt>

<avsnitt>
  Dersom du ikke allerede har programvaren installert, må du gjøre dette. Instruksjoner for dette følger med når du laster ned produktet. Når
  det er installert, benyttes det ved å kjøre programmet <kommando>pgp</kommando> (PGP) eller <kommando>gpg</kommando> (GnuPG) med diverse
  argumenter. For en oversikt over kommandoene kjøres <kommando>pgp -h</kommando> eller <kommando>gpg -h</kommando>. Det første man
  normalt vil foreta seg er å <uthev>opprette et eget nøkkelpar</uthev>. For å gjøre dette skriver man
</avsnitt>

<avsnitt>
  <konsoll>
    For PGP:
    $ pgp -kg

    For GnuPG
    $ gpg --gen-key
  </konsoll>
</avsnitt>

<avsnitt>
  Følg instruksjonene og svar på spørsmålene som kommer. Velg fortrinnsvis å opprette nøkler for DSS/DH-algoritmene (kalt DSA/ElGamal i GnuPG). I PGP må du først velge å lage en signaturnøkkel, og
  deretter svare ja på spørsmålet om du vil lage en krypteringsnøkkel som skal høre sammen med denne.
  Når programmet er ferdig har det opprettet et sett med nøkler som er dine. Det har også opprettet 
  en offentlig og en
  hemmelig "nøkkelring", som er lagret under katalogen <kommando>.pgp</kommando> eller <kommando>.gnupg</kommando> på ditt hjemmeområde. 
  Disse inneholder dine
  egne nøkler, og den offentlige nøkkelringen vil dessuten inneholde nøklene du etter hvert mottar fra 
  andre for å kunne sende kryptert informasjon til dem.
</avsnitt>

<os3>En liten test</os3>
<avsnitt>
  Du har nå alt du trenger for å kryptere i vei. Du har imidlertid ikke andre offentlige nøkler
  enn din egen (enda), men for å se hvordan ting fungerer kan du kryptere noe med denne, og dekryptere det 
  igjen med din private nøkkel. Opprett en vanlig tekstfil du vil kryptere. I eksemplet bruker vi en 
  tekstfil ved navn <kommando>pgptest</kommando>. Skriv
</avsnitt>

<avsnitt>
  <konsoll>
    For PGP:
    $ pgp -es pgptest "bruker-id"
    
    For GnuPG:
    $ gpg -es -r "bruker-id" pgptest 
  </konsoll>
</avsnitt>

<avsnitt>
  der bruker-id er bruker-id'en (normalt navn og/eller epost-adresse) til den som skal motta den
  krypterte informasjonen. I dette tilfellet er det du, så skriv din egen bruker-id, som du valgte under
  opprettelsen av nøklene. Dersom du satte en pass-phrase på den hemmelige nøkkelen din (anbefalt), blir du bedt om å skrive inn denne, fordi den brukes til signaturen. Programmet vil nå opprette en fil med navn
  <kommando>pgptest.pgp</kommando>, som er innholdet i <kommando>pgptest</kommando> kryptert med 
  mottakerens (din) offentlige nøkkel, og signert med din private nøkkel. Skriv
</avsnitt>

<avsnitt>
  <konsoll>
    $ cat pgptest.pgp
  </konsoll>
</avsnitt>

<avsnitt>
  for å se på innholdet av filen. Som du ser er den krypterte versjonen av filen uforståelig, men den er
  også i et format som er dårlig egnet til for eksempel epost. For å kryptere den og lagre den med
  vanlige ASCII-tegn kan du legge til en "a" i opsjonslisten:
</avsnitt>

<avsnitt>
  <konsoll>
    For PGP:
    $ pgp -esa pgptest "bruker-id"
    
    For GnuPG:
    $ gpg -esa -r "bruker-id" pgptest
  </konsoll>
</avsnitt>

<avsnitt>
  Hvis du nå ser på innholdet av filen
  <kommando>pgptest.asc</kommando>, ser du den krypterte versjonen av filen i et bedre format for
  epost-kommunikasjon. Prøv nå å
  <uthev>dekryptere filen</uthev> igjen ved å skrive
</avsnitt>

<avsnitt>
  <konsoll>
    For PGP:
    $ pgp pgptest.asc

    For GnuPG:
    $ gpg pgptest.asc
  </konsoll>
</avsnitt>

<avsnitt> Dersom du har satt en pass-phrase vil du igjen bli bedt om dette, for å dekryptere med den private nøkkelen. 
  Programmet vil protestere på at filen <kommando>pgptest</kommando> allerede eksisterer, og be deg om
  et nytt filnavn. Skriv for eksempel inn <kommando>pgptest2</kommando>, og se på innholdet av denne når
  programmet er ferdig. Den inneholder nå nøyaktig det samme som den originale
  <kommando>pgptest</kommando>. Programmet sier også fra om at signaturen på filen er gjenkjent og
  gyldig.
</avsnitt>

<os3>Behandling av nøkler</os3>
<avsnitt>
  Det vi har gjort hittil fungerer veldig fint dersom du kun skal utveksle informasjon med deg selv. 
  Dersom du vil at
  andre skal kunne kryptere informasjon til deg, må du imidlertid kunne distribuere din offentlige nøkkel.
  Du kan <uthev>eksportere din offentlige nøkkel</uthev> til en ASCII-fil med kommandoen
</avsnitt>

<avsnitt>
  <konsoll>
    For PGP:
    $ pgp -kx "bruker-id" filnavn

    For GnuPG:
    $ gpg --export -a -o filnavn "bruker-id" 
  </konsoll>
</avsnitt>

<avsnitt>
  der bruker-id igjen er din bruker-id, og filnavn er navnet på filen du vil skrive nøkkelen til. Du kan
  nå distribuere denne filen til de som har bruk for å sende kryptert informasjon til deg. Tilsvarende
  vil du motta andres offentlige nøkler, og du kan <uthev>legge til</uthev> disse i din nøkkelring med 
  kommandoen
</avsnitt>

<avsnitt>
  <konsoll>
    For PGP:
    $ pgp -ka filnavn

    FOR GnuPG:
    $ gpg --import filnavn
  </konsoll>
</avsnitt>

<avsnitt>
  der filnavn er navnet på filen med nøkkelen i. Når du har lagt den til kan du sjekke om noen av
  signaturene som kom med nøkkelen er kjente, ved å skrive
</avsnitt>

<avsnitt>
  <konsoll>
    For PGP:
    $ pgp -kc "bruker-id"

    For GnuPG:
    $ gpg --check-sigs "bruker-id"
  </konsoll>
</avsnitt>

<avsnitt>
  Dersom den er signert av noen du stoler på, kan du velge å godta dette som bevis på at nøkkelen er ekte. Du
  kan selv signere andres offentlige nøkler med kommandoen
</avsnitt>

<avsnitt>
  <konsoll>
    For PGP:
    $ pgp -ks "bruker-id"

    For GnuPG:
    $ gpg --sign-key "bruker-id"
  </konsoll>
</avsnitt>

<avsnitt>
  For å vise <uthev>fingeravtrykket</uthev> til en nøkkel, bruk kommandoen
</avsnitt>

<avsnitt>
  <konsoll>
     For PGP:
     $ pgp -kvc "bruker-id"

     For GnuPG:
     $ gpg --fingerprint "bruker-id"
  </konsoll>
</avsnitt>

<os3>Andre muligheter</os3>

<avsnitt>
   Dette er de mest grunnleggende kommandoene, og minimumet for å kunne utveksle kryptert informasjon
   med andre ved hjelp av PGP/GnuPG. Det finnes flere muligheter som ikke er nevnt her, blant annet muligheten
   for å sette opp i hvor stor grad du stoler på hver person på nøkkelringen din. Det anbefales
   å se gjennom manualsidene til programmet, ved hjelp av kommandoen <kommando>man pgp</kommando> eller <kommando>man gpg</kommando>.</avsnitt>

</hoveddel>
</artikkel>
