热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

两种方法生成安全的随机数(置顶)

在许多类型软件的开发过程中,都要使用随机数。例如纸牌的分发、密钥的生成等等。随机数至少应该具备两个条件:1.数字序列在统计上是随机的。2.不能通过已知序

在许多类型软件的开发过程中,都要使用随机数。例如纸牌的分发、密钥的生成等等。随机数至少应该具备两个条件:

1. 数字序列在统计上是随机的。
2. 不能通过已知序列来推算后面未知的序列。

只有实际物理过程才是真正随机的。而一般来说,计算机是很确定的,它很难得到真正的随机数。所以计算机利用设计好的一套算法,再由用户提供一个种子值,得出被称为“伪随机数”的数字序列,这就是我们平时所使用的随机数。

这种伪随机数字足以满足一般的应用,但它不适用于加密等领域,因为它具有弱点:

1. 伪随机数是周期性的,当它们足够多时,会重复数字序列。
2. 如果提供相同的算法和相同的种子值,将会得出完全一样的随机数序列。
3. 可以使用逆向工程,猜测算法与种子值,以便推算后面所有的随机数列。

即是说:

随机序列 = F(算法, 种子)

 

一、System.Random类

System.Random类是最常用的伪随机数生成器,我们经常使用它创建近似随机的数列。以下代码演示了Random类创建10个随机数:

Random random = new Random();
for (int i &#61; 0; i < 10; i&#43;&#43;)
    Console.WriteLine(random.Next());

在创建Rondom类的实例时&#xff0c;我们可以指定Int32类型的种子值&#xff0c;不指定默认用Environment.TickCount作种子&#xff0c;它是从系统启动到现在经过的毫秒数。然后使用Next()方法来获得Int32类型的随机数值。Next()方法有3个重载&#xff0c;可以实现获得指定范围内的随机数值。

使用Rondom类时最常见的错误&#xff0c;是将创建Random实例的语句放在一个路径很短的循环中。如&#xff1a;

for (int i &#61; 0; i < 10; i&#43;&#43;)
ExpandedBlockStart.gifContractedBlock.gif
{
    Random random_A 
&#61; new Random();
    
sbyte randomNumber &#61; (sbyte)(random_A.Next(0101));
    Console.WriteLine(randomNumber);
}

根据现在的计算机运行速度&#xff0c;执行这段代码根本用不了多少时间。所以在10次循环中&#xff0c;构造函数使用的Environment.TickCount几乎一样。随机数不随机的结果。

每次都是随机产生的.我又按F9,F10进行调试检查&#xff0c;让程序一步一步的运行&#xff0c;让随机数一个一个的产生,这时我就发现每次产生的随机数几乎都不一样

这个错误也验证了伪随机数的弱点。我们都用Random类&#xff0c;算法是一样的&#xff0c;所以一旦得知了程序使用的种子&#xff0c;那么程序过程就变得十分确定了。

 

二、RNGCryptoServiceProvider类

为了获得更加随机的数字序列&#xff0c;可以使用System.Security.Cryptography.RNGCryptoServiceProvider类。它使用加密服务提供程序 (CSP) 提供的实现来实现加密随机数生成器。

下面代码演示了RNGCryptoServiceProvider类创建10个随机数

byte[] bytes &#61; new byte[4];
RNGCryptoServiceProvider r 
&#61; new RNGCryptoServiceProvider();

for (int i &#61; 0; i < 10; i&#43;&#43;)
ExpandedBlockStart.gifContractedBlock.gif
{
    r.GetBytes(bytes);
    
int number &#61; BitConverter.ToInt32(bytes, 0);
    Console.WriteLine(number);
}

RNGCryptoServiceProvider类产生的随机数更加随机。即使有人知道了这个类&#xff0c;并得到最近生成的随机序列&#xff0c;也无法计算后续序列。

目前RNGCryptoServiceProvider类并没有提供获取指定范围的随机数的方法&#xff0c;需要自己处理。下面代码演示了创建从1到100的10个随机数&#xff1a;

byte[] bytes &#61; new byte[16];
RNGCryptoServiceProvider r 
&#61; new RNGCryptoServiceProvider();

for (int i &#61; 0; i < 10; i&#43;&#43;)
ExpandedBlockStart.gifContractedBlock.gif
{
    r.GetBytes(bytes);
    
int number &#61; (int)((decimal)bytes[0/ 256 * 100&#43; 1;
    Console.WriteLine(number);
}

最后测试了一下&#xff0c;将RNGCryptoServiceProvider类对象的创建放在循环中&#xff0c;仍然能获得随机数&#xff1a;

byte[] bytes &#61; new byte[4];

for (int i &#61; 0; i < 10; i&#43;&#43;)
ExpandedBlockStart.gifContractedBlock.gif
{
    RNGCryptoServiceProvider r 
&#61; new RNGCryptoServiceProvider();
    r.GetBytes(bytes);
    
int number &#61; BitConverter.ToInt32(bytes, 0);
    Console.WriteLine(number);
}

当然&#xff0c;不推荐这么去写&#xff0c;毕竟对象的创建也是很费时间的。

最后说明一点&#xff0c;RNGCryptoServiceProvider类要比Random类耗费更多的时间&#xff0c;若打算在很短时间内生成大量随机数&#xff0c;请不要使用RNGCryptoServiceProvider类。

[视频]Visual Studio 2005入门之对象概述

[视频]Visual Studio 2005入门之创建对象和使用方法以及属性

[视频]Visual Studio 2005入门之利用构造函数初始化对象

[视频]Visual Studio 2005入门之重载方法以及运算符重载

[视频]Visual Studio 2005入门之.Net核心对象(Request)

...

转:https://www.cnblogs.com/fhbcn/archive/2009/01/15/1376670.html



推荐阅读
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 配置Windows操作系统以确保DAW(数字音频工作站)硬件和软件的高效运行可能是一个复杂且令人沮丧的过程。本文提供了一系列专业建议,帮助你优化Windows系统,确保录音和音频处理的流畅性。 ... [详细]
  • 2018年3月31日,CSDN、火星财经联合中关村区块链产业联盟等机构举办的2018区块链技术及应用峰会(BTA)核心分会场圆满举行。多位业内顶尖专家深入探讨了区块链的核心技术原理及其在实际业务中的应用。 ... [详细]
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • 本文探讨了MariaDB在当前数据库市场中的地位和挑战,分析其可能面临的困境,并提出了对未来发展的几点看法。 ... [详细]
  • 最近团队在部署DLP,作为一个技术人员对于黑盒看不到的地方还是充满了好奇心。多次咨询乙方人员DLP的算法原理是什么,他们都以商业秘密为由避而不谈,不得已只能自己查资料学习,于是有了下面的浅见。身为甲方,虽然不需要开发DLP产品,但是也有必要弄明白DLP基本的原理。俗话说工欲善其事必先利其器,只有在懂这个工具的原理之后才能更加灵活地使用这个工具,即使出现意外情况也能快速排错,越接近底层,越接近真相。根据DLP的实际用途,本文将DLP检测分为2部分,泄露关键字检测和近似重复文档检测。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 作为一名专业的Web前端工程师,掌握HTML和CSS的命名规范是至关重要的。良好的命名习惯不仅有助于提高代码的可读性和维护性,还能促进团队协作。本文将详细介绍Web前端开发中常用的HTML和CSS命名规范,并提供实用的建议。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 本文详细介绍了在 Windows 2000 系统中启用 TELNET 服务时需要注意的 NTLM 配置问题,帮助用户解决常见的身份验证失败错误。 ... [详细]
  • 雨林木风 GHOST XP SP3 经典珍藏版 V2017.11
    雨林木风 GHOST XP SP3 经典珍藏版 V2017.11 ... [详细]
  • 本教程详细介绍了如何使用 TensorFlow 2.0 构建和训练多层感知机(MLP)网络,涵盖回归和分类任务。通过具体示例和代码实现,帮助初学者快速掌握 TensorFlow 的核心概念和操作。 ... [详细]
  • 福克斯新闻数据库配置失误导致1300万条敏感记录泄露
    由于数据库配置错误,福克斯新闻暴露了一个58GB的未受保护数据库,其中包含约1300万条网络内容管理记录。任何互联网用户都可以访问这些数据,引发了严重的安全风险。 ... [详细]
author-avatar
刘浩不来丷上海594865126
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有