博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】亂數產生器:Random 與 RNGCryptoServiceProvider
阅读量:7136 次
发布时间:2019-06-28

本文共 2129 字,大约阅读时间需要 7 分钟。

一般眾所周知的亂數的產生應該都會使用  類別,而在大部分的情境中使用 Random 類別其實是足夠用的,例如說你想要透過亂數選取目錄中的照片輸出到網頁中,或是將篩選出來的資料亂數排序後輸出到檔案(例如說抽獎程式)。

假設你要用 Random 類別產生 10 組最大值為 100 的亂數(0 ~ 100),可以用以下寫法:

Random rnd = new Random();for (int i = 0; i < 10; i++){   int randomNumber = rnd.Next(100);}

詳細的說明與範例可參照 MSDN 文件: 類別。

不過 Random 類別是使用「有限性數學演算法」所計算出來的結果(目前 Random 類別的實作是以 Donald E. Knuth 的減法亂數產生器演算法為主),因此計算出來的「亂數」其實不是真的那麼亂,若要將亂數套用在「密碼產生器」或用來產生「強勢金鑰(Strong Key)」的話,就應該使用 類別幫你產生「夠強」的亂數。

如果要使用 RNGCryptoServiceProvider 類別產生亂數的話可以參考 MSDN 上的範例,或是用我之前常用的一個靜態類別來產生亂數(介面跟 Random 類別類似),如下:

using System;using System.Security.Cryptography;/// /// 使用 RNGCryptoServiceProvider 產生由密碼編譯服務供應者 (CSP) 提供的亂數產生器。/// public static class RNG{    private static RNGCryptoServiceProvider rngp = new RNGCryptoServiceProvider();    private static byte[] rb = new byte[4];    ///     /// 產生一個非負數的亂數    ///     public static int Next()    {        rngp.GetBytes(rb);        int value = BitConverter.ToInt32(rb, 0);        if (value < 0) value = -value;        return value;    }    ///     /// 產生一個非負數且最大值 max 以下的亂數    ///     /// 最大值    public static int Next(int max)    {        rngp.GetBytes(rb);        int value = BitConverter.ToInt32(rb, 0);        value = value % (max + 1);        if (value < 0) value = -value;        return value;    }    ///     /// 產生一個非負數且最小值在 min 以上最大值在 max 以下的亂數    ///     /// 最小值    /// 最大值    public static int Next(int min, int max)    {        int value = Next(max - min) + min;        return value;    }}

有個這個「夠強」的亂數產生器,就可以用來產生密碼了,如果你要產生一組固定長度 8 碼的密碼,可以用以下程式碼:

System.Text.StringBuilder sb = new System.Text.StringBuilder();char[] chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();int length = RNG.Next(8, 8);for (int i = 0; i < length; i++){    sb.Append(chars[RNG.Next(chars.Length - 1)]);}string YourPassword = sb.ToString();

這樣的密碼並沒有說就比較安全,只能說在演算法的角度來看是比較亂的密碼。如果你只是想要一串「亂亂的文字」的話,我也看過有人直接用 Guid 來當作亂碼。

string RandomString = Guid.NewGuid().ToString();

下面這個是我實做 RNGCryptoServiceProvider 的密碼產生器:

實做 RNGCryptoServiceProvider 的密碼產生器產生的密碼:[
67ed3voueE]

相關連結

转载于:https://www.cnblogs.com/sofire/archive/2010/06/09/1754441.html

你可能感兴趣的文章
怎样把你的产品融入到客户的心智
查看>>
23种设计模式--轻松扯淡理解方式
查看>>
C#部分正则判断
查看>>
不忘本系列~目录
查看>>
cocos2d: 使用TexturePacker , pvr.ccz, CCSpriteBatchNode, CCSpriteFrameCache
查看>>
Windows 7下笔记本无线网络共享
查看>>
mysql优化--触发器和auto_increment
查看>>
Spring整合JUnit框架进行单元测试代码使用详解
查看>>
在美出差中国程序员,利用emoji表情处理,横扫美国程序员
查看>>
何为Objective-C,小编也不是太懂:)
查看>>
决战618背后,电商平台的技术秘密
查看>>
OPPO R11前后2000万、拍照更清晰,再次引领手机发展
查看>>
荣耀畅玩6X升级EMUI5.0,这个功能你造吗?
查看>>
多家中概股跌破发行价仅拼多多等少数坚挺 融360企稳回升
查看>>
机器学习工程师面试题集锦附指南:互联网公司篇!
查看>>
开学防骗很重要!阿里攻城狮和程序媛用算法给骗子“画个像”
查看>>
海南房屋销售持续下降 2019年大力发展房屋租赁市场
查看>>
甘肃阿克塞百余只“岩壁精灵”雪中觅食
查看>>
java现在就业必备知识点,面试的时候会考哦
查看>>
大理双廊客栈餐饮恢复营业 冀春节重燃“诗与远方”旅游热
查看>>