Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

BROADCAST ENCRYPTION


Information sur le tutorial

Catégorie :Sécurité & Cryptage Date de création : 08/07/2005 14:51:23 Vu : 4 340 fois

Note :
9,4 / 10 - par 5 personnes
9,40 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

Description

Imaginez que certains de vos fichiers doivent etre accessible par certains users, que d'autres fichiers doivent etre accessibles par d'autres users, etc... Imaginer de pouvoir gerer ca sans vous soucier de "cacher" vos fichiers sur votre serveur, mais bien au contraire en les laissant accessible par tous! Voila ce que permet de faire la broadcast encryption.

Tutorial

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).'">&nbsp;'.$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$åÄ¿ çÜÞ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: ª[#{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÷)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: ª[#{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¿Œ ¡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! Pour toutes questions, n'hesitez pas a me contacter!
Enjoy, ++

signaler à un administrateur
Commentaire de malalam le 13/07/2005 09:37:31 administrateur CS

Ah, ca ne marchait pas jusqu'a ce matin, cette page.
Bah moi j#apprecie! Je n'ai pas eu le temps de regarder en detail, mais juste pour l'idee : 10.

signaler à un administrateur
Commentaire de Binabik87 le 11/09/2005 13:29:04

pareil :) c un peu complexe mais surement très efficace quand on gère plein d'utilisateur.

signaler à un administrateur
Commentaire de Shibo_Sources le 08/01/2006 18:18:06

Je viens de lire le tout et sa me parait asser efficace, reste à faire l'implementation :D
Merci pour ce tuto !

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,250 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.