Connexion
Abonnez-vous

CloudFlare présente la League of Entropy, pour obtenir des nombres aléatoires

CloudFlare présente la League of Entropy, pour obtenir des nombres aléatoires

Le 18 juin 2019 à 09h25

Dans le cas présent, l'entropie peut être définie comme le niveau d'imprédictibilité d'un nombre aléatoire. En effet, il faut distinguer nombre aléatoire et nombre aléatoire… car ce n'est pas si évident d'avoir un nombre véritablement aléatoire.

CloudFlare, par exemple, utilise toute une panoplie de lampes à lave et une caméra servant d'entrée à un générateur de nombres pseudo-aléatoires. L'université du Chili utilise des mesures sismiques, etc. Chacun y va de sa sauce maison pour arriver au résultat souhaité.

Partant du principe qu'un mélange de nombres aléatoires est toujours plus aléatoire qu'un seul nombre, League of Entropy mélange cinq sources (Cloudflare, École polytechnique fédérale de Lausanne, Université du Chili, Kudelski Security et Protocol Labs) pour produire un résultat. La ligue est ouverte et de nouveaux membres peuvent venir rejoindre les rangs pour encore renforcer le caractère aléatoire et limiter le risque de dépendance à une poignée de sources.

Le nombre ainsi généré est affiché sur le site avec une mise à jour toutes les 60 secondes. Pourquoi 60 secondes ? « Sans raison particulière » affirme CloudFlare. Vous pouvez voir l'ensemble des précédents résultats, mais pas en choisir un au hasard.

La génération de clés de chiffrement repose sur l'utilisation de grands nombres aléatoires. Mais attention, les résultats affichés par la League of Entropy ne vous serviront à rien dans le cas présent : « les utilisateurs ne doivent PAS utiliser ces nombres générés aléatoirement pour leurs clés secrètes », car ils sont accessibles à tout le monde.

Pour autant, obtenir de vrais nombres générés aléatoirement et disponibles publiquement est très utile. Par exemple pour les élections lorsqu'il faut sélectionner au hasard des bureaux de vote, pour les tirages au sort, etc. Des détails sont donnés dans ce billet de blog. Des détails plus techniques sont également disponibles par ici.

La ligue utilise Drand (disponible sur GitHub, licence MIT) pour générer les nombres aléatoires annoncés publiquement, mais il est aussi possible d'utiliser un ou plusieurs nœuds de la ligue pour obtenir un nombre privé. De la documentation est disponible par ici.

Le 18 juin 2019 à 09h25

Commentaires (22)

Vous devez être abonné pour pouvoir commenter.

Abonnez-vous
votre avatar

Alors pourquoi afficher publiquement des valeurs ?



Le but ici n’est pas de prouver quoi que ce soit, c’est juste un mélange de plusieurs sources supposées être les meilleures sources d’entropie possibles. Or justement, on ne peut pas vérifier ces sources, on ne peut que se baser sur leur réputation.

votre avatar

Ah bon ??? C’est marrant, ce n’est pas ce que je lis… Allez, je cite ta citation :



To retrieve and verify the latest random value using the experimental configuration, install Golang v1.11+, set your GOPATH, and execute: 

A ton avis, le “and verify” dans le texte, il veut dire quoi ?

 

votre avatar

Et le “retrieve”, il veut dire quoi ?

votre avatar

Woaw l’argument imparable. Scotché je suis, tu as tout compris.



Que tu le comprennes ou non est indifférent. Le système tel qu’il est décrit (et pour s’en convaincre il suffit de lire les documents - ce qui je l’admets requiert un minimum d’ouverture d’esprit) a pour intérêt principal la possibilité pour un auditeur de vérifier que le tirage n’a pas été biaisé par un des participants.



Je ne peux donc que te proposer de lire attentivement l’article de blog et d’essayer de le comprendre. Par exemple en s’attardant sur les mots “unbiasability” et “verifiability” qui sont d’une portée plus importante qu’une remarque sur le mot “retrieve” sur lequel tu sembles faire une fixation.



