Je presente une methode de crypto assez simple que j'ai decouvert il y a peu.
Ca s'appelle BROADCAST ENCRYPTION (abbreviations: BE). Cela permet de rendre accessible des donnees seulement a un sous groupe d'utilisateurs choisis par l'admin parmis les membres par exemple de maniere a ce que ce sous groupe soit dynamique.
Plutot que de la theorie, je presente juste un exemple simple avec un nombre fixe d'utilisateurs et sans revocation ou ajout. Il y a passablement de doc sur google pour ceux qui voudraient aller plus loin. En esperant que cela puisse interesser quelqu'un :-)
Dans cet exemple, il y a 8 utilisateurs. Ces 8 utilisateurs doivent recevoir des infos cryptées. Les destinataires ne sont pas forcément les mêmes selon les messages. BE permet de définir qui peut décrypter un message/fichier crypté laissé sur un serveur.
Méthode: on place les utilisateurs aux feuilles d'un arbre binaire, chaque noeud est une clé symétrique (impossible avec l'asymetrie si jamais).
Chaque utilisateur connait les clés de la racine a eux (dans ce cas, c'est 4 clés par personne)
Arbre avec les utilisateurs
Racine
a_______|______b
c___|___d e___|___f
__|__ __|__ __|__ __|__
| | | | | | | |
g h i j k l m n
Alain Barbara Charles Daniel Emma Fabien Géraldine Hubert sont les feuilles
Alain connaît les clés : Racine, a, c, g
Barbara connaît les clés : Racine, a, c, h
Charles connaît les clés : Racine, a, d, i
Daniel connaît les clés : Racine, a, d, j
Emma connaît les clés : Racine, b, e, k
Fabien connaît les clés : Racine, b, e, l
Géraldine connaît les clés : Racine, b, f, m
Hubert connaît les clés : Racine, b, f, n
En numérotant les clés de 0 à 14, j'ai créé une table users_be:
| id | name | key1 | key2 | key3 | key4 |
| 1 | Alain | 0 | 1 | 3 | 7 |
| 2 | Barbara | 0 | 1 | 3 | 8 |
| 3 | Charles | 0 | 1 | 4 | 9 |
| 4 | Daniel | 0 | 1 | 4 | 10 |
| 5 | Emma | 0 | 2 | 5 | 11 |
| 6 | Fabien | 0 | 2 | 5 | 12 |
| 7 | Geraldine | 0 | 2 | 6 | 13 |
| 8 | Hubert | 0 | 2 | 6 | 14 |
Maintenant, si on veut déposer un message/fichier crypté de manière à ce que tout le monde puisse le décrypter, on utiliserala clé "racine". Si on veut que seulement Alain, Barbara et Emma puisse le décrypter, on utilisera les clés "c" et "k".
A quoi ca sert? Imaginer un système avec des centaines d'utilisateurs et ensuite pensez à l'économie de calculs...
Je rappelle qu'il s'agit d'une simple implémentation ne prenant pas en compte des éléments de révocations, update ou ajouts d'utilisateurs par exemple. Ce code a pour seul but de faire découvrir la Broadcast Encryption.
<?php
$serveur = "localhost";
$base = "***";
$user = "***";
$pass = "***";
$connect = mysql_connect($serveur, $user, $pass) or die ("click F5 to reload please...");
mysql_select_db($base, $connect);
$users = array(0 => 'Alain',1 => 'Barbara', 2 => 'Charles',3 => 'Daniel',4 => 'Emma',5 => 'Fabien',6 => 'Geraldine',7 => 'Hubert');
$allky = array(0=>'AkjzFd9i',1=>'A0o8Er5Q', 2=>'At789hd',3=>'ABH890a1',4=>'A9n0o875',5=>'Aya3j8HZ',6=>'A5Tu8Fj',7=>'AMjgzrfB',8=>'BkjzFd9i',9=>'B0o8Er5Q', 10=>'Bt789hd',11=>'BBH890a1',12=>'B9n0o875',13=>'Bya3j8HZ',14=>'B5Tu8Fj');
if (!isset($_GET['be'])){
$q = 'SELECT id, name FROM users_be ORDER by id';
$r = mysql_query($q);
echo '<form method="POST" action="?be=1">Message à broadcaster: <input type="text" name="mbe" size="20"><br />';
while ($rep = mysql_fetch_array($r)){
echo '<input type="checkbox" name="check[]" value="'.($rep['id']-1).'"> '.$rep['name'].'<br />';
}
echo '<input type="submit" value="broadcaster">';
}
else{
if ($_GET['be']==1){
$check = $_POST['check'];
echo 'Message à encoder: '.$_POST['mbe'].'<br />';
echo 'Utilisateurs Autorisés: ';
for ($i=0;$i<count($check);$i++){
echo $users[$check[$i]].' ';
}
echo '<br />';
echo 'Clés nécessaires: ';
// choix des clés, niveau 1 - méthode non optimisée et inutilisable pour un nombre important de users
for ($i=0;$i<8;$i++) $keysX[$i] = 0;
for ($i=0;$i<8;$i++) $keys[$i] = -1;
for ($i=0;$i<4;$i++) $keys2[$i] = 0;
for ($i=0;$i<2;$i++) $keys3[$i] = 0;
$keyR = 0;
for ($i=0;$i<count($check);$i++){
$keys[$check[$i]]= 7+$check[$i];
}
if (($keys[0]!=-1) && ($keys[1]!=-1)){$keys[0]=3;$keys[1]=3;$keys2[0]=1;}
if (($keys[2]!=-1) && ($keys[3]!=-1)){$keys[2]=4;$keys[3]=4;$keys2[1]=1;}
if (($keys[4]!=-1) && ($keys[5]!=-1)){$keys[4]=5;$keys[5]=5;$keys2[2]=1;}
if (($keys[6]!=-1) && ($keys[7]!=-1)){$keys[6]=6;$keys[7]=6;$keys2[3]=1;}
if (($keys2[0]==1) && ($keys2[1]==1)){$keys[0]=1;$keys[1]=1;$keys[2]=1;$keys[3]=1;$keys3[0]=1;}
if (($keys2[2]==1) && ($keys2[3]==1)){$keys[4]=2;$keys[5]=3;$keys[6]=3;$keys[7]=3;$keys3[1]=1;}
if (($keys3[0]==1) && ($keys3[1]==1)) {$keys[0]=0;$keys[1]=0;$keys[2]=0;$keys[3]=0;$keys[4]=0;$keys[5]=0;$keys[6]=0;$keys[7]=0;$keyR=1;}
$keysX = array_unique($keys);
$j=0;
for ($i=0;$i<8;$i++){
if (($keysX[$i]!=0) && ($keysX[$i]!=-1)){
$keysused[$j]=$keysX[$i];
$j++;
}
}
if (($keysX[0]==0) && (count($keysX)==1)){
$keysused[0]=$keysX[0];
$j=1;
}
echo '<br />';
for ($i=0;$i<$j;$i++) echo $allky[$keysused[$i]]. '<br />';
echo 'Clé aléatoire pour encrypter le message: ';
$mdp = '';
$lettres = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
for ($i=0;$i<8;$i++) $mdp = $mdp.substr($lettres, rand(0,strlen($lettres)-1),1);
echo $mdp.'<br />';
$iv = '00000000';
$secret = mcrypt_encrypt(MCRYPT_3DES, $mdp, $_POST['mbe'], MCRYPT_MODE_ECB,$iv);
$msgenc = bin2hex($secret);
echo 'Message encrypté: '.$msgenc.'<br />';
echo 'Header du message: ';
for ($i=0;$i<count($keysused);$i++){
$keysenc[$i] = mcrypt_encrypt(MCRYPT_3DES, $allky[$keysused[$i]], $mdp, MCRYPT_MODE_ECB,$iv);
$keysenc[$i] = bin2hex($keysenc[$i]);
echo $keysenc[$i].' ';
}
echo '<hr /><hr />Essais de décryptage:<br />';
echo 'chaque personne recoit le message et le header. Officiellement, les personnes pouvant lire sont: ';
for ($i=0;$i<count($check);$i++){
echo $users[$check[$i]].' ';
}
echo '<br />Allons y...<br /><br />';
// chacun a recu $msgenc et $keysenc
$decmsg = '';
$length = strlen($msgenc);
for ($i = 0; $i<$length; $i+=2) $decmsg .= chr(hexdec(substr($msgenc,$i,2)));
$q = 'SELECT * FROM users_be ORDER by id';
$r = mysql_query($q);
while ($rep = mysql_fetch_array($r)){
echo 'Essais '.$users[$rep['id']-1].':<br />';
for ($i=1;$i<=4;$i++){
$key = $allky[$rep['key'.$i]];
echo 'Clé '.$i.': '.$key.'<br />';
for ($j=0;$j<count($keysenc);$j++){
$key2='';
$length2 = strlen($keysenc[$j]);
for ($k = 0; $k<$length2; $k+=2) $key2 .= chr(hexdec(substr($keysenc[$j],$k,2)));
$decryptkey = mcrypt_decrypt(MCRYPT_3DES, $key, $key2, MCRYPT_MODE_ECB,$iv);
echo 'Clé testée: '.$decryptkey.', décodage associé: ';
$decrypttext= trim(mcrypt_decrypt(MCRYPT_3DES, $decryptkey, $decmsg, MCRYPT_MODE_ECB,$iv));
echo trim($decrypttext).'<br />';
}
}
echo '<br /><hr />';
}
}
}
?>
----------------------------------------------------------------------------
Si on execute ce code, un exemple est:
Message: CodeS-SouceS IS YOUR FRIEND
Pour: Alain Barbara Charles Daniel Hubert
Cela donnera:
Message à encoder: CodeS-SouceS IS YOUR FRIEND
Utilisateurs Autorisés: Alain Barbara Charles Daniel Hubert
Clés nécessaires:
A0o8Er5Q
B5Tu8Fj
Clé aléatoire pour encrypter le message: Lxp8K5qW
Message encrypté: ac2b5c6a93934eb2bdc010b8ba1cdc166999b14ed934305acbeecc7ca30a2adb
Header du message: 955bc4c45687f48c 3e6bfb4170cfb168
Essais de décryptage:
chaque personne recoit le message et le header. Officiellement, les personnes pouvant lire sont: Alain Barbara Charles Daniel Hubert
Allons y...
Essais Alain:
Clé 1: AkjzFd9i
Clé testée: ¢Mâ^., décodage associé: ÃòO$åÄ¿ çÜÞvoròK3ê?$
Clé testée: Ù&÷Äöþ8, décodage associé: Ík¿ÏUXO(sp+É'NÕ¶û*4®ýÜñÚëÝ
Clé 2: A0o8Er5Q
Clé testée: Lxp8K5qW, décodage associé: CodeS-SouceS IS YOUR FRIEND
Clé testée: ú0ñeþÎÚ, décodage associé: ¹´d± YË]°[LS7rO;æ)úÞùkÄYº1
Clé 3: ABH890a1
Clé testée: ª[#{mê/, décodage associé: *Sê/J<êêëò¬sÛàÛKª¡?4`F7ò
Clé testée: {yðýäù, décodage associé: /€Zh.m§X=â®»hÚ"OAÇöYU%K$¾
Clé 4: AMjgzrfB
Clé testée: óc7 , décodage associé: í¶µÄ/·ÞFÚ9÷)vYzý¯öÌ#u
Clé testée: CýÝ/ , décodage associé: èÙ©ù/ßæÉÏaXI+w/Âa!€«Ñ
Essais Barbara:
Clé 1: AkjzFd9i
Clé testée: ¢Mâ^., décodage associé: ÃòO$åÄ¿ çÜÞvoròK3ê?$
Clé testée: Ù&÷Äöþ8, décodage associé: Ík¿ÏUXO(sp+É'NÕ¶û*4®ýÜñÚëÝ
Clé 2: A0o8Er5Q
Clé testée: Lxp8K5qW, décodage associé: CodeS-SouceS IS YOUR FRIEND
Clé testée: ú0ñeþÎÚ, décodage associé: ¹´d± YË]°[LS7rO;æ)úÞùkÄYº1
Clé 3: ABH890a1
Clé testée: ª[#{mê/, décodage associé: *Sê/J<êêëò¬sÛàÛKª¡?4`F7ò
Clé testée: {yðýäù, décodage associé: /€Zh.m§X=â®»hÚ"OAÇöYU%K$¾
Clé 4: BkjzFd9i
Clé testée: 7«æèg, décodage associé: ÉV Þq8^%L¬Í' û*ÛÃ?²/ͦéõ¸T7
Clé testée: ägQ}=Áu, décodage associé: r"Ì-5¿ ¡65Káñ´æ)fmM±Ñ«
Essais Charles:
Clé 1: AkjzFd9i
Clé testée: ¢Mâ^., décodage associé: ÃòO$åÄ¿ çÜÞvoròK3ê?$
Clé testée: Ù&÷Äöþ8, décodage associé: Ík¿ÏUXO(sp+É'NÕ¶û*4®ýÜñÚëÝ
Clé 2: A0o8Er5Q
Clé testée: Lxp8K5qW, décodage associé: CodeS-SouceS IS YOUR FRIEND
Clé testée: ú0ñeþÎÚ, décodage associé: ¹´d± YË]°[LS7rO;æ)úÞùkÄYº1
Clé 3: A9n0o875
Clé testée: "%T"î±, décodage associé: û%äRw ¸õU$é¸wsmI§Ôí 2ø}5>F
Clé testée: €ÛD0)c, décodage associé: ߨ
²0$Õ¦7§HfeÚd"|O-¢)dYL°
Clé 4: B0o8Er5Q
Clé testée: 7·=»eù÷ý, décodage associé: ýJ)°/Õ2 ¨ GºÎYıÇÖÉ@TÄ
Clé testée: #Ö{mNøê, décodage associé: Ù¢ÜÙÜõãïã½êéùî¿;lCÆû-
Essais Daniel:
Clé 1: AkjzFd9i
Clé testée: ¢Mâ^., décodage associé: ÃòO$åÄ¿ çÜÞvoròK3ê?$
Clé testée: Ù&÷Äöþ8, décodage associé: Ík¿ÏUXO(sp+É'NÕ¶û*4®ýÜñÚëÝ
Clé 2: A0o8Er5Q
Clé testée: Lxp8K5qW, décodage associé: CodeS-SouceS IS YOUR FRIEND
Clé testée: ú0ñeþÎÚ, décodage associé: ¹´d± YË]°[LS7rO;æ)úÞùkÄYº1
Clé 3: A9n0o875
Clé testée: "%T"î±, décodage associé: û%äRw ¸õU$é¸wsmI§Ôí 2ø}5>F
Clé testée: €ÛD0)c, décodage associé: ߨ
²0$Õ¦7§HfeÚd"|O-¢)dYL°
Clé 4: Bt789hd
Clé testée: ÿ#¦b@ª8, décodage associé: d3YÜåCl@ëÝxôèlPÓ2Y^Æw¿NÖ1
Clé testée: È;SFä, décodage associé: ðÔH½ë³L] d§0é}?F@¾Ú{§åã1©""ü
Essais Emma:
Clé 1: AkjzFd9i
Clé testée: ¢Mâ^., décodage associé: ÃòO$åÄ¿ çÜÞvoròK3ê?$
Clé testée: Ù&÷Äöþ8, décodage associé: Ík¿ÏUXO(sp+É'NÕ¶û*4®ýÜñÚëÝ
Clé 2: At789hd
Clé testée: €ªYLiMQ, décodage associé: z¼_~bËKKêÕã÷ÇpØ9%ËlG_ònÂ
Clé testée: oøiÚ%4, décodage associé: 9ú$ô¦"ç îr<[ GïüY¢ÁDµ÷A°ë
Clé 3: Aya3j8HZ
Clé testée: ëÈF²¥, décodage associé: þ¸aÛËÍ €ÆÍ¾¬8ÊÅ'ÂÍZúáNvRý
Clé testée: Lðï€ Ú¤, décodage associé: ;ä5ý ¢ô^³ÚÚ¼ü¥»N7*̶e"cHé
Clé 4: BBH890a1
Clé testée: zÀ¡", décodage associé: $êûþ¼¢ÍĨÐ0%O¨Ä,CT³ M®ÅES³Lê
Clé testée: 0°é"Ø€=;, décodage associé: "qó%wÂæÛ ]ÓÚj®J9Ø5{VàÃ^
Essais Fabien:
Clé 1: AkjzFd9i
Clé testée: ¢Mâ^., décodage associé: ÃòO$åÄ¿ çÜÞvoròK3ê?$
Clé testée: Ù&÷Äöþ8, décodage associé: Ík¿ÏUXO(sp+É'NÕ¶û*4®ýÜñÚëÝ
Clé 2: At789hd
Clé testée: €ªYLiMQ, décodage associé: z¼_~bËKKêÕã÷ÇpØ9%ËlG_ònÂ
Clé testée: oøiÚ%4, décodage associé: 9ú$ô¦"ç îr<[ GïüY¢ÁDµ÷A°ë
Clé 3: Aya3j8HZ
Clé testée: ëÈF²¥, décodage associé: þ¸aÛËÍ €ÆÍ¾¬8ÊÅ'ÂÍZúáNvRý
Clé testée: Lðï€ Ú¤, décodage associé: ;ä5ý ¢ô^³ÚÚ¼ü¥»N7*̶e"cHé
Clé 4: B9n0o875
Clé testée: ´åYßÚÛö, décodage associé: ä:&^ês;ò7ñ2Ãÿ)Ͷ¢ÓÝûM+j y
Clé testée: FþX^W§, décodage associé: ªÅ6[ÈðÂð';"ËåÎ8ðceË6W¹Jþ>'
Essais Geraldine:
Clé 1: AkjzFd9i
Clé testée: ¢Mâ^., décodage associé: ÃòO$åÄ¿ çÜÞvoròK3ê?$
Clé testée: Ù&÷Äöþ8, décodage associé: Ík¿ÏUXO(sp+É'NÕ¶û*4®ýÜñÚëÝ
Clé 2: At789hd
Clé testée: €ªYLiMQ, décodage associé: z¼_~bËKKêÕã÷ÇpØ9%ËlG_ònÂ
Clé testée: oøiÚ%4, décodage associé: 9ú$ô¦"ç îr<[ GïüY¢ÁDµ÷A°ë
Clé 3: A5Tu8Fj
Clé testée: }'þAGÃ V, décodage associé: CEX¢$õfËKû5¹µ"yð{'M"£bè
Clé testée: ÅLSÍÌ, décodage associé: ö:ë\a3
ÆÐáÅr)©Qr³¯~üat;ñôê
Clé 4: Bya3j8HZ
Clé testée: ¡±%à;¶±, décodage associé: Eìu1ñdôE1Eò@oL¼²íØíè¦mî»ÝS
Clé testée: Ó0È eÏé], décodage associé: ¡'ÆüîÛª{Üøg°±U ½hÒøqp1f¢
Essais Hubert:
Clé 1: AkjzFd9i
Clé testée: ¢Mâ^., décodage associé: ÃòO$åÄ¿ çÜÞvoròK3ê?$
Clé testée: Ù&÷Äöþ8, décodage associé: Ík¿ÏUXO(sp+É'NÕ¶û*4®ýÜñÚëÝ
Clé 2: At789hd
Clé testée: €ªYLiMQ, décodage associé: z¼_~bËKKêÕã÷ÇpØ9%ËlG_ònÂ
Clé testée: oøiÚ%4, décodage associé: 9ú$ô¦"ç îr<[ GïüY¢ÁDµ÷A°ë
Clé 3: A5Tu8Fj
Clé testée: }'þAGÃ V, décodage associé: CEX¢$õfËKû5¹µ"yð{'M"£bè
Clé testée: ÅLSÍÌ, décodage associé: ö:ë\a3
ÆÐáÅr)©Qr³¯~üat;ñôê
Clé 4: B5Tu8Fj
Clé testée: °ÌúP, décodage associé: 6:»°¿tO«Ü
æå ceØ;e¸pd»
Clé testée: Lxp8K5qW, décodage associé: CodeS-SouceS IS YOUR FRIEND
Effectivement, seuls Alain Barbara Charles Daniel et Hubert ont pu decoder!
Voili voila! Pour toutes questions, n'hesitez pas a me contacter!
Enjoy, ++