Messaggi criptati con PHP e PGP

Posted on marzo 28, 2009
Filed Under Form Email | 3 Comments

PGP (Pretty Good Privacy) e’ un sistema di invio di messaggi criptati basato sull’uso di due chiavi: una pubblica (disponibile a chiunque voglia inviarci un messaggio criptato) ed una privata (usata per decriptare il messaggio). Il tutorial chiarira’ come creare le chiavi e realizzare un form per inviare messaggi criptati tramite PHP.

Inizialmente occorre generare le due chiavi una da pubblicare ed una da tenere segreta. Colleghiamoci via SSH al web server. Una volta fatto login scriviamo:
gpg –gen-key

Attraverseremo quindi una serie di passaggi tra cui scegliere:
(1) DSA and ElGamal (default)
(2) DSA (sign only)

Scegliere l’opzione: 1
DSA keypair will have 1024 bits.
About to generate a new ELG-E keypair.
minimum keysize is 768 bits
default keysize is 1024 bits
highest suggested keysize is 2048 bits
What keysize do you want? (1024) 2048

Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
Is this correct (y/n)? y

Inserire quindi i dati di riconoscimento:
Nome Leonardo
Email address: info@freescriptphp.com
Comment:
You selected this USER-ID:
“Leonardo <info@freescriptphp.com>”
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o

A questo punto occorre generare la passphrase da usare successivamente per il decript dei messaggi ricevuti ed una continua pressione su svariati tasti per fare in modo che l’entropia raggiunga un determinato stadio valido per creare le chiavi. Una volta generate le chiavi esse verranno memorizzato nella cartella .gnupg nella cartella root.

Occorre quindi inserire i giusti permessi alla cartella .gnupg per permettere l’accesso al webserver. Questi i permessi corretti:
chmod 777 .gnupg/
cd .gnupg/
chmod 604 random_seed
chmod 644 pubring.gpg

Non lasciare la chiave privata secring.gpg nel server. Copiarla in locale.

trustdb.gpg non viene creata di default. Per farlo usare questi comandi:
gpg -e -r “e-mail address usato per la creazione dell’id”

Per esempio:
gpg -e -r info@freescriptphp.com

Concedergli i giusti permessi
chmod 666 trustdb.gpg

Per criptare un file di testo (Es. pippo.txt) usare il seguente comando:
gpg -e -r “username e-mail address” pippo.txt

Per esempio:
gpg -e -r info@freescriptphp.com pippo.txt

Il contenuto criptato sara’ presente nel file:
pippo.txt.gpg

Per decriptare il messaggio usare:
gpg -d pippo.txt.gpg

Inserire la chiave di decript per leggere il contenuto. Il contenuto verra’ poi mostrato a video.

A questo punto dobbiamo creare lo script in PHP per criptare i messaggi che ci invieranno. Dobbiamo copiare la cartella .gnupg nella nostra cartella web e chiamiamola gnupg senza la nostra chiave privata dopodiche’ possiamo utilizzare il seguente script:

invia_email.html
<HTML>
<HEAD>
<TITLE>PGP e PHP – Messaggi Criptati</TITLE>
</HEAD>
<BODY>
<h1>Messaggi criptati</h1>
<FORM method=”POST” action=”inviapgp.php”>
<p>Nome:<br>
<INPUT type=”text” name=”nome” size=25></p>

<p>Tua Email:<br>
<INPUT type=”text” name=”email” size=25></p>

<p>Messaggio:<br>
<TEXTAREA name=”msg” cols=35 rows=5></TEXTAREA></p>
<input type=hidden name=”recipient” value=”30″>
<p><INPUT type=”submit” value=”Invia >>” name=”Invia”></p>
</FORM>
</BODY>
</HTML>

inviapgp.php
<?php
// sostituisci il tuo username di PGP o l’email usata nella generazione delle chiavi
$pgpuser = “info@freescriptphp.com” ;

$testemail = “info@freescriptphp.com”;
$oggetto = “Messaggio criptato”;

//Email proveniente dal form…
$email = “Da:”. $_POST['email'];

//Messaggio del form…
$body = $_POST['msg'];

putenv(“GNUPGHOME=gnupg”);

//Creiamo il file pgp nella cartella appoggio che deve essere scrivibile (775)
$infile = “appoggio/PGP.asc”;
$outfile = $infile.”.asc”;

//Scriviamo il messaggio nel file.
$fp = fopen($infile, “w”);
fwrite($fp, $body);
fclose($fp);

//Impostiamo il comando gnupg
$command = “/usr/bin/gpg  -a –always-trust –batch –no-secmem-warning -e -r $pgpuser  -o $outfile $infile”;

//Eseguiamo il comando (deve essere permesso a livello di system!)
system($command, $result);

//Cancelliamo il file non criptato…
unlink($infile);

if ($result==0) {
$fp = fopen($outfile, “r”);
if(!$fp||filesize ($outfile)==0) {
$result = -1;
}
else {
//Leggiamo il file criptato…
$contents = fread ($fp, filesize ($outfile));
//Cancelliamo il file criptato…
unlink($outfile);
//Inviamo la mail…
mail ($testemail, $oggetto, $contents, $email);

print “<html>Grazie!! Messaggio criptato inviato correttamente tramite mail. </html> “;
}
}
if($result!=0) {
print “<html>Ci sono stati dei problemi…riprovare.</html>”;
}
?>

Una volta che riceviamo il messaggio nella nostra casella di posta privata possiamo copiare l’intero contenuto in un file (Es.: pippo.txt.gpg) e decriptarlo con il comando:
gpg -d pippo.txt.gpg

Una volta inserito la passphrase scelta durante la creazione leggeremo a video il messaggio. Buona comunicazione sicura!

Tag:,

Others Script adv

3 Responses to “Messaggi criptati con PHP e PGP”

  1. Tatiana on aprile 22nd, 2009 14:33

    This is great info to know.

  2. GarykPatton on giugno 16th, 2009 08:07

    How soon will you update your blog? I’m interested in reading some more information on this issue.

  3. Leonardo on settembre 10th, 2009 18:06

    Hi tatiana…thanks for your comment!

    Hi Gary, i’m not a journalist and i don’t have enough script to publish so i don’t know how soon i update this blog. I like it but i don’t have enough time to do it.
    I’m pretty sure that the new article will be how to create a pdf with php because i have found a lots of script but is difficult find a good solution to do that. So…stay tuned and many thanks for your comment.

Leave a Reply