Évidemment que le protocole te permet de retrouver la valeur… personne n’affirme le contraire. Ca servirait à quoi un générateur aléatoire parfait, mais dont on ne pourrait pas retrouver les valeurs ?&nbsp;<img data-src=" />

&nbsp;

votre avatar

Si la méthode t’intéresse plus que le résultat, c’est que tu n’en as pas réellement besoin.



J’ai développé une application de crypto pour laquelle il faut des nombres aléatoires. Alors le sujet m’intéresse sûrement au moins autant que toi. Je pourrais en écrire des pages, mais j’ai mieux à faire.


votre avatar

Oh oui, surtout, arrête d’en parler ça vaudra mieux pour tout le monde. En deux courtes phrases tu viens de démontrer que tu n’as strictement rien compris au problème, alors en plusieurs pages, j’ai peur que tu t’enfonces encore plus.



Déjà toute personne un peu au courant sait qu’on de “développe” pas des applications de cryptographie, on utilise scrupuleusement les technologies déjà analysées par des gens plus compétents que soi. Mais oui, tu l’as dit aussi: surtout ne pas s’intéresser à la théorie, juste au résultat. Le meilleur moyen en cryptographie de faire n’importe quoi.



Et dans le genre n’importe quoi, ne me dis pas que tu es réellement intéressé ici par une source publique d’entropie pour en dériver des clés secrètes ? Vite, donne-moi les références de l’application que tu as écrite, histoire que je m’assure de ne jamais l’utiliser.

votre avatar







33A20158-2813-4F0D-9D4A-FD05E2C42E48 a écrit :



Déjà toute personne un peu au courant sait qu’on de “développe” pas des applications de cryptographie, on utilise scrupuleusement les technologies déjà analysées par des gens plus compétents que soi.





Donc VeraCrypt n’est pas “développée” ? Les algos de chiffrement c’est bien joli, mais ce n’est pas ça qui va s’occuper des accès disques, de l’interface, des méthodes de dissimulation, etc.

Même les codes de référence doivent parfois être lourdement retravaillés. Sans ça, VeraCrypt aurait encore des performances ridicules avec Serpent.



Mais je ne suis pas l’auteur de VeraCrypt. Je fais partie de ces gens déçus de TrueCrypt/VeraCrypt au point d’avoir créé et diffusé leur propre outil.







33A20158-2813-4F0D-9D4A-FD05E2C42E48 a écrit :



Et dans le genre n’importe quoi, ne me dis pas que tu es réellement intéressé ici par une source publique d’entropie pour en dériver des clés secrètes ?





C’est en faisant n’importe quoi qu’on finit par trouver des bonnes idées.

Mais en l’occurrence, je ne ferai rien du truc proposé par CloudFlare, vu qu’ils ont décidé de réserver ça aux amateurs du langage Go (ce qui au passage ne va pas faciliter les audits…).


votre avatar







vampire7 a écrit :



Donc VeraCrypt n’est pas “développée” ? Les algos de chiffrement c’est bien joli, mais ce n’est pas ça qui va s’occuper des accès disques, de l’interface, des méthodes de dissimulation, etc.

Même les codes de référence doivent parfois être lourdement retravaillés. Sans ça, VeraCrypt aurait encore des performances ridicules avec Serpent.





Évidemment qu’il faut “développer” les applications de crypto. Mais pas comme toi en autarcie dans son coin en se croyant plus malin que les autres. Une application de crypto, elle pas plus de temps à étre auditée par un groupe de gens autrement plus calés que nous qu’à être écrite.





Mais je ne suis pas l’auteur de VeraCrypt.&nbsp;



Tu vas rire, je pense que tout le monde avait compris ça en lisant tes interventions…









Justement, pas en cryptographie où la moindre déviation se paie cash. Mais comme dans ce domaine le péquin moyen se croit plus malin que Rivest, Shamir et Adleman réunis, il s’imagine qu’en changeant au hasard un bit dans une sbox il va augmenter la sécurité (puisque - hihihi - l’attaquant n’a aucun moyen de avoir quel bit j’ai changé !!! Je suis un génie !!!)





