Haluatko ymmärtää melko hyvän yksityisyyden? Simuloi sitä.

Kuten nimestä voi päätellä, Pretty Good Privacy (tai PGP) on salausohjelma, joka todella tarjoaa melko hyvän yksityisyyden. "Melko hyvän" bitin on tarkoitus olla hieman ironista aliarviointia. Se on ollut yksi hallitsevimmista end-to-end-salausten muodoista sähköpostiviestinnässä sen jälkeen, kun Phil Zimmermann kehitti sen vuonna 1991. Se tuli yhä suositummaksi sen jälkeen, kun väärinkäytösten paljastaja Edward Snowden käytti sitä.

PGP tarjoaa kaksi tärkeää asiaa suojatulle viestinnälle:

  1. Luottamuksellisuus: Symmetrinen lohkosalaus, pakkaus ZIP-algoritmilla ja sähköpostin yhteensopivuus radix64-koodausmenetelmän avulla
  2. Todennus: tarjotaan digitaalisten allekirjoitusten avulla

Päästäkäämme PGP: n toimintaan ilman jatkokäsittelyä.

Kuinka se toimii

Selitän PGP: n käsitettä toteutuksen näkökulmasta Alice (lähettäjä) ja Bob (vastaanottaja) yhteydessä. Käytämme seuraavia algoritmeja:

  1. RSA epäsymmetrisenä salausalgoritmina
  2. SHA-512 hajautusalgoritmina
  3. DES symmetrisenä salausalgoritmina ja
  4. ZIP pakkaamista varten

Voit käyttää myös muita algoritmeja. (Tiedän, että DES on liian vanha käytettäväksi, mutta tavoitteena on ymmärtää PGP: n käsite.)

Alice ja Bob luovat molemmat avainparinsa (julkiset ja yksityiset avaimet) RSA-algoritmilla. Alicen ja Bobin julkiset avaimet tulisi tuntea toisilleen.

Alice / lähettäjän puoli:

  1. Alice kirjoittaa viestin M, jonka hän aikoo lähettää Bobille.
  2. M annetaan syötteenä SHA-512-algoritmiin saadakseen sen 512-bittisen binäärisen hajautusmerkin (jota edustaa 128-bittisenä heksadesimaalimerkkijonona).
  3. Tämä hajautus allekirjoitetaan digitaalisesti käyttämällä RSA-algoritmia, eli hajautus salataan Alicen yksityisillä avaimilla. RSA: n syötteet ovat Alicen yksityiset avaimet ja hajautus. RSA: n lähtö on digitaalisesti allekirjoitettu hash tai salattu hash EH.
  4. Nyt M ja EH liitetään yhteen. (Liitteenä siinä mielessä, että ne laitetaan joukkoihin merkkijonoja).
  5. M ja EH (jotka ovat joukossa merkkijonoja) toimivat syötteenä ZIP-pakkausalgoritmiin saadakseen pakatun M: n ja pakatun EH: n, jälleen joukkoa merkkijonoja.
  6. Edellä olevan vaiheen tulos salataan nyt symmetrisen DES-salausalgoritmin avulla. Tätä varten luodaan ensin SecretKey for DES. Tämä avain ja vaiheen 5 lähtö toimivat syötteenä DES-salausalgoritmiin, joka antaa meille salatun lähdön (jälleen joukossa merkkijonoja).
  7. Viimeisenä mutta ei vähäisimpänä, koska M on salattu SecretKeyllä, se on lähetettävä myös Bobille. Salataan SecretKey of DES -algoritmi Bobin julkisella avaimella. Käytämme tähän RSA: ta ja sen syötteet ovat Bobin ja SecretKeyn julkinen avain.
  8. Vaiheiden 6 ja 7 lähdöt liitetään nyt ja lähetetään viimeisenä viestinä Bobille.

Koko viesti lähetetään merkkijonoina ( String finalmessage[]), jotka sisältävät seuraavat indeksit:

0: Pakattu viesti M, joka on salattu SecretKeyllä

1: Digitaalisesti allekirjoitettu hash EH, joka sitten pakataan ja salataan SecretKeyllä

2: Vaiheen 7 tulos

Bobin / vastaanottimen puoli:

  1. Bob purkaa ensin DESK: n SecretKey: n yksityisillä avaimillaan. Tämän RSA-algoritmin syötteet ovat Bobin ja finalmessage[2]. RSA: n tulos antaa Bobille SecretKey-avaimen.
  2. Tämä SecretKey toimii nyt yhtenä syötteenä DES-salauksen algoritmiin finalmessage[0]ja finalmessage[1]. Nämä kaksi toimivat myös syötteinä DES-salauksen purkualgoritmiin. Lähtö tämä vaihe decrypted versionon finalmessage[0]ja finalmessage[1].
  3. Yllä olevan vaiheen lähdöt tulisi antaa syötteenä ZIP-algoritmiin purkamista varten.
  4. Edellä olevan vaiheen tuloksesta saat digitaalisesti allekirjoitetun hajautusmerkin ja alkuperäisen sanoman M. Tarkistamme, onko Alice allekirjoittanut hajautuksen. Tätä varten laskemme alkuperäisen sanoman M tiivisteen SHA-512 ( calculated_hash): lla. Salaus puretaan myös digitaalisesti allekirjoitettu hajautus Alicen julkisilla avaimilla RSA: n avulla. (Tulot RSA: lle: digitaalisesti allekirjoitetut hajautus- ja julkiset avaimet Alicelle ja Output RSA: lta decrypted_hash).
  5. Vertaa decrypted_hashja calculated_hash. Jos ne osoittautuvat samoiksi, todennus saavutetaan, mikä tarkoittaa, että viestin lähetti todella Alice.

