读书人

RSA,DES不是用来加密的吗?如何做成密

发布时间: 2012-03-22 17:43:57 作者: rapoo

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();        } 

读书人网 >C#

热点推荐