教材第九、十章自学笔记
第三部分 密钥协商
第九章 生成随机性
衡量随机性的度量称为熵。
计算一个具有非均匀概率分布的随机数的熵比较复杂。随机变量X的熵的常用定义如下:
这里的对数通常取以2为底,以便以比特(bits)为单位来表示熵。这个公式反映了每个可能事件的概率与其对应的信息量之间的关系。
9.1 真实随机
- 真实的随机数据非常难以找到。
- 一些现代计算机内置了真是随机数生成器,使一些攻击更困难了。
9.1.1 伪随机数
- 伪随机数是计算机科学中生成的数字序列,其表现类似于随机数序列,但实际上是通过确定性算法生成的。这些算法称为伪随机数生成器(PRNG),它们以一个称为“种子”的初始值作为输入,并根据该种子生成一系列看似随机的数字。在相同的种子下,PRNG将始终生成相同的数字序列。
- 伪随机数并非真正的随机数,因为它们的生成是可预测的,并且在一定程度上是周期性的,即数字序列会在某个点上重复。然而,在许多应用中,伪随机数已经足够随机,可以满足大多数需求,例如模拟、加密和随机化算法等。
9.1.2 真实随机数的伪随机数生成器
- 真实随机数是由自然过程或物理设备产生的,具有完全的随机性,不受任何确定性算法的控制。这些过程或设备通常利用量子物理现象或环境噪声等随机事件来生成随机数。
- 相比之下,伪随机数生成器(PRNG)是基于确定性算法的,使用一个称为“种子”的初始值,以及一系列数学运算来生成数字序列。虽然伪随机数生成器可以生成看似随机的数字序列,但实际上它们是可预测的,并且在一定程度上是周期性的。
- 为了获得更接近真实随机数的效果,可以使用真实随机数生成器(TRNG),这些生成器利用物理过程来获取真正的随机性,如量子力学现象、热噪声、放射性衰变等。TRNG产生的随机数序列不受算法的控制,更适合需要高度随机性的应用
9.2 伪随机数生成器的攻击模型
伪随机数生成器(PRNG)可能受到多种攻击模型的影响,其中一些主要的攻击模型包括:
-
预测攻击(Prediction Attacks):攻击者尝试通过分析PRNG生成的部分或全部随机数序列,推断出使用的种子或内部状态,并进一步预测未来生成的随机数。如果攻击成功,攻击者就可以预测到密钥、令牌或其他敏感信息。
-
状态恢复攻击(State Recovery Attacks):攻击者尝试通过观察PRNG生成的部分输出来重建PRNG的内部状态,进而生成整个随机数序列。一旦攻击者恢复了PRNG的状态,他们就可以生成相同的随机数序列,从而对密钥、加密算法或其他安全机制进行进一步攻击。
-
周期攻击(Period Attacks):PRNG通常具有有限的周期,即生成的随机数序列会在某个点上重复。攻击者可以通过分析PRNG生成的输出来确定周期的长度,并在必要时预测随机数的值。
-
种子攻击(Seed Attacks):攻击者试图获取PRNG的种子值,从而完全控制PRNG的行为。如果攻击者成功地获取了种子值,他们就可以生成与受攻击系统相同的随机数序列,从而绕过任何基于随机性的安全机制。
这些攻击模型可能通过多种方式实现,包括侧信道攻击、故意输入、状态泄漏等。为了保护系统免受这些攻击,设计和选择安全的伪随机数生成器至关重要。此外,定期更新种子值、增加随机性、使用加密安全的PRNG等方法也有助于提高系统的安全性。
9.3 Fortuna
分三个部分:
- 生成器:负责采用一个固定长度的种子,生成任意数量的伪随机数。
- 累加器:负责从不同的熵源收集熵再放入熵池中,并间或地给生成器重新设定种子。
- 种子文件管理器:负责保证即时在计算机刚刚启动时伪随机数生成器也能生成随机数。
9.4 生成器
当设计伪随机数生成器(PRNG)时,通常需要考虑以下五个方面:
-
初始化(Initialization):
- 在PRNG开始生成随机数之前,需要对其进行初始化。这通常涉及设置种子值或内部状态。种子值是PRNG的起点,决定了生成的随机数序列。安全的种子值应该足够随机,以防止攻击者通过猜测或预测来破解PRNG。
-
更新种子(Seed Update):
- 在某些情况下,PRNG可能需要更新其种子值,以确保生成的随机数序列具有足够的随机性。更新种子的频率取决于具体的应用场景和安全需求。
-
生成块(Block Generation):
- PRNG通常以块的形式生成随机数。生成块时,PRNG会使用当前的种子值或内部状态作为输入,经过一系列算法操作生成一定数量的随机比特或字节。生成的块可以用于加密、模拟、随机化算法等各种应用。
-
生成随机数(Random Number Generation):
- PRNG的主要功能是生成随机数。在每次需要随机数时,PRNG会根据当前的种子值或内部状态生成一个随机数,并将种子值更新为下一个状态。生成的随机数应该具有足够的随机性,以满足特定应用的需求。
-
生成器速度(Generator Speed):
- 生成器速度指的是PRNG生成随机数的效率和速度。生成器的速度应该足够快,以满足实际应用中对随机数的需求,同时保持生成的随机数的质量和随机性。速度过慢可能会影响系统的性能,而速度过快可能会消耗过多的资源或降低随机性。因此,在设计PRNG时,需要权衡速度和质量之间的关系,并选择适合特定应用的生成器。
9.5 累加器
摘要(Summary):
- 累加器是用于收集和积累系统中的随机性来源的设备或模块。它可以通过将来自不同源头的随机性数据进行累积,来增加系统的整体随机性。累加器通常用于生成种子值、更新熵池和增强随机性。
熵池(Entropy Pool):
- 累加器通常与熵池相关联,用于收集随机性数据。熵池是一个存储随机性数据的缓冲区,用于生成高质量的随机数。累加器通过将不同来源的随机性数据注入熵池来增加其随机性。这些随机性数据可以是来自硬件设备、系统事件、用户输入等。
实现注意事项:
-
基于熵池的事件分发:
- 累加器应该定期将累积的随机性数据注入熵池中,并确保熵池的随机性足够高。在分发随机性事件时,应该优先使用熵池中的数据,以确保生成的随机数具有高质量的随机性。
-
事件发送的运行时间:
- 在将随机性事件发送到熵池时,应该考虑事件发送的运行时间。如果事件发送操作需要较长时间,可能会导致系统响应延迟或性能下降。因此,应该设计高效的事件发送机制,并确保它不会影响系统的正常运行。可以采用异步方式或在后台执行事件发送操作,以减少对系统性能的影响。
综上所述,累加器是用于收集和积累系统随机性来源的重要组件,它与熵池紧密相关,并需要注意事件分发和发送的运行时间,以确保系统生成的随机数具有高质量的随机性并且不会影响系统性能。
9.6 种子文件管理
种子文件是在随机数生成过程中使用的起始值或初始状态。良好的种子文件管理对于生成高质量的随机数非常重要。以下是种子文件管理的一些要点:
-
安全存储:种子文件应该以安全的方式存储,以防止未经授权的访问或篡改。这可能涉及使用加密存储、访问控制和其他安全措施来保护种子文件的机密性和完整性。
-
定期更新:种子文件应定期更新,以确保生成的随机数序列具有足够的随机性。这可以防止潜在的攻击者通过分析随机数序列来猜测种子值,并进一步预测未来的随机数。
-
来源多样性:种子文件的生成可以利用多种来源的随机性数据,例如硬件设备、系统事件、用户输入等。这样可以增加种子文件的随机性,并提高生成的随机数的质量。
-
备份和恢复:应该对种子文件进行定期备份,并确保可以在需要时进行恢复。这样可以防止种子文件丢失或损坏,从而保证系统的连续性和可靠性。
9.7 选择随机元素时的注意事项
选择随机元素时,需要注意以下几个方面以确保生成的随机数具有良好的质量和随机性:
-
均匀性:选择随机元素的过程应该是均匀的,即每个元素被选中的概率应该相等。这样可以确保生成的随机数序列符合预期的分布特征。
-
唯一性:在选择随机元素时,应该确保每个元素只被选中一次,除非允许重复选择。如果不允许重复选择,那么在选择元素后应该从候选集中移除已选中的元素。
-
随机性:选择随机元素的过程应该具有足够的随机性,以防止预测或推断。这可能涉及使用高质量的随机数生成器,并确保生成的随机数序列具有足够的随机性。
-
效率:选择随机元素的过程应该是高效的,尤其是当处理大型数据集时。应该选择适当的算法和数据结构来提高选择随机元素的效率。
第十章 素数
10.1 整除性与素数
整除性与素数是数论中的重要概念,它们在密码学和计算机科学中有着广泛的应用。下面简要介绍这两个概念:
-
整除性:如果一个整数a能被另一个整数b整除(即a除以b的余数为0),我们就说a可以被b整除。这时我们也说b整除a,或者说a是b的倍数。符号表示为
。 -
素数:素数是指只能被1和自身整除的正整数,即除了1和它本身之外没有其他正因子的整数。例如,2、3、5、7、11等都是素数。素数在加密算法、哈希函数等领域中扮演着重要角色。
10.2 产生小素数
产生小素数是在密码学和计算机科学中常见的操作,例如在RSA加密算法中需要生成两个大素数。一种简单的方法是使用筛选法(例如埃拉托斯特尼筛法)来生成小素数。
10.3 素数的模运算
10.3.1 加法和减法
在模运算中,加法和减法与常规的加法和减法类似,但在计算结果时需要取模。例如,在模p的情况下,对于两个整数a和b,它们的和
10.3.2 乘法
在模运算中,乘法也与常规的乘法类似,但在计算结果时同样需要取模。例如,在模p的情况下,对于两个整数a和b,它们的乘积
10.3.3 群和有限域
在数论中,群和有限域是研究模运算的重要概念。群是指满足一定条件的数学结构,有限域则是一个包含有限个元素的域。
10.3.4 GCD算法
GCD(最大公约数)算法是用于计算两个整数的最大公约数的算法。它常用于素性测试和其他数论算法中。
10.3.5 扩展欧几里得算法
扩展欧几里得算法是用于计算两个整数的最大公约数,并找到一对整数使得它们的线性组合等于最大公约数的算法。它常用于求解模方程和计算模逆元等问题。
10.3.6 模2运算
模2运算是指在模2的情况下进行的加法、减法和乘法运算。在计算机科学中,模2运算常用于位操作和布尔逻辑运算中。
10.4 大素数
10.4.1 素性测试
对于一个大整数,判断它是否是素数是一个重要的问题。素性测试是用于确定一个给定整数是否为素数的算法。常见的素性测试包括试除法、费马素性检验、米勒-拉宾素性检验等。
10.4.2 计算模指数
计算模指数是指计算形如
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本