【密码学】一文读懂随机数

简介: 本文简单的介绍了一下随机数的概念,然后给出了一个非密码学安全的随机数生成器--线性同余法,一定注意,这个方法不要用在密码学相关用途蛤。

一文读懂随机数


W1`U`]ON[OKSDYY_1HN$QTX.jpg随机数


背景

本文将来聊一下密码学当中的随机数的概念,先来看一个小故事吧。

小明有写日记的习惯,但是呢,小明写的日记又不想让别人看到,因此呢,聪明的小明制作了一个特殊的日记本,这个日记本有一个密码的功能,在每次输入正确密码之后,都会随机换一个新的密码,然后这个新密码呢,对于小明来说是可以知道的,其他人即使知道了前面小明输入的密码,也无法猜测下一次的密码,这看起来小明这个日记本设计的比较完美。

小明用了很久,感觉自己可真是太聪明了,于是放心大胆的把日记本放在任意位置, 结果呢, 意外发生了, 小红在总结了一下小明之前输入的密码之后,发现了随机密码生成的规律,于是呢,小红也可以看到这个日记的内容了。

故事纯属虚构, 大家不要当真哈, 图个乐子就好了。

小明在设计日记本的时候呢,就用到了随机数这个思想,只是呢,由于小明选择的伪随机数生成的算法不是特别好,因此呢,让小红给发现了规律,这样小明的日记本自然就不安全了。

接下来呢,一起来看一下随机数的相关知识。


随机数作用

对于随机数在密码学当中有什么用呢,我们来回忆一下之前讲到过的密码学知识里面,那些地方需要用到随机数。

  • 密钥生成, 对于对称加密的密钥来说, 生成密钥最好是用随机的
  • 初始化向量的生成
  • 盐的生成(比如说之前提到过的PBE)


随机数的性质

  • 随机性: 这一点比较好理解,也就是说他没有什么规律,完全是杂乱的序列
  • 不可预测性: 这个意思是指的,假设已知前面的输出,无法预测下一个输出,就比如文章开头提到的例子,小红通过观察小明之前的输出得到了规律,这实际上就是可预测的
  • 不可重现性: 不可能出现相同的序列


伪随机数生成器

对于密码学而言,用到的最多的实际上是伪随机数,因为真正的随机数实际上是比较难以实现的,一般真随机数大多通过硬件来实现,而对于软件而言,大多的实现方案是伪随机数,因此接下来具体聊一聊伪随机数的概念。

ZX[KT[31~VZ0)R54KGEI90F.png

image.gif伪随机数生成器

简单解释一下对于伪随机数生成器的结构,种子呢,不要想歪了,这个不是你们理解的那种种子,这个实际上可以理解为一个初始值,对于初始值来说,这个要进行保密,如果攻击者知道了种子,而然而然的就可以生成出同样的伪随机序列了。

下面一部分呢,就是整个伪随机数生成器结构的核心,具体的伪随机数生成算法,这个算法呢,可以通过种子来生成一系列的随机序列。

一个具体的伪随机数生成算法: 线性同余法

「线性同余法」是一个应用广泛的伪随机数生成器算法,但是这个算法是非密码学安全的,不要用这个算法生成的随机数用于密码相关的领域。

下面我们来具体的看一下这个算法,

image.png

解释一下这个公式的每个元素的含义, A和C呢都是常量,对于是上一次随机序列的输出,根据上面介绍的伪随机数生成器的结构,我们可以知道也就是种子。

EEW$)W5(U`2~GU4Q)HG@4NY.png线性同余法

代码实现

对于线性同余法来说,这个伪随机数生成器还是比较容易实现的,还是老规矩,采用rust来写一下这个算法吧。

fn linear_congruential_method(r: u32, a: u32, c: u32, m: u32) -> u32 {
    a.wrapping_mul(r).wrapping_add(c) % m
}
#[cfg(test)]
mod test {
    use crate::lcm::linear_congruential_method;
    #[test]
    fn test() {
        let r0 = 6;
        let a = 3;
        let c = 0;
        let m = 7;
        let r1 = linear_congruential_method(r0, a, c, m);
        println!("{}", r1);
        let r2 = linear_congruential_method(r1, a, c, m);
        println!("{}", r2);
    }
}


小结

本文简单的介绍了一下随机数的概念,然后给出了一个非密码学安全的随机数生成器--线性同余法,一定注意,这个方法不要用在密码学相关用途蛤。

相关文章
|
机器学习/深度学习 人工智能 自然语言处理
基于星海智算云平台部署 DeepSeek-R1系列 70b 模型全攻略(附平台福利)
本文介绍了如何在星海智算云平台上部署DeepSeek-R1系列70B模型,解决官网访问不畅的问题。通过云端部署,用户可以按需付费,避免本地部署高昂成本(高达两百多万)。文章详细讲解了从实例创建到开始使用DeepSeek的八个步骤,并提供了成本优化技巧和新手注意事项。推荐使用双A100显卡,每小时费用仅13.32元。新用户还可领取福利,享受高性价比服务。立即注册体验:[星海智算云平台](https://gpu.spacehpc.com/user/register?inviteCode=52872508)。
1203 1
基于星海智算云平台部署 DeepSeek-R1系列 70b 模型全攻略(附平台福利)
|
存储 人工智能 弹性计算
阿里云第八代云服务器g8i实例介绍,可适用于在线音视频及AI相关应用
近日,阿里云第八代云服务器ECS g8i实例已经完成全新升级,g8i实例采用CIPU+飞天技术架构,搭载最新的Intel 第五代至强可扩展处理器(代号EMR),性能进一步大幅提升,同时拥有AMX加持的AI能力增强,并在全球范围率先支持TDX机密虚拟机能力,实现了AI增强和全面安全防护的两大特色优势,可适用于在线音视频及AI相关应用。本文对g8i实例做个介绍。
阿里云第八代云服务器g8i实例介绍,可适用于在线音视频及AI相关应用
|
移动开发 开发工具 数据库
App内“邀请好友“功能:如何准确追踪邀请关系并自动发放奖励
探讨如何准确追踪APP“邀请好友”功能中的邀请关系并自动发放奖励
645 2
|
自然语言处理
高效团队的秘密:7大团队效能模型解析
3分钟了解7大团队效能模型,有效提升团队绩效。
1592 7
高效团队的秘密:7大团队效能模型解析
|
缓存 数据库
什么是缓存击穿 ? 怎么解决 ?
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大 解决方案 : ● 热点数据提前预热 ● 设置热点数据永远不过期。 ● 加锁 , 限流
|
存储 数据可视化 API
API接口数据获取流程的细化
本文概述了API的基础知识、获取API访问权限的方法、编写代码调用API的步骤、数据处理与分析技巧以及数据安全与合规的重要性,并提供了社交媒体数据分析、天气预报应用和电商数据分析等API数据获取的应用实例,旨在帮助读者全面了解和实践API接口数据获取的流程。
|
移动开发 JavaScript API
Sprunki Game 实现技术分析及介绍
**Sprunki** 是一款基于音乐创作的游戏,作为经典游戏 **Incredibox** 的粉丝改版,它采用 HTML5 和 JavaScript 构建,通过拖拽式 UI 和模块化声音系统,提供了一个创意十足的音乐创作平台。游戏支持多种设备,并融入了 CSS3 动画和 Web Audio API,增强视觉与音效同步。玩家还可以通过社交媒体分享作品,参与社区互动。Sprunki 不仅是一款游戏,更是一个开放的创作平台。
|
Web App开发 缓存 iOS开发
强制退出Mac程序的六种方法
强制退出Mac程序的六种方法
1603 2
|
监控 程序员 持续交付
`pylint`是一个高度可配置的Python代码分析工具,它可以帮助程序员查找代码中的错误、样式问题、可能的bug以及不符合编码标准的部分。
`pylint`是一个高度可配置的Python代码分析工具,它可以帮助程序员查找代码中的错误、样式问题、可能的bug以及不符合编码标准的部分。