Aujourd’hui on va s’amuser un peu avec les clés publics et privées et le cryptage rsa. Tout ça à l’aide d’openssl, php et zend_framework.
Le besoin : Vous voulez communiquer avec une autre société de manière sécurisé. La cryptographie asymétrique est choisie car plus sécurisé que les traditionnels méthode symétrique avec clé secrète type blowfish. Vous générez une clé privée avec sa clé public correspondante, puis transmettez la clé public a l’autre société qui s’en servira pour crypter les messages. A l’aide de votre clé privée, vous seul serez en mesure de décrypter les messages reçue.
Si quelqu’un intercepte le message, sans votre clé privée, il ne pourra rien en faire. Même avec la clé public, il n’est pas décryptable. C’est l’avantage par rapport à la cryptographie symétrique puisque avec cette dernière, on utilise la même clé pour crypter/decrypter
Première étape, se générer une clé privée. Rien de plus facile avec openssl, qui est installé d’office sur toute bonne machine qui se respecte. On vous demandera une passphrase et sa confirmation, qui seront nécessaire à chaque utilisation de la clé privée.
openssl genrsa -des3 -out private.key 1024
« gensra » : pour générer une clé private RSA.
-des3 : choix du cryptage de la clé privée en elle même, ce qui induit une demande de passphrase
-out private.key : spécifie le fichier où sera généré la clé privée.
1024 : taille de la clé privée
un « man openssl » vous expliquera plus en détail les paramètres.
On se retrouve avec un fichier private.key. Par curiosité on peut l’ouvrir, on voit bien l’entête —–BEGIN RSA PRIVATE KEY—– avec ensuite une longue chaîne de caractère. C’est la fameuse clé privée. De cette clé privée, on va produire une clé public. Bien sur, puisque vous utilisez la clé privée et qu’elle est protégée, le système vous redemandera la passphrase.
openssl rsa -in private.key -pubout -out public.key
-in private.key : on déclare en entrée notre clé privée.
-pubout : on demande d’avoir une clé public en sortie
-out public.key : spécifie le fichier où sera généré la clé public
De même, si on l’ouvre, un a bien l’entête —–BEGIN PUBLIC KEY—–.
Dans la théorie, on garde sa clé privée et on transmet une clé public au partenaire avec qui on veut crypter les messages. Pour les tests, nous, tout sera fait dans le même script php. On génère une chaîne quelconque, on l’encrypte à l’aide de la clé public, puis la décrypte avec la clé privée, et finalement on vérifie qu’on a bien les mêmes données au départ et à l’arrivée. On travaille en base64 pour avoir une chaîne qu’on peu facilement transporter en http par exemple.
// message a crypter $toCrypt = 'crypter avec une clé public / clé privée ?!'; var_dump($toCrypt); // cryptage du message avec la clé public $rsaPublic = new Zend_Crypt_Rsa(array( 'pemPath' => './public.key' )); $stringCrypt = $rsaPublic->encrypt($toCrypt, $rsaPublic->getPublicKey(), Zend_Crypt_Rsa::BASE64); var_dump($stringCrypt); // decryptage du message avec la clé privée $rsaPrivate = new Zend_Crypt_Rsa(array( 'pemPath' => './private.key', 'passPhrase' => 'webozor' )); $stringDecrypt = $rsaPrivate->decrypt($stringCrypt, $rsaPrivate->getPrivateKey(), Zend_Crypt_Rsa::BASE64); var_dump($stringDecrypt);
message à crypter
crypter avec une clé public / clé privée ?!
chaîne cryptée en base64
SFddLl7rXZ97H59aD7julhv6ZOEkoUSePuOEy3/d8dXdcP3+wbr>ZDoJa2350DCKzAqB8frqsasxrf18o3qRuUeaEmZ0F6gqizgUdsgn0BrRGETMC9AqbqIakLH3UqydEmvCWyr8bgF7503QfY3fWd7zkzEmr1jBE7e4+r0fKNqTk='
message décrypté
crypter avec une clé public / clé privée ?!
On est ok, on retrouve bien notre chaîne en sortie après l’avoir décryptée avec la clé privée et la passphrase.
J’espère que ça vous sera utile.
PS : attention, troll inside