Broadcast encryption

Broadcast encryption

Description

Imaginez que certains de vos fichiers doivent être accessible par certains users, que d'autres fichiers doivent être accessibles par d'autres users, etc... Imaginer de pouvoir gérer ça 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.

Présentation

Je présente une méthode de crypto assez simple que j'ai découvert il y a peu.

Ça s'appelle BROADCAST ENCRYPTION (abréviations: BE). Cela permet de rendre accessible des données seulement à un sous-groupe d'utilisateurs choisis par l'admin parmi les membres par exemple de manière à ce que ce sous-groupe soit dynamique.

Plutôt que de la théorie, je présente juste un exemple simple avec un nombre fixe d'utilisateurs et sans révocation ou ajout. Il y a passablement de doc sur google pour ceux qui voudraient aller plus loin. En espérant que cela puisse intéresser 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'asymétrie si jamais).

Chaque utilisateur connait les clés de sa racine (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 et 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 Géraldine 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 utilisera la 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 ça sert?
Imaginez 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.

Code

<?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 />';
            }
        }
    }
?> 

Exécution

Si on exécute 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: 0/00¢Mâ-^.Y, décodage associé: Ãò"O$åÄ¿ çÜÞvo0/00ròK3ê?$
Clé testée: Ù&÷Äöþ8, décodage associé: Ík#¿ÏUX0/00O(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é: *S0/00ê/J<êêëò¬sÛàÛKªY¡?s4+'F7ò
Clé testée: {`yðýäù, décodage associé: /Y€Zh .m§X=â®»hÚ"OAÇ öYU%K$#¾
Clé 4: AMjgzrfB
Clé testée: "óc7 ', décodage associé: í¶µÄ/+·ÞFÚ9÷)v OEYzýY¯0/00öÌ#u
Clé testée: C"ý'Ý/ , décodage associé: èzÙ©ù/oeßæÉÏaXI+w/Âa!><€«Ñ

Essais Barbara :
Clé 1: AkjzFd9i
Clé testée: 0/00¢Mâ-^.Y, décodage associé: Ãò"O$åÄ¿ çÜÞvo0/00ròK3ê?$
Clé testée: Ù&÷Äöþ8, décodage associé: Ík#¿ÏUX0/00O(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é: *S0/00ê/J<êêëò¬sÛàÛKªY¡?s4+'F7ò
Clé testée: {`yðýäù, décodage associé: /Y€Zh .m§X=â®»hÚ"OAÇ öYU%K$#¾
Clé 4: BkjzFd9i
Clé testée: 7«æè-- `g, décodage associé: ÉV Þq8^%L¬Í' û*ÛsY(TM)Ã?²/ͦé õ¸T7
Clé testée: -ägQ}=Áu, décodage associé: r"Ì-5¿OE ¡6 5Káñ'æ)*fm'M±Ñ«

Essais Charles :
Clé 1: AkjzFd9i
Clé testée: 0/00¢Mâ-^.Y, décodage associé: Ãò"O$åÄ¿ çÜÞvo0/00ròK3ê?$
Clé testée: Ù&÷Äöþ8, décodage associé: Ík#¿ÏUX0/00O(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: oe"%T"î±, décodage associé: zû%äfRw "¸õU$é'¸wsmI§Ôí 2ø}>5>F
Clé testée: €ÛD0#)fc, décodage associé: ß--¨...²0$SÕ¦7§HfeÚd"|fO-¢)dYL°
Clé 4: B0o8Er5Q
Clé testée: 7·=»eù÷ý, décodage associé: sý J)^°>+/Õ2 ¨ GºÎ-Y*ıÇÖÉ@STÄ
Clé testée: #Ö{mNøê, décodage associé: Ù`<¢ÜÙ^Üõãïã½'ê'éùî¿;lCÆû-

Essais Daniel :
Clé 1: AkjzFd9i
Clé testée: 0/00¢Mâ-^.Y, décodage associé: Ãò"O$åÄ¿ çÜÞvo0/00ròK3ê?$
Clé testée: Ù&÷Äöþ8, décodage associé: Ík#¿ÏUX0/00O(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: oe"%T"î±, décodage associé: zû%äfRw "¸õU$é'¸wsmI§Ôí 2ø}>5>F
Clé testée: €ÛD0#)fc, décodage associé: ß--¨...²0$SÕ¦7§HfeÚd"|fO-¢)dYL°
Clé 4: Bt789hd
Clé testée: ÿ#¦b@ª8, décodage associé: d3YÜåCl@"YëÝsxôè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: 0/00¢Mâ-^.Y, décodage associé: Ãò"O$åÄ¿ çÜÞvo0/00ròK3ê?$
Clé testée: Ù&÷Äöþ8, décodage associé: Ík#¿ÏUX0/00O(sp+É'NÕ¶û*4®ýÜñÚëÝ
Clé 2: At789hd
Clé testée: €ªYLiMQ, décodage associé: z^z¼_~bËKK''êÕã÷ÇpØ9%'ËlG_ònÂ
Clé testée: oøiÚ%-4, décodage associé: 9ú'$ô¦"ç î>r<[- GïzüY¢ÁDµ÷sA°ë
Clé 3: Aya3j8HZ
Clé testée: ëÈSF²¥0/00, décodage associé: Zþ'¸aÛËÍ €Æ;¬8ÊÅ'ÂÍZúáN vRý
Clé testée: Lð0/00ï€ Ú¤, décodage associé: ;ä5ý ¢ô^³ÚÚ¼*ü¥»N7 *̶e"c Hés
Clé 4: BBH890a1
Clé testée: zÀ¡", décodage associé: $êûþ¼¢ÍÄ0/00 ¨Ð0%O¨Ä,CT³ M®ÅES³Lê
Clé testée: 0°é"Ø€=;, décodage associé: "qó%wÂOEæÛ #]ÓÚjOE®J9Ø5{V'àÃ^

Essais Fabien :
Clé 1: AkjzFd9i
Clé testée: 0/00¢Mâ-^.Y, décodage associé: Ãò"O$åÄ¿ çÜÞvo0/00ròK3ê?$
Clé testée: Ù&÷Äöþ8, décodage associé: Ík#¿ÏUX0/00O(sp+É'NÕ¶û*4®ýÜñÚëÝ
Clé 2: At789hd
Clé testée: €ªYLiMQ, décodage associé: z^z¼_~bËKK''êÕã÷ÇpØ9%'ËlG_ònÂ
Clé testée: oøiÚ%-4, décodage associé: 9ú'$ô¦"ç î>r<[- GïzüY¢ÁDµ÷sA°ë
Clé 3: Aya3j8HZ
Clé testée: ëÈSF²¥0/00, décodage associé: Zþ'¸aÛËÍ €Æ;¬8ÊÅ'ÂÍZúáN vRý
Clé testée: Lð0/00ï€ Ú¤, décodage associé: ;ä5ý ¢ô^³ÚÚ¼*ü¥»N7 *̶e"c Hés
Clé 4: B9n0o875
Clé testée: 'åYßÚÛö, décodage associé: ä:&^ês;ò7Zñ2'Ãÿ)Ͷ¢ÓÝ'ûM+j y
Clé testée: F þX^W§, décodage associé: zªÅ6[ ÈðÂð';"Ëå'Î8ðceË6W¹Jþ>'

Essais Géraldine :
Clé 1: AkjzFd9i
Clé testée: 0/00¢Mâ-^.Y, décodage associé: Ãò"O$åÄ¿ çÜÞvo0/00ròK3ê?$
Clé testée: Ù&÷Äöþ8, décodage associé: Ík#¿ÏUX0/00O(sp+É'NÕ¶û*4®ýÜñÚëÝ
Clé 2: At789hd
Clé testée: €ªYLiMQ, décodage associé: z^z¼_~bËKK''êÕã÷ÇpØ9%'ËlG_ònÂ
Clé testée: oøiÚ%-4, décodage associé: 9ú'$ô¦"ç î>r<[- GïzüY¢ÁDµ÷sA°ë
Clé 3: A5Tu8Fj
Clé testée: }'þAGÃ V, décodage associé: CEX¢$õffËKû5¹µ "yð{'M "£oebè
Clé testée: `ÅLzSÍÌ', décodage associé: ö:ë\fa3...ÆÐá År)©Qr³¯~üat;ñôê
Clé 4: Bya3j8HZ
Clé testée: ¡±%à;¶±oe, décodage associé: Eìu1ñdôE1EYò@oL¼²íØíè¦mî»ÝS
Clé testée: Ó0È eÏé], décodage associé: #¡'ÆüîÛª{'Üøg°±+U ½S>hÒøqp0/001f¢

Essais Hubert :
Clé 1: AkjzFd9i
Clé testée: 0/00¢Mâ-^.Y, décodage associé: Ãò"O$åÄ¿ çÜÞvo0/00ròK3ê?$
Clé testée: Ù&÷Äöþ8, décodage associé: Ík#¿ÏUX0/00O(sp+É'NÕ¶û*4®ýÜñÚëÝ
Clé 2: At789hd
Clé testée: €ªYLiMQ, décodage associé: z^z¼_~bËKK''êÕã÷ÇpØ9%'ËlG_ònÂ
Clé testée: oøiÚ%-4, décodage associé: 9ú'$ô¦"ç î>r<[- GïzüY¢ÁDµ÷sA°ë
Clé 3: A5Tu8Fj
Clé testée: }'þAGÃ V, décodage associé: CEX¢$õffËKû5¹µ "yð{'M "£oebè
Clé testée: `ÅLzSÍÌ', décodage associé: ö:ë\fa3...ÆÐá År)©Qr³¯~üat;ñôê
Clé 4: B5Tu8Fj
Clé testée: f~°Ì úP, décodage associé: 6:» °¿tO«Ü...æ åoe cYeØ;e¸z+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, ++

Ce document intitulé « Broadcast encryption » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous