2010-07-13 3 views
1

Dans .NET, vous pouvez générer des paires de clés RSA à l'aide de RSACryptoServiceProvide. Mais est-ce la meilleure option dans .NET pour générer des nombres vraiment aléatoires? Il y a des tonnes d'autres bibliothèques open source, telles que CryptoPlusPlus, qui peuvent être utilisées pour générer un nombre aléatoire. Je voudrais entendre les opinions d'autres experts. Merci d'avance pour vos deux cents.Quelle est la meilleure bibliothèque pour générer des nombres aléatoires pour les clés cryptographiques dans .NET?

Répondre

1

Les classes dérivées de RandomNumberGenerator génèrent des nombres réellement aléatoires.

+2

* aussi aléatoire que nous pouvons obtenir avec des algorithmes déterministes. –

+0

En outre: De la documentation: "Le code d'application n'utilise pas directement cette classe Cette classe abstraite est fournie comme classe de base pour tous les générateurs de nombres aléatoires cryptographiques." –

+0

Existe-t-il une preuve que la classe dérivée de RandomNumberGenerator, telle que RNGCyrptowareServiceProvide, est meilleure que la bibliothèque, où vous pouvez alimenter des sources aléatoires à partir d'une source externe. – weilin8

3

Je n'irais personnellement nulle part autre que RNGCryptoServiceProvider à moins que quelqu'un ne fournisse une preuve que ça craint. L'implémentation réelle utilisée par cette classe n'est pas disponible car elle est implémentée dans le cadre de l'exécution (System.Security.Cryptography.Utils._GetBytes ou System.Security.Cryptography.Utils._GetNonZeroBytes) ce qui, pour moi, est encourageant car j'espère que l'implémentation apportera au moins des informations ambiantes de la part de hôte pour générer les données.

je crois que ce sont acheminés jusqu'au niveau bas apis win32 qui, bien sûr, serait patchés si un trou de sécurité se trouve dans les (bien ... je l'espère!)

Comment cela se fait en Mono, Cependant, je ne le saurais pas.

Pour la très paranoïaque

Le vrai problème avec tout cela est que votre caractère aléatoire en .Net peut être brisé par un pirate malveillant en changeant le comportement de l'hôte (qui est - en écrivant une version modifiée runtime). C'est beaucoup plus facile dans une plate-forme de style VM comme .Net ou Java que dans le code natif (ce qui nécessiterait de pirater la plate-forme de niveau inférieur ou de modifier le matériel). Curieusement, l'utilisation de RNGCryptoServiceProvider simplifie grandement la tâche puisque ces appels internes sont implicitement approuvés par la partie gérée du framework .Net.

Cependant - en réalité - votre code va devoir être quelque chose de vraiment spécial pour quelqu'un qui veut aller à tous ces efforts. Donc, personnellement, j'utiliserais encore RNGCryptoServiceProvider.

Mais c'est pour ça que j'ai un vrai problème avec les tentatives de cryptage de bibliothèques et de fonctions écrites en javascript - un hack rapide de navigateur peut tout vider.

+0

En fait, prédire des nombres aléatoires générés par le système hôte est assez facile. Cheat Coder l'a fait avec de nombreux outils anti-triche qui créent des captures d'écran à des moments aléatoires. Ils ont juste eu la graine dans la mémoire et ont prédit les prochains nombres aléatoires. Je n'ai jamais mis en place une telle méthode, mais je l'ai vu fonctionner. – atamanroman

+0

@fielding: Je parie! Après avoir lu l'excellent chapitre de Practical Cryptography (http://www.schneier.com/book-practical.html) sur la génération de Randomness, il est si facile de tout abandonner! Si seulement j'avais un détecteur de rayons cosmiques ... –

0

Vous pouvez les obtenir auprès de random.org si votre projet le permet. Cela devrait être assez aléatoire.

Questions connexes