Broadcast Encryption

malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 - 8 juil. 2005 à 14:22
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 - 9 juil. 2005 à 02:17
Salut a tous...


Ceci n'est pas une question mais j'avais juste envie de partage une experience interessante. C'est 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


// CONNEXION A LA BASE DE DONNEES


$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:
';


while ($rep = mysql_fetch_array($r)){


echo '&nbsp;'.$rep['name'].'
';


}


echo '';


}


else{


if ($_GET['be']==1){


$check = $_POST['check'];


echo 'Message à encoder: '.$_POST['mbe'].'
';


echo 'Utilisateurs Autorisés: ';


for ($i=0;$i<count($check);$i++){


echo $users[$check[$i]].' ';


}


echo '
';


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 '
';


for ($i=0;$i<$j;$i++) echo $allky[$keysused[$i]]. '
';


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.'
';


$iv = '00000000';


$secret = mcrypt_encrypt(MCRYPT_3DES, $mdp, $_POST['mbe'], MCRYPT_MODE_ECB,$iv);


$msgenc = bin2hex($secret);


echo 'Message encrypté: '.$msgenc.'
';


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:
';


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 '
Allons y...

';


// 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].':
';


for ($i=1;$i<=4;$i++){


$key = $allky[$rep['key'.$i]];


echo 'Clé '.$i.': '.$key.'
';


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).'
';


}


}


echo '
<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$åÄ¿ çÜÞvo‰ròK3ê?$
Clé testée: Ù&÷Äöþ8, décodage associé: Ík‡¿ÏUX‰O(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: ª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÷)vŒYzýŸ¯‰öÌ#u
Clé testée: C„ý’Ý/ , décodage associé: èžÙ©ù/œßæÉÏaXI+w/Âa


!›‹?«Ñ


Essais Barbara:
Clé 1: AkjzFd9i
Clé testée: ‰¢Mâ–^.Ÿ, décodage associé: Ãò„O$åÄ¿ çÜÞvo‰ròK3ê?$
Clé testée: Ù&÷Äöþ8, décodage associé: Ík‡¿ÏUX‰O(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: ª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¿Œ ¡65Káñ´æ)•fm‚M±Ñ«


Essais Charles:
Clé 1: AkjzFd9i
Clé testée: ‰¢Mâ–^.Ÿ, décodage associé: Ãò„O$åÄ¿ çÜÞvo‰ròK3ê?$
Clé testée: Ù&÷Äöþ8, décodage associé: Ík‡¿ÏUX‰O(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$åÄ¿ çÜÞvo‰ròK3ê?$
Clé testée: Ù&÷Äöþ8, décodage associé: Ík‡¿ÏUX‰O(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: È;SFä, décodage associé: ðÔH½ë³L] d§0é}?F@¾Ú{§åã1©""ü

Essais Emma:
Clé 1: AkjzFd9i
Clé testée: ‰¢Mâ–^.Ÿ, décodage associé: Ãò„O$åÄ¿ çÜÞvo‰ròK3ê?$
Clé testée: Ù&÷Äöþ8, décodage associé: Ík‡¿ÏUX‰O(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úáNvRý
Clé testée: Lð‰ï? Ú¤, décodage associé: ;ä5ý ¢ô^³ÚÚ¼•ü¥»N7*̶e"cHéš
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$åÄ¿ çÜÞvo‰ròK3ê?$
Clé testée: Ù&÷Äöþ8, décodage associé: Ík‡¿ÏUX‰O(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úáNvRý
Clé testée: Lð‰ï? Ú¤, décodage associé: ;ä5ý ¢ô^³ÚÚ¼•ü¥»N7*̶e"cHéš
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$åÄ¿ çÜÞvo‰ròK3ê?$
Clé testée: Ù&÷Äöþ8, décodage associé: Ík‡¿ÏUX‰O(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: ‘ÅLžSÍÌ‚, 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Òøqp‰1f¢

Essais Hubert:
Clé 1: AkjzFd9i
Clé testée: ‰¢Mâ–^.Ÿ, décodage associé: Ãò„O$åÄ¿ çÜÞvo‰ròK3ê?$
Clé testée: Ù&÷Äöþ8, décodage associé: Ík‡¿ÏUX‰O(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: ‘ÅLžSÍÌ‚, décodage associé: ö:ë\ƒa3…ÆÐáÅr)©Qr³¯~üat;ñôê
Clé 4: B5Tu8Fj
Clé testée: ƒ˜°ÌúP, décodage associé: 6:»°¿tO«Ü…æåœ cŸeØ;e¸ž†pd»
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! Enjoy, ++

9 réponses

malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
8 juil. 2005 à 14:24
Evidemment, mon arbre, le tableau et l'indentation n'ont pas survecu au post ...
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
8 juil. 2005 à 14:32
Hello Malik,



tu devrais mettre ca dans les tutos, plutot. Comme ca tu auras ton arbre et tout :-) (en liant un document par exemple).
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
8 juil. 2005 à 14:34
C rigolo quand meme : j'ai acces a tout, forum etc...mais pas a la page sommaire de phpcs!
0
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
8 juil. 2005 à 14:34
well, c'est pas un tut, c'est pas une source, j'avais quand meme envie de le partage, il me restait plus que le forum !

Mais merci pour l'info, ++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
8 juil. 2005 à 14:35
bien venu au club malam... c'est temps la page d'accueil a des soucis... et c'est pas que chez phpcs!
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
8 juil. 2005 à 14:36
Bah si moi je pense que ca peut avoir sa place dans un tuto...! Ce
serait interessant meme. C'est un petit tuto sur la Broadcast
Encryption!
0
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
8 juil. 2005 à 14:39
bon, ben on y va ok pour un chti copy paste du cote des tut.
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
9 juil. 2005 à 01:02
t'as qu'a pas la limiter à un tuto, mais à un espace membre version sécu !!!



(même si je penses que c'est plutot sur cppfrance qu'on pourrait voir un truc comme ça, dans un serveur de tchat...)

In a dream, I saw me, drop dead... U was here, U cried... It was just a deam, if I die, U won't cry, maybe, U'll be happy

http://coucou747.hopto.org
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
9 juil. 2005 à 02:17
Salut,



c'est pas mal, vu l'heure je ne me pencherai pas dessus mais je regarderai ça demain ;-)

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
0
Rejoignez-nous