Comment générer un nombre aléatoire à l'aide de MICROCONTRÔLEUR STM32?
Je suis en train de travailler sur un projet avec STM32F103E arm cortex-m3 MCU dans keil microvision IDE.
J'ai besoin de générer des nombres aléatoires pour certaines raisons, mais je ne veux pas utiliser de nombres pseudo-aléatoires qui bibliothèques c++ standard, sont génératrices, j'ai donc besoin d'un moyen de produire de VRAIS nombres aléatoires à l'aide de matériel de fonctionnalités, mais je ne sais pas comment je peux le faire.
Une idée? (Je suis un ingénieur en génie logiciel & pas d'électronique professionnelle, donc veuillez décrire simple :P)
Est-ce que votre puce/carte de matériel RNG?
De quoi avez-vous besoin de nombres aléatoires?
J'ai besoin de nombres aléatoires pour une clé RSA de génération. Comme Jari dit, il semble que la F1 n'a pas RNG, mais je veux savoir est-il possible de simuler RNG matériel à l'aide d'autres caractéristiques matérielles (ex CCF)?
J'imagine que vous pouvez acheter un TRNG puce que vous pouvez communiquer avec l'une des interfaces sur le STM32.
De quoi avez-vous besoin de nombres aléatoires?
J'ai besoin de nombres aléatoires pour une clé RSA de génération. Comme Jari dit, il semble que la F1 n'a pas RNG, mais je veux savoir est-il possible de simuler RNG matériel à l'aide d'autres caractéristiques matérielles (ex CCF)?
J'imagine que vous pouvez acheter un TRNG puce que vous pouvez communiquer avec l'une des interfaces sur le STM32.
OriginalL'auteur Ehsan Khodarahmi | 2013-02-10
Vous devez vous connecter pour publier un commentaire.
Comme l'a souligné, la puce n'a pas un matériel RNG.
Mais vous pouvez rouler votre propre. L'approche habituelle consiste à mesurer la gigue des horloges. Indépendant signifie que les deux horloges sont soutenus par différents christals ou RC-oscillateurs et ne proviennent pas de la même chose.
Je voudrais utiliser:
Configurer un compteur sur le kHz-gamme RC oscillateur pour vous donner une interruption de plusieurs fois par seconde. Dans le gestionnaire d'interruption-vous de lire la valeur actuelle de la SysTick compteur. Si oui ou non SysTick est utilisé à d'autres fins (planification), la baisse des 5 ou si les bits sont par tous les moyens imprévisible.
Pour obtenir des nombres aléatoires de cela, utiliser une normale pseudo RNG. L'utilisation de l'entropie recueillis ci-dessus à l'improviste la mutation de l'état interne de la pseudo RNG. Pour la génération de clés, ne lisez pas tous les bits à la fois, mais de permettre à un couple de mutations à arriver.
Attaques contre ce sont évidentes: Si l'attaquant peut mesurer ou de contrôler l'kHz-gamme RC oscillateur jusqu'à MHz précision, le hasard s'en va. Si vous êtes inquiet à ce sujet, l'utilisation d'une carte à puce ou d'autres co-processeur.
OriginalL'auteur edgar.holleis
C'est une vieille question, j'ai juste couru à travers, mais je tiens à répondre parce que je ne trouve pas les autres réponses satisfaisantes.
"J'ai besoin de nombres aléatoires pour une clé RSA de génération."
Cela signifie qu'un GÉNÉRATEUR de routine (trop souvent à tort appelée RNG, une bête noire de la mine) est INACCEPTABLE et ne sera pas fournir la sécurité voulue.
Externe vrai RNG est acceptable, mais le plus élégant de réponse est de changer au cours d'une STM32F2xx ou STM32F4xx microcontrôleur qui N'ont un VRAI générateur de nombre aléatoire, signifiait précisément pour des applications telles que cela. Pour le développement, je suppose que vous pourriez utiliser thr F1 et tout PRNG, mais la tentation qu'il y aurait "il fonctionne, nous allons expédier" avant d'utiliser un vrai générateur de nombres aléatoires, la livraison d'un produit défectueux lorsque le DROIT de composant (certainement le ST F4, et je pense aussi que l'F2 jetons ont été autour depuis avant cette question a été posée) est disponible.
Cette réponse peut être inacceptable pour des raisons non techniques (la puce a déjà été spécifié, l'OP a pas d'entrée pour les fonctionnalités nécessaires), mais celui qui a choisi la puce doivent avoir sélectionné en fonction de ce qu'on-chip périphériques et les fonctionnalités nécessaires pour l'application.
OriginalL'auteur Ben Bradley
F1 de la série ne semble pas avoir RNG (matériel générateur de nombre aléatoire), de sorte que vos seules options sont d'utiliser des pseudo-aléatoires ou demander de l'entrée externe (certains considèrent par exemple, la main de l'homme mouvement aléatoire). Vous obtenez souvent mieux pseudo-aléatoires à l'aide de quelques crypto bibliothèque au lieu de bibliothèques C++ standard.
OriginalL'auteur Jari Karppanen
Il y a une autre méthode que j'ai trouvé et testé qui fonctionne très bien. Il peut générer de véritables aléatoire des numéros de 32 bits, je n'ai jamais vérifié la façon dont il est rapide, ce qui peut prendre quelques millisecondes par numéro. Voici comment ça se passe:
Répéter à quelques reprises, j'ai trouvé 8 fois donne assez de bonnes aléatoire. J'ai vérifié le caractère aléatoire par un tri des valeurs de sortie dans l'ordre croissant et en les traçant dans excel, avec de bons nombres aléatoires cela génère une ligne droite, mauvais caractère aléatoire ou "agglutination" de certains numéros est immédiatement visible.
Voici le code pour STM32F03:
}
OriginalL'auteur Schnitzgi