日期:2014-05-18  浏览次数:20805 次

RSA,DES不是用来加密的吗?怎么做成密码序列发生器(随机数发生器)
是不是像RNGCryptoServiceProvider ,guid那样用现成的类生成随机数种子,然后无论是哪一种方式,都只是提供种子,都要用到random类,next方法?
要是这样,md5,des等三大加密算法都可以做成随机数发生器??
请问可不可以举个例子??

------解决方案--------------------
C# code
public class GaussianRNG
  {
    int iset;
    double gset;
    Random r1, r2;
    
    public GaussianRNG()
    {
      r1 = new Random(unchecked((int)DateTime.Now.Ticks));
      r2 = new Random(~unchecked((int)DateTime.Now.Ticks));
      iset = 0;
    }
    
    public double Next()
    {
      double fac, rsq, v1, v2;    
      if (iset == 0) {
        do {
          v1 = 2.0 * r1.NextDouble() - 1.0;
          v2 = 2.0 * r2.NextDouble() - 1.0;
          rsq = v1*v1 + v2*v2;
        } while (rsq >= 1.0 || rsq == 0.0);
        
        fac = Math.Sqrt(-2.0*Math.Log(rsq)/rsq);
        gset = v1*fac;
        iset = 1;
        return v2*fac;
      } else {
        iset = 0;
        return gset;
      }
    }
  }

------解决方案--------------------
楼上方法,用时间来做种子,是可以。
------解决方案--------------------
RNGCryptoServiceProvider就是随机数发生器啊,你不看MSDN吗?
C# code
RNGCryptoServiceProvider generator = new RNGCryptoServiceProvider();
generator.GetBytes(randomNumber);
int rand = Convert.ToInt32(randomNumber[0]);

------解决方案--------------------
RNGCryptoServiceProvider是CSP的随机数发生器,跟你用什么加密算法没关系...你可以直接用在RSA算法中,他们是各自独立的...
------解决方案--------------------
虽然都叫CryptoServiceProvider,可不是说他们是同类...RSACryptoServiceProvider是RSA算法提供程序,和RNGCryptoServiceProvider压根儿就不是一个类型...好好学英文...

再有,这种强度更大的CSP随机数发生器一般只用于CSP算法...你一个随机取字符的小玩意儿不需要用这种,Random就够用了...
------解决方案--------------------
你们都误解RNGCryptoServiceProvider类了!

RNGCryptoServiceProvider是做什么的?CryptoServiceProvider是抽象类RandomNumberGenerator的具体实现,他就是一个RandomNumberGenerator,专门为加解密算法而设计的随机数生成类。
专门来生成安全性极高的随机数,专门用于填充那些Key或IV的!

RNGCryptoServiceProvider名字包含里有CryptoServiceProvider,但他不是专门给CSP所调用的CryptoAPI服务的(纠正11楼错误),他是RNG的的CryptoAPI WinAPI实现,就像.NET中安全类库中的其他类一样,一个大的抽象类(如SHA1),分别有不同的实现子类,如SHA1Managed,SHA1CryptoServiceProvider,SHA1Cng分别代表(托管实现,CryptoAPI WINAPI实现,和下一代CryptoAPI(CNG))。

如下用RNG随即填充一个数组
C# code
            System.Security.Cryptography.RandomNumberGenerator gen = System.Security.Cryptography.RandomNumberGenerator.Create();
            byte[] data = new byte[100];
            gen.GetBytes(data);

------解决方案--------------------
经过加密后的数据相对原数据会有非常大的变化,貌似你问这么多其实只想要从一个数组中随即返回一个数字?或者随机打乱数组排序?
C# code
        static Random r = new Random();
        public static void Main()
        {
            int[] a = { 7, 2, 3, 6, 8, 44, 1, 8 };
            Console.WriteLine("随机返回:" + RandomRet(a));

            Console.WriteLine("随机排序");
            foreach (int i in RandomSort(a))
                Console.WriteLine(i);
        }

        static T RandomRet<T>(T[] array)
        {
            return array[r.Next(array.Length)];
        }

        static T[] RandomSort<T>(T[] array) where T : IComparable<T>
        {
            return array.OrderBy(i => r.Next()).ToArray();
        }