Esempio di cifratura a chiave asimmetrica con PHP. Parte 2.

Spread the love

Lucchetto indiano con meccanismo segreto azionato da quattro chiaviVediamo un secondo semplice esempio di sequenza di operazioni per cifrare un messaggio e successivamente decifrarlo, con lo scopo di scrivere un messaggio segreto che il destinatario può attribuire inequivocabilmente ad un solo mittente (nel primo esempio ci assicuravamo che solo il destinatario potesse leggere il messaggio). Lo scenario è il classico Bob scrive ad Alice, L’attenzione, più che sul codice, è posta sulla corretta sequenza di operazioni e su quali sono i parametri giusti da utilizzare.

Come prima cosa Bob si procura una coppia di chiavi RSA

Bob genera le chiavi con openssl

Chiave privata

marcob@js:~$ openssl genrsa -des3 -out privatekey 1024 
Generating RSA private key, 1024 bit long modulus 
..........++++++ 
..............++++++ 
e is 65537 (0x10001) 
Enter pass phrase for privatekey: 
Verifying - Enter pass phrase for privatekey: 
marcob@js:~$ ll 
totale 132 
drwxrwxr-x 2 marcob marcob  4096 feb 10 09:37 ./ 
drwxrwxr-x 8 marcob marcob  4096 feb  7 15:56 ../ 
-rw-rw-r-- 1 marcob marcob   963 feb 10 09:38 privatekey

Certificato della chiave privata:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,4FA0F44C01DF5F3F

J6zb3OI9oCN/31VvhRRlzAxiv5AilIlFy0dTgmySi3G+ffYzalIm5lrgx7sSgOPa
TgR4djJUPHg24J4ZceicYN+J3rwQQR02okTBGdMwx9uN+dwtJI7eg7s6cYm5Ulu9
+hT72rvSejlQNh8qCb0+291USpWHYID6X6Hef5SH7GUTaJT76MGEOpzp3VU+0oB6
yTdJzA43qDsME4OwvenQyLbdKpM/iXGHn9h/OLaSuJIrLNUDOvP3mCqBBa7RvFIQ
FsDSF7L0zdozjpxM/Lr6oa3A7dLHyqWTuDKg+S3Z3ETdzlV34FvBSnjYtltE2OZB
WFpB7lip5wVPOxA4sUZ0RXlRaWytC5CROjhc5VnR3kd6XwMmdmbTKkdOYy00OUIq
bNfLYeVsOr4HyIVXxOYbMB41EoN4FzyXSosW9baXUxQ2L29lzJY1bIRmljIiF4Q7
Qk5/qLwU58y3EmtE0itMWlC3Iix0HY3UUZlxfc9JapsuT/6lVEzrFNIVaDYZilZb
KHQS39ZAWP2PI2LQuC5KGDme1rwDfLvKEYisZbLUTgIJIzfOf9ETpqtDR9Pot1uz
G9rMabMsA5BOzUyqXkd5I+ilZQD71BlruwBgQ7d1zwyi4mN4jwsRghuoEuTMwWZP
lasIJVy1LS6gE7zIGDiJItCan9Cm1DuZwlE6lXtlf1aahK4rUz3MvgRCV2cs2S8Z
mjzFg8JqHu5Q09U/J61i2xzWiyLsVCsSpoupDqoQtoluS6f9HUYfZZbpBJTKm0IY
Y6Aypggbxqq52L1XPpj+aF5H5uzBHQoDpXqmKNp3rV2T6AYMlzRVog==
-----END RSA PRIVATE KEY-----

Chiave pubblica

marcob@js:~$ openssl rsa -in privatekey -pubout -out publickey 
Enter pass phrase for privatekey: 
writing RSA key 
marcob@js:~$

Certificato della chiave pubblica =>

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCkg9z7E2Mh0nNDHy8/C3tRtqXQ
sePXpMg+FXxf5EHxzMPfX+AbL2e9v6gUX8BHekiKvWoopl5OtPb2nubHAW2lIDnB
Ku1DEWcVGAaIbG/aC6804I0oWEOHCN6Wp0Z/En9Fw5DiuRdfQULPvhjD4Oy5g0UQ
6GkjYCiv4GnJRbpENwIDAQAB
-----END PUBLIC KEY-----

Bob può inviare la sua chiave pubblica ad Alice, oppure può metterla nel suo sito, in modo che chiunque possa scaricarla.

Cifratura e decifratura di un messaggio

Ora Bob cifra un messaggio con la sua sua chiave privata; Alice lo potrà aprire solo utilizzando la chiave pubblica di Bob. In questo modo ho la certezza del mittente.

Cifratura (Bob)

  1. Dato in chiaro =>NEL MEZZO DEL CAMMIN DI NOSTRA VITA
  2. Estraggo la chiave privata dal certificato con la funzione openssl_pkey_get_private =>Resource id #4
  3. Cifro il dato (nota che alla funzione openssl_private_encrypt passo la RISORSA (Resource id #4) come chiave, NON il certificato):
  4. Dato in scuro =>
    Å/ŽðgwÆ{brØ°-¼C3Ü„Éèbyðto¥ìKtY3ï	}Ù«ˆ`Î9‡"ØßDšão;4¾–Ô6œ›W¨>5
    ¿4ÉË2amà
    n•hLÅ5Öþ(nìz >Œ$U[:‘¥
    ¨¬,uð;‚4´99¬}hyJ„˜ájB
  5. Dato in scuro b64encoded =>
    DMUvgY4c8Gd3xntictiwLbxDM9yEyehiHHkS8HRvpexLdFkz7wl92X+riGDOOYci2N9EFprjbzs0vpbUNp
    ybF1eoPjUNvzTJyzIeFWFt4A1ulWhMxTXW/ihu7HogAT6MJFUbWzqRpQqoAqwsdQLwO4I0tDk5rH1oeQtK
    hJjhakI=

Invio il dato ad Alice

Decifratura (Alice)

  1. Alice estrae la chiave pubblica dal certificato con openssl_pkey_get_public: => Resource id #6
  2. Decifra il dato oscuro (nota che alla funzione openssl_public_decrypt passo la RISORSA (Resource id #6) ritornata dalla openssl_get_privatekey, NON il certificato):
  3. Finalmente, il testo nuovamente in chiaro =>
    NEL MEZZO DEL CAMMIN DI NOSTRA VITA

Riassunto.

  1. In trasmissione
  2. openssl_pkey_get_private
  3. openssl_private_encrypt
  4. In ricezione
  5. openssl_pkey_get_public
  6. openssl_public_decrypt

Con questa sequenza Alice è certa che solo Bob potrà essere colui che ha le inviato il messaggio. Ma essendo pubblica la chiave pubblica di Bob, Alice non potrà essere certa di essere l’unica che lo può leggere.

Fine.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.