Seuraava on PGP: n simulointi yksinkertaisimmalla tavalla Java-sovelluksen avulla.

import java.util.*; import java.math.*; import javax.crypto.Cipher; import java.security.*; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; import javax.crypto.spec.*; public class PGP{ static Cipher ecipher, dcipher;//Required for DES public static void main(String args[]) throws Exception{ //Generating sender keys KeyPair senderkeyPair = buildKeyPair(); PublicKey senderpubKey = senderkeyPair.getPublic(); PrivateKey senderprivateKey = senderkeyPair.getPrivate(); //Generating receiver keys KeyPair receiverkeyPair = buildKeyPair(); PublicKey receiverpubKey = receiverkeyPair.getPublic(); PrivateKey receiverprivateKey = receiverkeyPair.getPrivate(); //Sending both public keys and private keys for choice of digital signature or normal assymetric encryption String messagetoreceiver[] = senderside(senderpubKey, senderprivateKey, receiverpubKey, receiverprivateKey); receiverside(messagetoreceiver, senderpubKey, senderprivateKey, receiverpubKey, receiverprivateKey); } public static void receiverside(String messagetoreceiver[], PublicKey senderpubKey, PrivateKey senderprivateKey, PublicKey receiverpubKey, PrivateKey receiverprivateKey) throws Exception { //Receiver receives the message messagetoreceiver[] with messagetoreceiver[2] as secret key encrypted with receiver pub key //Receiver decrypts the messagetoreceiver[2] with his/her privatekey String receiverencodedsecretkey = decrypt(receiverpubKey, receiverprivateKey, messagetoreceiver[2], 1); //Key after decryption is in base64 encoded form byte[] decodedKey = Base64.getDecoder().decode(receiverencodedsecretkey); SecretKey originalKey = new SecretKeySpec(decodedKey, 0, decodedKey.length, "DES"); System.out.println("\nReceiver Side: Receiver SecretKey DES after Decryption with his/her Private Key=\n"+originalKey.toString()); //Decrypt the rest of the message in messagetoreceiver with SecretKey originalKey String receiverdecryptedmessage[] = new String[messagetoreceiver.length-1]; System.out.println("\nReceiver Side: Message After Decryption with SecretKey="); for (int i=0;i
    
     encryptwithprivatekey 1->encryptwithpublickey public static String encrypt(PublicKey publicKey, PrivateKey privateKey, String message, int ch) throws Exception { Cipher cipher = Cipher.getInstance("RSA"); if (ch == 0) { cipher.init(Cipher.ENCRYPT_MODE, privateKey); byte[] utf8 = cipher.doFinal(message.getBytes("UTF-8")); return new sun.misc.BASE64Encoder().encode(utf8); } else { cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] utf8 = cipher.doFinal(message.getBytes("UTF-8")); return new sun.misc.BASE64Encoder().encode(utf8); } } //n: 0->decryptwithpublickey 1->decryptwithprivatekey public static String decrypt(PublicKey publicKey,PrivateKey privateKey, String st, int ch) throws Exception { Cipher cipher = Cipher.getInstance("RSA"); byte[] encrypted = new sun.misc.BASE64Decoder().decodeBuffer(st); if (ch == 0) { cipher.init(Cipher.DECRYPT_MODE, publicKey); byte[] utf8 = cipher.doFinal(encrypted); return new String(utf8, "UTF8"); } else { cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] utf8 = cipher.doFinal(encrypted); return new String(utf8, "UTF8"); } } }
    

Olemme käyttäneet base64-koodausmenetelmää, joka on samanlainen kuin radix64, jota käytetään PGP: ssä.

merkintä:

  1. Koodaat merkkijonot salauksen ja pakkaamisen jälkeen, jotta luettavissa oleva tekstimuoto saadaan.
  2. Salauksen purkamista ja purkamista varten lähetämme base64-koodatut tulot todellisina syötteinä salauksenpurku- ja purkualgoritmeihin.
  3. Avainta on koodattu ja dekoodattu, koska olen käyttänyt Java: ta PGP: n simulointiin, mikä vaatii koodatun muodon vastaanottimen puolella, jotta se voidaan muuntaa SecretKey-tietotyypiksi salauksen purkamista varten.

Seuraa, taputa ja jaa. Kommentoi virheitä, parannuksia tai ehdotuksia. Voit jopa seurata minua Twitterissä.