Mais en l’occurrence, je ne ferai rien du truc proposé par CloudFlare, vu qu’ils ont décidé de réserver ça aux amateurs du langage Go (ce qui au passage ne va pas faciliter les audits…).



Bon, t’aimes pas Go (Google c’est le mal, j’imagine). C’est ton droit, mais de là à imaginer que si toi-même tu ne le pratiques pas, alors aucun cryptographe au monde n’est assez malin que pour le comprendre et auditer le code, ça me semble un peu vaniteux, non ?


votre avatar

Pourquoi autant de violence ? Pourquoi prendre les gens de haut ?



Etre passionné par un sujet ne veut pas dire qu’on connait tout mieux que tout le monde et qu’on sait mieux ce qu’il faut faire ou ne pas faire et ce qu’il faut comprendre ou pas.



D’ailleurs, j’ai moi aussi du mal à comprendre pourquoi on ne peux demander à ce système de nous sortir des clé aléatoire “secrète” à la demande. Ce ne système ne peut servir du coup qu’à prouver à quelqu’un “regarde, la clé que j’ai utilisé pour ce truc est aléatoire”.&nbsp; &nbsp;

votre avatar







vampire7 a écrit :



Donc VeraCrypt n’est pas “développée” ? Les algos de chiffrement c’est bien joli, mais ce n’est pas ça qui va s’occuper des accès disques, de l’interface, des méthodes de dissimulation, etc.

Même les codes de référence doivent parfois être lourdement retravaillés. Sans ça, VeraCrypt aurait encore des performances ridicules avec Serpent.



Mais je ne suis pas l’auteur de VeraCrypt. Je fais partie de ces gens déçus de TrueCrypt/VeraCrypt au point d’avoir créé et diffusé leur propre outil.





C’est en faisant n’importe quoi qu’on finit par trouver des bonnes idées.

Mais en l’occurrence, je ne ferai rien du truc proposé par CloudFlare, vu qu’ils ont décidé de réserver ça aux amateurs du langage Go (ce qui au passage ne va pas faciliter les audits…).









Un “algo” va passer par plusisieurs étapes avant de se retrouver dans ton programme préféré.

Généralement, ça commence par des mecs qui planche des jours et des jours sur des papiers, des tableaux blancs pour trouver une solution et prouver mathématiquement qu’elle est valide théoriquement. Genre “elle est meilleur que la méthode truc muche”.

Puis souvent, il font aussi une première mise en oeuvre dans la langage quelconque pour tester si en pratique, elle est si bonne que ça (par exemple, le calcule des complexité d’un algo prend rarement en compte les propriétés matérielles : un accès random à la mémoire bourrant les défauts de cache te flingue un super algo) : le proof of concept.

Généralement à ce moment là, c’est publié, et tout le monde peut tester, approuver, critiquer…

Puis si l’algo devient assez populaire et tombe entre les mains d’un gars qui en a besoin pour son logiciel, là il sera mise en oeuvre pour un usage publique.



En soit, la mise en oeuvre et la preuve sont 2 choses différentes. Si ton algo de base est foireux, quelque soit la beauté de ta mise en œuvre, le langage utilisé pour le faire les optimisations matérielles… le résultat sera foireux.

Pire encore, même si l’algo est valide, mais si ta mise en œuvre est foireuse, ton résultat sera foireux.



Là, pour League of Entropy, on est clairement dans le cas d’un “Proof Of Concept”. Le papier original décrivant et prouvant la méthode est accessible ici. Les auteurs avaient déjà fait l’implémentation en GO qui n’est pas forcément facile à utiliser, encore moins visible. Ici, les gars rend ça bien visible sur un site et te donne un petit code facile à utiliser pour que tu puisses tester leur idées voir si ça marche bien. Rien ne t’empêche maintenant, avec ces connaissances en poche de faire une implémentation avec le langage que tu veux pour ton logiciel.



Pour le langage GO : c’est un langage apprécié. Il a l’avantage d’avoir un bon compromis entre simplicité d’écriture et efficacité à l’exécution. Comme généralement les PoC sont écrits par des gars qui sont plus des théoriciens, ce genre de langage est très adapté quand il s’agit de montrer l’efficace d’un algo.









bast73 a écrit :



Pourquoi autant de violence ? Pourquoi prendre les gens de haut ?



Etre passionné par un sujet ne veut pas dire qu’on connait tout mieux que tout le monde et qu’on sait mieux ce qu’il faut faire ou ne pas faire et ce qu’il faut comprendre ou pas.



D’ailleurs, j’ai moi aussi du mal à comprendre pourquoi on ne peux demander à ce système de nous sortir des clé aléatoire “secrète” à la demande. Ce ne système ne peut servir du coup qu’à prouver à quelqu’un “regarde, la clé que j’ai utilisé pour ce truc est aléatoire”.





C’est de la R&D saupoudré de marketing en gros.

Pour moi, c’est de la preuve de concept. Le but est de montrer qu’il existe une méthode et de laisser tester cette méthode. Après, tout le texte, c’est pour t’expliquer en quoi un tel méthode, avec ses propriétés, pourrait être utilisé.


votre avatar

Ce mécanisme n’a pas pour but de générer à la demande un “simple” nombre aléatoire. Tout simplement parce que cela n’a aucun sens. Je vais essayer de t’expliquer pourquoi, sans m’énerver, promis…



Si tu veux un nombre aléatoire, ton système d’exploitation contient déjà une primitive pour ce faire. Elle est “cryptographically secure” et donc tu peux l’utiliser comme clé de chiffrement, tu n’as pas besoin d’une source extérieure.



Imagine maintenant que tu n’aies pas confiance en ce générateur aléatoire (et c’est une crainte parfaitement légitime !) que fais-tu ? Eh bien tu demandes à une autre source. Certes, mais comment fais-tu pour te connecter de façon sécurisée à cette autre source ?



Tu me dis “pourquoi ne pas simplement utiliser cUrl ou wGet qui font ça très bien ?”.

Hé bien tout simplement parce que ces outils vont utiliser du SSL/TLS.

Et ce SSL/TLS, pour être sécurisé, il aura besoin de quoi ?

D’un nombre aléatoire…

Et qui va lui fournir ce nombre aléatoire ?

Ben… une fonction random tournant localement, pardi !

Ha oui mais non, tu viens de dire que tu ne fais pas confiance au système local pour la génération de clés cryptographiques !



Tu es dans une impasse : pour recevoir de l’extérieur un nombre aléatoire en lequel tu as confiance, tu dois préalablement générer localement un nombre aléatoire en lequel tu as confiance. Le “simple” SSL/TLS ne suffit pas. Et je ne parle même pas de l’hérésie de transmettre 512 bits sur un canal chiffré par une clé à (au mieux) 256 bits: en pratique tu as transmis 256 bits d’entropie, pas 512…



Bref, si tu veux t’isoler totalement des menaces extérieures, tu est obligé d’utiliser un stack cryptographique dont tu as la maîtrise complète, que tu exécutes sous ton propre contrôle, et qui ne nécessite pas que tu fasses confiance à un acteur en particulier. C’est une telle solution qu’ils proposent, à base de preuves cryptographiques et de chiffrements asymétriques (partiels, ce que je dois moi-même approfondir, parce que je suis un peu largué).



Leur solution garantit entre autres que le nombre qui a été généré ne peut pas avoir été biaisé, du moment que dans les sources il y en ait au moins quelques unes qui ne sont pas corrompues (et sans même qu’il te soit nécessaire de savoir lesquelles sont corrompues et lesquelles sont saines)



Mais encore une fois, si tu n’as pas besoin de telles garanties, et que tu veux une solution simple à utiliser, tu n’as pas besoin d’une source distribuée, continue à utiliser ton générateur local, il est très bien.

votre avatar







bast73 a écrit :



Pourquoi autant de violence ? Pourquoi prendre les gens de haut ?





Parce qu’on est sur un domaine où tout expliquer est pratiquement impossible.

Il y a également la confiance (donc l’affectif) qui entre en jeu. Mon contradicteur fait confiance aux sources externes utilisées dans le système discuté ici, moi non.



Et pour ma part, j’ai vu des choses tellement aberrantes et inimaginables dans le domaine de la cryptographie que mon point de vue est forcément décalé par rapport à ce qui est généralement admis.



Le problème de la confiance et des peurs se voit très bien dans le développement de TrueCrypt/VeraCrypt : les développeurs de TrueCrypt refusaient absolument de toucher au code des algos de chiffrement, qui provenait des implémentations de référence, la raison étant qu’il n’y a alors plus de garantie que le code fonctionne correctement dans tous les cas, même avec les “vecteurs de test”.

Le développeur de VeraCrypt semble beaucoup moins gêné par ça puisqu’il a ajouté une optimisation SSE2 à l’algorithme Serpent, triplant ainsi ses performances. C’est assez facile à faire (il ne m’a fallu que quelques heures, et à l’époque je n’avais aucun exemple), mais malgré tout, il faut réécrire une partie du code.


votre avatar







vampire7 a écrit :



Mon contradicteur fait confiance aux sources externes utilisées dans le système discuté ici, moi non.







Heu, non, je ne fais pas confiance aux sources… Où as-tu lu que je faisais confiance aux sources ?



J’ai juste dit que la méthode proposée permet de ne pas avoir besoin de leur faire confiance, puisqu’il faudrait qu’elles se liguent ensemble, toutes, pour que le résultat soit biaisé.







vampire7 a écrit :



la raison étant qu’il n’y a alors plus de garantie que le code fonctionne correctement dans tous les cas, même avec les “vecteurs de test”







La raison est que l’implémentation par défaut a été vraisemblablement auditée pour résister à des attaques “side channel” comme l’analyse du timing de certaines opérations et les patterns d’accès mémoire. Si tu modifies l’implémentation, même en démontrant formellement que les calculs sont identiques, tu cours le risque que ton implémentation soit victime de telles attaques qui permettraient de récupérer la clé.



votre avatar







33A20158-2813-4F0D-9D4A-FD05E2C42E48 a écrit :



La raison est que l’implémentation par défaut a été vraisemblablement auditée pour résister à des attaques “side channel” comme l’analyse du timing de certaines opérations et les patterns d’accès mémoire.





En l’an 2000, quasiment personne ne parlait de ça. 2 ans plus tard, Gladman publiait son implémentation optimisée de AES, avec un profond travail sur l’algorithme lui-même afin d’en améliorer les performances. Cette dernière est toujours largement utilisée, en dépit du fait qu’elle est vulnérable aux “cache-timing attacks”.

Je ne suis pas très sûr pour l’implémentation d’origine, vu qu’à l’époque où j’ai bossé dessus, celle-ci était introuvable. Le seul site vers lequel tous les liens convergeaient était HS. Ça a duré plusieurs mois, peut-être même un an ou deux.



Il a fallu attendre 2005 pour voir la première publication d’une attaque de ce type contre AES.



Serpent n’est pas vulnérable à ces attaques (et les optimisations SSE2 n’y changent rien), mais il n’a pas été sélectionné. Comme quoi on s’en foutait complètement à l’époque.


votre avatar







vampire7 a écrit :



Serpent n’est pas vulnérable à ces attaques (et les optimisations SSE2 n’y changent rien)







Serpent n’est peut-être pas vulnérable à certaines attaques. Affirmer que toutes ses implémentations sont de facto insensibles à toutes les attaques me semble péremptoire. En cherchant, la première chose que j’ai trouvée est une analyse de puissance sur le répartiteur de clés de round dans une smartcard.



https://eprint.iacr.org/2009/473.pdf


votre avatar

Je parlais de l’implémentation de référence. L’adaptation au SSE2 ne change rien car tout se passe toujours dans des registres (excepté qu’ils sont 4 fois plus gros et qu’on traite 4 blocs simultanément).



Pour l’attaque que tu cites, ça suppose un accès physique à la machine. Et c’est beaucoup trop difficile à réaliser. Il ne faut pas oublier qu’un simple keylogger casse les meilleures cryptographies qui soient… Et bien sûr, les menaces sont également efficaces.

votre avatar

Sauf que … non … Tu ne peux pas affirmer que “ça ne change rien”. Les ingénieurs d’Intel aussi disaient “ça ne change rien si on exécute cette instruction sans vérifier les protections mémoire puisque le résultat sera annulé plus tard”. Et vlan ! SPECTRE et Meltdown.



C’est typique des gens qui comme toi réfléchissent en terme de fonctionnalité: la fonctionnalité est la même donc les deux implémentations sont équivalentes. Tant qu’on en reste à la partie fonctionnelle, tu as parfaitement raison. En termes de sécurité, il faut réfléchir en termes de surface d’attaque et de scénarios d’attaque, et là tout change.



C’est toute la différence entre montrer qu’une application fait tout ce qu’on lui demande de faire, et démontrer qu’elle ne fait rien de plus que ce qu’on lui demande de faire.



Ici, en utilisant des instructions SSE tu augmentes la surface d’attaque puisque tu es maintenant à la merci d’un leak au niveau des registres SSE alors que l’implémentation de référence ne l’était pas.



Imagine maintenant que le round est décomposé en deux parties distinctes, une sensible à une attaque par timing, et une autre beaucoup plus longue qui ne l’est pas. Imagine ensuite que la variabilité du timing de la partie sensible est complètement noyé dans celui global d’un round et le risque a été classé comme négligeable. Si tu optimises la partie longue, la proportion de temps passée dans la partie sensible sera plus grande, et l’attaque par timing redevient plausible.



Je ne dis pas que tu as forcément introduit ces faiblesses, mais en analyse de risque tu ne peux pas balayer ces objections d’un revers de main, tu dois démontrer que ces risques ont été pris en compte et mitigés de manière appropriée.

votre avatar

D’après ce que j’en ai compris, le but ici n’est pas de fournir “simplement” des sources d’entropie supplémentaires (ce n’est, en soi, pas trop compliqué). Le but est de fournir des nombres “prouvablement” aléatoires, c’est-à-dire dérivés de plusieurs sources fiables.



Le protocole est ainsi que N sources réputées fournissent chacune un nombre aléatoire, et que de ces N sources on dérive un unique nombre aléatoire final qui possède deux caractéristiques fondamentales: d’une part il est démontrable que ce résultat final utilise l’entropie combinée des N sources, et d’autre part que même si un nombre restreint de sources se liguent entre elles pour fournir des valeurs biaisées, il leur est statistiquement impossible d’influer sur le résultat final.

votre avatar

33A20158-2813-4F0D-9D4A-FD05E2C42E48, ton pseudo aussi a été généré aléatoirement ?&nbsp;<img data-src=" />

votre avatar

Pourquoi faire simple quand on peut faire compliqué ?



To retrieve and verify the latest random value using the experimental configuration, install Golang v1.11+, set your GOPATH, and execute:



go get -u github.com/dedis/drand

cd $GOPATH/src/github.com/dedis/drand

go build

./drand get public deploy/190604/group.toml



Ils auraient pas pu donner un fichier sur une adresse fixe à récupérer directement avec cURL ou Wget ?

votre avatar

Oui.



C’est un UUID v4 ( reconnaissable au 4 dans -4F0D- ) donc contenant 122 bits aléatoires. Pas nécessairement “vraiment” aléatoires, mais qui contiennent quand même pas mal d’entropie… Je ne sais pas exactement combien (il a été généré par la fonction “generate GUID” d’un IDE Delphi 7 tournant sous Windows XP SP 2…) mais je ne me fais pas trop de souci quant à son unicité :-)



&nbsp;

&nbsp;

votre avatar

Non, ils n’auraient pas pu faire plus simple. Le but n’est pas “bêtement” de générer une valeur aléatoire, mais bien de prouver que cette valeur est sans biais. Cette preuve ne peut être fournie qu’en donnant une implémentation du protocole, que tu peux vérifier.

CloudFlare présente la League of Entropy, pour obtenir des nombres aléatoires

Fermer