Asymmetrisk kryptering – förklarat med 3 exempel

Asymmetrisk kryptering används ofta för att skicka den nyckel som används vid symmetrisk kryptering för att denna skall hållas säker.

Symmetrisk kryptering bygger på att man delar en och samma nyckel och använder denna för att både dekryptera och kryptera meddelandet. Fördelen med denna metod är att den är snabb att genomföra. Eftersom nyckeln är delad är det stor risk att nyckeln kommer i orätta händer och därmed är krypteringen forcerad, vilket innebär en stor nackdel med symmetrisk kryptering.
Asymmetrisk kryptering bygger på att varje part som man kommunicerar med har en publik nyckel och en privat.

Den privata nyckeln ger man inte ut till någon. Den publika är däremot offentlig och vem som helst kan ta del av den.
Den vanligaste typen av asymmetrisk kryptering är RSA (Ron Rivest, Adi Shamir, and Leonard Adleman), men ett annat exempel är Diffie-Hellman (Whitfield Diffie and Martin Hellman).

Jag går igenom tre tillfällen där man kan använda asymmetrisk kryptering.

Kommunicera via asymmetrisk kryptering

I vårt fall har vi Bob och Alice, som skall kommunicera krypterat.
Vi skall för enkelhetens skull förklara rutinen när Bob skickar ett meddelande till Alice.

Förutsättningar

  • Bob har en privat och publik nyckel.
  • Alice har en privat och en publik nyckel.
  • Varken Bob eller Alice ger ut sina privata nycklar.

Bob hämtar Alice publika nyckel och krypterar meddelandet med denna. När meddelandet är krypterat går det inte att dekryptera det med den publika nyckeln igen. Bob skickar meddelandet till Alice som sedan kan läsa Bobs meddelande genom att dekryptera meddelandet med sin egna privata nyckel.

När Alice skall skicka ett meddelande tillbaka till Bob hämtar hon Bobs publika nyckel och använder den för att kryptera meddelandet. Bob använder sedan sin privata nyckel för att dekryptera meddelandet.

Kryptera nyckel

Asymmetrisk kryptering är en metod som tar mycket processorkraft och därför lång tid att genomföra..
Det är därför vanligt att man använder symmetrisk kryptering för själva meddelandet och använder sedan asymmetrisk kryptering för att kryptera nyckeln. På det sättet får man en säker nyckelhantering två parter emellan men man får även en relativt snabb krypteringsmetod.

Digital signatur

Det är också vanligt att använda asymmetrisk kryptering som digital signatur.
Det fungerar på omvänt sätt för kommunikation. Bob signerar sitt meddelande till Alice med sin privata nyckel och när Alice sedan skall läsa Bobs meddelande ser hon direkt om det är Bob som har signerat meddelandet eftersom hon dekrypterar signaturen med Bobs publika nyckel, och det kan endast dekrypteras med Bobs nyckel – ingen annan. Denna procedur ger oss två fördelar. Alice kan vara säker på meddelandet inte har ändrats eftersom Bob har satt sin signatur på det. Bob kan inte heller neka att han har skickat meddelandet eftersom han har använt sin privata – och hemliga – nyckel för att signera meddelandet.

Asymmetrisk kryptering innebär att kryptering kan ske med antingen den publika eller den privata nyckeln. När informationen krypteras med den privata nyckeln kan den endast dekrypteras med den publika nyckeln och när informationen krypteras med den publika nyckeln kan den endast dekrypteras med den privata.

Exempel på hur det kan se ut i c#-kod

//Konvertera strängen till en byte array
UnicodeEncoding ByteConverter = new UnicodeEncoding();
byte[] dataToEncrypt = ByteConverter.GetBytes("Hemlig text");

RSACryptoServiceProvider RSAProvider = new RSACryptoServiceProvider();
//Exportera den publika nyckeln
RSAParameters encryptParameters = RSAProvider.ExportParameters(false);
//Exportera den publika och privata nyckeln
RSAParameters decryptParameters = RSAProvider.ExportParameters(true);

//OAEP padding innebär PKCS#1 v2.0 (kräver windows xp eller senare)
//Om den sätts till false används PKCS#1 v1.5. 
bool doOAEPPadding = true;

//Kryptera med enbart den publika nyckeln
RSACryptoServiceProvider RSAEncryptor = new RSACryptoServiceProvider();
RSAEncryptor.ImportParameters(encryptParameters);
byte[] encryptedData = RSAEncryptor.Encrypt(dataToEncrypt, doOAEPPadding);

//Dekryptera med hjälp av den privata nyckeln
RSACryptoServiceProvider RSADecryptor = new RSACryptoServiceProvider();
RSADecryptor.ImportParameters(decryptParameters);
byte[] decryptedData = RSADecryptor.Decrypt(encryptedData, doOAEPPadding);

Console.WriteLine("Dekrypterad text: {0}", ByteConverter.GetString(decryptedData));

Läs gärna mer om PKCS#1 och RSACryptoServiceProvider.

Kommentarer inaktiverade.

%d bloggare gillar detta: