Je travaille sur la STM32L152XX qui a un périphérique pour effectuer le cryptage AES128 (CBC). Cependant, pour initialiser un IV aléatoire, je recherche un bon système pour créer une séquence de numéro aléatoire sécurisée cryptographiquement. J'utilise un simple LCRG (générateur de conguations linéaires) en tant que titulaire de lieu pour le moment, mais cela est faible. P>
Je suis nouveau à la mise en œuvre de cryptage sur une plate-forme intégrée, donc je me demande quelle est la pratique courante là-bas pour générer PRNG cryptographique? Ou quelle est une bonne stratégie pour choisir la clé et le IV? P>
La plupart des réponses sur Stackoverflow pour PRNG cryptographique font référence à la bibliothèque tierce de la 3ème partie qui n'est pas disponible sur cette plate-forme. Cependant, si cela vaut la peine d'essayer, je peux essayer de le porter. Les liens et les pointeurs vers des ressources seraient utiles aussi! P>
J'ai accès à l'horloge système et aux accéléromètres à bord. Je couronne des fresertos. Merci! P>
3 Réponses :
Vous allez probablement avoir besoin de définir «cryptographiquement sécurisé» ou votre application un peu mieux. Si cela était pour un jeu sur un téléphone mobile, vous pouvez probablement utiliser l'accéléromètre comme source de hasard. Si vous essayez de signer des certificats X.509, vous pouvez envisager un quincaillerie attaché qui mesure la carie radioactive. P>
En toute gravité, en fonction de la force du "aléatoire" que vous devez prendre en compte les éléments suivants: p>
L'une des méthodes ci-dessus peut avoir besoin d'avoir une sorte de Algorithme De-Bias appliqué à eux. Le plus simple est de considérer votre entrée 2-bits à la fois. Si les 2 bits sont égaux, jetez-les. 0B10 devient 1 et 0b01 devient 0. Cela garantira que vous obtiendrez plus ou moins le même nombre de 1s et 0s dans votre valeur aléatoire finale. P>
Enfin, si cela est pour quelque chose de grave, vous devez ignorer tous les conseils ci-dessus et ne pas rouler votre propre crypto. Trouvez une API pour votre plate-forme qui a déjà été vérifié et utilisez cela. Tester un algorithme de caractère aléatoire est très difficile à faire. P>
Considérez peut-être le série F-2 du noyau STM32 A > qui contient apparemment un matériel rng p>
J'aimerais pouvoir donner un autre +1 pour l'option de comédie. "Cryptographie malveillante: exposer la cryptovirologie" a un "algorithme de génération de clé de caveman"; "Un moyen sans échec de générer une clé publique et de le certifier sans s'inquiéter de Backdoors": grimper dans la crevasse la plus profonde de la croûte terrestre, assurez-vous que personne ne vous ait suivi là-bas, retournez une pièce de monnaie et exécutez Neumann UnliaSing sur le Les résultats pour générer des jeux de monnaie impartiale, utilisent un crayon pour écrire la clé privée résultante, calculer la clé publique sur papier, mémoriser la paire de clés, graver le papier, le crayon et la lampe de poche ... "
@Pete Baughman: Merci! Mon application concerne la sécurité de la communication sur la radio entre deux périphériques. Cependant, je n'ai pas besoin de signer des certificats X.509 et, étant donné que le facteur de forme est plutôt petit, le matériel existant est préférable. Réponse grande et complète! De-biaiser n'a pas traversé mon esprit et c'est un bon conseil. Je pense que 1 et 3 seraient mon choix pour le moment. J'ai également examiné la série F-2 et cela pourrait être une possibilité.
@Trungle La chose "x.509" était plus un exemple d'application "sérieuse". Il devrait vraiment dire "considérer les conséquences si cela n'est pas assez aléatoire". Si la réponse est "Les gens pourraient être blessés" ou "des millions de dollars pourraient être perdus", vous devez accorder une attention particulière à la validation de votre source d'entropie.
Une mise en garde avec un échantillonnage d'une minuterie de 1 GHz est que vous auriez besoin de capturer de nombreux événements sur la période de quelque chose comme 30 secondes avant d'avoir suffisamment d'entropie pour commencer à produire des nombres imprévisibles. Cela signifie, par exemple, que si vous avez calculé votre premier IV à partir de la RNG automatiquement pendant la démarrage, le résultat peut être l'une des mille ou des dizaines de milliers de possibilités, ce qui rendrait la connexion triviale à la force brute.
La réponse de Pete Braughman couvre quelle bonne réponse à cette question devrait: ésanguer et combiner des sources d'entropie faibles. Je serais un peu hésitant à utiliser la mémoire ininitialisée dans le processus; Je peux penser à des scénarios où un système basé sur l'hypothèse selon laquelle une mémoire non initialisée n'est pas utilisée auparavant par un utilisateur malveillant pourrait être compromis. Autre que cela, il n'y a pas grand chose que je peux être en désaccord avec. P>
Dans l'intérêt de sauver votre temps réinventer une roue déjà déjà inventée, ma suggestion serait de regarder brièvement cryptlib à condition que vous ne l'avez pas déjà fait; " la nature très portable de CryptLib signifie qu'il est également utilisé dans une variété d'environnements de système embarqués personnalisés, notamment AMX, chorusos, ECOS, Freertos / OpenRtos, UItron, MQX, Palmos, RTEEM, THFX, T-Kernel, UC / OS II, VDK, VXWorks et XMK. EM> "Cette bibliothèque fait probablement la plupart du travail pour vous; En supposant qu'il est réalisable d'utiliser CryptLib, vous n'avez peut-être pas besoin de l'alimenter avec des informations aléatoires (à partir de sources multiples): " l'opération de collecte de données aléatoire est contrôlée avec le fonction crypttaddrandom, qui peut être utilisée pour injecter votre propre aléatoire informations dans le pool de sitness interne ou pour dire à CryptLib de sonder le système pour informations aléatoires. em> " p>
Merci! C'est un grand pointeur et je n'ai pas regardé de près dans cette lib. J'ai ajouté à mon post que je couronne Freertos
Je sais que c'est une question assez ancienne, mais que personne ne mentionne le prng cryptographiquement sécurisé, je pensais que j'aimerais choisir. "Cryptographiquement sécurisé" IVS et clés doivent être générés avec Crypto PRNG, par ex. HMAC_DRBG ou CTR_DRBG . Le premier est basé sur HMAC , ce dernier est basé sur AES en mode CTR . Ces deux PRNG sont disponibles dans PolarsSL, qui fonctionne également sur Freertos . Veillez à ne pas utiliser Dual_ec_DRBG, c'est Backdoored par la NSA et ne doit jamais être utilisé plus. p>
Plus important encore, vous avez besoin d'une source d'entropie pour semer ces PRNG. Malheureusement, c'est la partie difficile des dispositifs incorporés. Vous pouvez trouver des idées dans Ce blog , par exemple. Prendre la sortie ADC. P>
Spécifiquement sur IVS, un autre critère important est qu'il devrait être imprévisible. C'est-à-dire qu'il ne devrait y avoir de moyen systématique pour qu'un attaquant de prédire le IV du prochain chiffrapheText, étant donné le chiffretext actuel. Ceci permet d'éviter attaque BEAST-comme sur TLS 1.0 . P>
Enfin, pour ce genre de questions, vous auriez de meilleures chances d'obtenir d'excellentes réponses sur crypto.stackexchange.com . p>
Exécutez-vous sur Windows, Linux ou un système d'exploitation écrit personnalisé? En cas de coutume, qui l'a écrit et a-t-il des aptituées à obtenir des variables de cryptorandom?
Je recommanderais une bibliothèque préexistante, mais si vous devez absolument faire rouler votre propre, FIPS 186-2 Modifier un avis de modification 1 (section: Algorithme révisé pour le calcul des valeurs M de X B> et La génération de nombres aléatoires b>) est simple à mettre en œuvre. Vous aurez toujours besoin de le graver à l'aide d'un PRNG avec une bonne entropie et vous aurez besoin d'une bibliothèque Bignum et d'une mise en œuvre SHA.
Merci. Je couronne des fresertos.
Si je comprends la question Correnctly, votre problème est davantage de collecter suffisamment d'entropie plus que l'aspect PRNG lui-même. Puisque vous dites que vous avez une radio ci-joint, êtes-vous capable de programmer cela pour vous donner une bite brute sans aucune correction d'erreur ou détection de paquets? Cela pourrait être une source de débit à haut débit.
@ sh1 Ce que j'ai fini par faire est d'avoir un téléphone intelligent généré le nombre aléatoire que de le transmettre à travers la radio. Ce numéro est utilisé uniquement pour le IV. Maintenant, depuis que mon modèle de menace n'empêche pas un attaquant présent au moment de cet échange initial, il est acceptable à ce stade d'envoyer ce numéro dans le claire. Certaines des suggestions et des commentaires d'ici ont des idées intéressantes que je veux essayer, mais avec les contraintes données sur le produit, j'ai opté pour cette solution à ce stade pour supprimer le bloc routier.