【信息保护论】Ch11. 密钥和随机数

2023-11-07 19:20

本文主要是介绍【信息保护论】Ch11. 密钥和随机数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 密钥
    • Diffie-Hellman 密钥交换
    • PBE(password based encryption)
  • 随机数
    • 真随机数
    • 伪随机数
    • 对PRNG的攻击

密钥

key是密码学与信息安全中最重要的组成部分之一。那么具体的说,key到底是什么呢?

  • 密钥是一个非常大的数,密钥除了本身数值很大之外,更重要的是密钥空间也非常大。密钥空间的大小由密钥比特的长度决定。

在不同加密技术中,密钥的长度也大抵不同。
在这里插入图片描述

-表现
二进制01010001 11101100 01001011 00010010 00111101 01000010 00000011
16进制51 EC 4B 12 3D 42 03
十进制23059280286269955
1024bit十六进制在这里插入图片描述
  • 密钥与明文具有相同的价值。对于黑客而言,拿到密钥与拿到明文无差异。
  • 加密算法本身并不一定要保密,因为很多加密算法具有强单方向性,应当使用被鉴证后的加密技术,通过把密钥保存作为保密手段来维持密码机密性。
  • Session key:临时密钥。每次通讯时生成新的,使用完毕后销毁并不再出现该密钥,由于生成随机数大多由软件完成,而软件又不能生成真正的随机数,伪随机数生成器只能通过算法保证在较长时间内不重复,但是必然有一个时刻会进入一个循环。
  • master key:反复使用的密钥,也就是一般需要我们妥善保管的密钥。
  • CEK(contents encrypting key):用于加密明文的密钥。
  • KEK(key encrypting key):用于加密密钥的密钥,如KDC和CA中的可信赖公钥配送。
密钥的阶段解析
生成阶段使用(伪)随机数生成器生成。硬件生成的随机数是真随机数,软件生成的随机数是伪随机数。使用的伪随机数生成器也要有[不可预测性],必须使用被认证过的加密用随机数生成器,像C/Java编译器自带的随机函数是不可取的,那些函数使用了非常简单的矩阵随机,在密码学领域应用强度不够。
生成阶段2一般需要使用password或passphrase生成,把这些较长且复杂的只有自己知道意义的明文通过单方向哈希函数,用他们的哈希值当做密钥。之前提到的PBE就是这里的一种变式,通过附加salt并计算哈希值来当做密钥。
配送阶段事前共享、KDC、公钥加密、Diffie-Hellman
更新阶段一般密钥使用一段时间或者频度后,需要进行更新。最简单的密钥更新就是将当前密钥通过哈希函数,生成的哈希值作为下一个密钥使用。这样即便密钥泄露,也能防止过去的信息被解密。
保存阶段①记住密钥②保存到文件/记事本,并将文件保存到安全场所(保险箱之类的)③加密密钥后再保存 .etc
KEKKEK可以保存多个CEK在这里插入图片描述
废弃阶段不再使用的密钥要切实删除。如果密钥遗失或被盗窃,则要发出废弃密钥的申请。

Diffie-Hellman 密钥交换

Ipsec现在也在使用该算法的改良版本。之前提到密钥配送问题时,简单的提了一下,这里讲一下具体流程。
在这里插入图片描述

  1. Alice传送给Bob两个素数P和G。
  2. Alice生成一个随机数A。
  3. Bob生成一个随机数B。
  4. Alice计算GA mod P;Bob计算 GB mod P,然后二者互换这两个数。
  5. KeyAlice= (GB mod P)^A mod P= GB×A mod P
  6. KeyBob= (GA mod P)^B mod P= GA×B mod P
  7. KeyAlice=KeyBob,使用对称加密开始会话。

在上面这个流程中,可能被窃听的有两个素数G和P,以及两者的计算结果,分别是GB mod P和GA mod P。知道这四个数,要求GA×B mod P是数学上的难解问题。该算法由于难解性,比较安全,要求P尽可能大,这样两方可以选择的伪随机数也会更加随机。

实战演练AliceBob
1传输P=13和G=2两个随机数接收P和G两个随机数
2A=9B=7
3GA mod P=219 mod 13=5GB mod P=27 mod 13=11
4将5这个数给Bob将11这个数给Alice
5(GB mod P)A mod P=119 mod 13=8-
6-(GA mod P)B mod P=57 mod 13=8
7KeyAlice=KeyBobKeyAlice=KeyBob

PBE(password based encryption)

PBE加密之前也简单提过,其核心在于赋予password后面的填充随机数salt。因此PBE可以简单概括为三个阶段,分别是KEK生成/Session key生成/加密明文。


在这里插入图片描述

  • KEK生成:使用伪随机数生成器生成salt,salt是一个随机数填充。将salt和人为创造的password按顺序结合并通过单方向哈希函数,该哈希值就作为KEK使用。
  • Session key生成:使用伪随机数生成器生成一个随机数,当做临时密钥,该密钥用KEK加密后与salt一同保存到安全场所。在临时密钥加密完成后,将对应的KEK销毁。只要有password和salt就可以再次生成相同的密钥,因此解密问题无忧。
  • 加密明文:用临时密钥加密明文。

解密过程:从安全场所取得Session keyCEK和salt。将salt和password按顺序组合并通过哈希函数计算出KEK,用KEK解密Session keyCEK得到Session key,然后解密密文。

  • salt的重要性:任何意识载体都存在一定固有的格式,人、语言、定理都是,人必然会受到环境文化生活等诸多方面的影响,那么本身推测password就成为了可能,再利用现在强大的数据分析工具,能够在事前准备大量的password候补,如果不使用salt,则这些password的候补就有极大可能直接破译加密系统。而使用salt后,仅仅拥有password候补就很不充分了,因为salt的组合会对应的生成相当巨大的KEK空间,会大幅增加黑客的操作难度。
  • password的重要性:人脑不足以记忆电脑破解不出来的bit位数的密码,而随机数生成的salt相比生成的session key安全性能要差很多,也就说KEK本身比CEK的安全性要查很多。举个例子就想把坚实的金库保管到脆弱的金库中。CEK一般会保存的IC card中。
  • PBE改善:将salt和password的组合通过N遍哈希函数。提升其混乱程度。
  • password准则:一个password的不要应用多个场景。根据信息价值可以分多层次安全性的password。更换密码时,只更换密码中的一小部分是不可以的。等。但是由于日常生活中人们越来越嫌麻烦,因此如果想要使用安全密码,建议使用伪随机数生成器生成并保存到安全场所。

随机数

之前涉及到的所有知识点基本上都有一个词——随机。没错,一个密码越随机越无序,则越安全。本小节将对随机数进行详细说明。

-
密钥生成
密钥对生成
块加密模式中的初始化向量IV
为了防止再传送攻击而添加的nonce
salt
padding

随机数的用途:无论多强力的加密算法,只要攻击者知道就丧失了意义,使用随机数制作的密钥,对于攻击者而言是为了起到一定的迷惑作用。如,我用IloveyouForever当做密码,与sa53gf4a3w4t3asd4gz.d4g8W4r383a7r4当做密码,前者一看就能够相信这是明文,而后者则可能还是密文。

随机数的性质:

  • 随机性:统计上没有偏重,完全混乱无序
  • 不可预测性:根据之前的随机数无法推断出即将生成的随机数
  • 不可再现性:已经出现的随机数不会从该随机数生成器中第二次出现,想要再现该随机数,除了在生成时保存该随机数别无他法。
  • 随 机 性 ⊆ 不 可 预 测 性 ⊆ 不 可 再 现 性 随机性\subseteq不可预测性\subseteq不可再现性
  • 周期性:伪随机数生成器生成的随机数,总有一个时间点会进入重复的下一个循环,只要有周期性,就不是真随机数,不具有不可再现性。
-随机性不可预测性不可再现性备注
弱伪随机数生成器××不可用于加密技术
强伪随机数生成器×可用于加密技术
真随机数生成器可用于加密技术

真随机数

真随机数生成必须使用硬件,仅仅软件绝不可能生成真随机数。由于受制于硬件,因此随机数的生成也受环境因素影响。如

  • 周边温度与声音大小
  • 用户鼠标的位置
  • 键盘键入时间
  • 放射线观测的输出
  • 等多种物理环境信息

伪随机数

软件生成,成本相对低廉,有周期性不具备不可再现性。核心是种子SEED。种子直接影响伪随机数生成器(PRNG)的内部状态。
在这里插入图片描述

内部状态:

  • PRNG管理的内存值。
  • PRNG的第一个随机数以其内存值为基础进行计算
  • 根据下一个随机数的要求,自身的内部状态也会随之变化。
  • PRNG的算法有两个功能,一个是生成随机数,一个是改变PRNG的内部状态。

在这里插入图片描述

  • 种子:本身要保密。是PRNG初始化内部状态的必备元素,本身是一个随机数。

PRNG标准:

  • 长周期:周期短则PRNG本身安全性弱,就不具备不可预测性。
  • 简洁算法:比起复杂的算法,明确的算法要更容易评估安全性。程序设计者本身都不能理解的算法生成的随机数很难说安全性如何。
  • 线性合同法(linear congruential method):一般最常用的PRNG,尤其是各种编译器。是将现随机数值的-A+C然后除以M,生成下一个随机数。
生成步骤过程
1R0=(A×Seed+C) mod N
2R1=(A×R0+C) mod M
iRi=(A×Ri-1+C) mod M

在这里插入图片描述
在这里插入图片描述
4, 5, 1, 3, 2, 6, 4, 5, 1, 3, 2, 6, …这种情况下,4, 5, 1, 3, 2, 6这六个数为一个循环,进行无限循环下去。

线性合同法短处:无预测不可能性。不可用于密码应用技术中。C 函数的 rand和Java的 java.util.Random 类都是使用的该算法。因此生成随机数绝对不可以使用编译器自带的随机数方法。

  • 单方向哈希函数:也可以当做PRNG。
    在这里插入图片描述
随机数
使用种子重置计数器
使用单向哈希函数将计数器输出为哈希值
这个哈希值被当做随机数
计数器值+1
根据需要重复2~4过程

另一种错误的形式:
在这里插入图片描述

随机数
使用种子重置计数器
使用单向哈希函数将计数器输出为哈希值
这个哈希值被当做随机数
将这个哈希值作为下一个内部状态
根据需要重复2~4过程

为什么是错误的?
因为用前者经过计算得到后者,前者与后者是有关联的,虽然有单方向性,但是却也有着明确的个关联性。不具备不可预测性。

  • 加密实现PRNG:
    在这里插入图片描述
随机数
使用种子重置计数器
加密计数器
这个密文被当做随机数
计数器值+1
根据需要重复2~4过程

在这里插入图片描述

ANSI X9.17标准步骤
重置内部状态1
加密当前时刻2
内部状态XOR②密文3
加密③的结果4
将④作为随机数输出5
④的输出XOR现在时刻的密文6
加密⑥的结果7
将⑦的结果当做下一轮的内部状态8
根据需要重复步骤②~⑧9

⑥和②的现在时刻是相同的时刻。

对PRNG的攻击

  1. 对种子seed的攻击:可以说对于PRNG,seed就是key的作用,只要种子被窃取,则意味着这一个PRNG生成的所有伪随机数都被窃取。真随机数生成器没有这个问题。
  2. 随机池攻击:PRNG当合法用户需要使用时,会分配对应需求量的随机数,然后这些随机数会被记录到一个类似日志的文件中,称为随机池。这个随机池由于存储了所有可能出现过的伪随机数的出现顺序,即便这个池本身没有什么价值,但是因为存储到里面的伪随机数终有一天会重复,所以这个文件如果被攻击者窃取,则可以对RPNG进行进一步推测。

这篇关于【信息保护论】Ch11. 密钥和随机数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/365751

相关文章

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

C#实现获取电脑中的端口号和硬件信息

《C#实现获取电脑中的端口号和硬件信息》这篇文章主要为大家详细介绍了C#实现获取电脑中的端口号和硬件信息的相关方法,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 我们经常在使用一个串口软件的时候,发现软件中的端口号并不是普通的COM1,而是带有硬件信息的。那么如果我们使用C#编写软件时候,如

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

C#读取本地网络配置信息全攻略分享

《C#读取本地网络配置信息全攻略分享》在当今数字化时代,网络已深度融入我们生活与工作的方方面面,对于软件开发而言,掌握本地计算机的网络配置信息显得尤为关键,而在C#编程的世界里,我们又该如何巧妙地读取... 目录一、引言二、C# 读取本地网络配置信息的基础准备2.1 引入关键命名空间2.2 理解核心类与方法

使用Python检查CPU型号并弹出警告信息

《使用Python检查CPU型号并弹出警告信息》本教程将指导你如何编写一个Python程序,该程序能够在启动时检查计算机的CPU型号,如果检测到CPU型号包含“I3”,则会弹出一个警告窗口,感兴趣的小... 目录教程目标方法一所需库步骤一:安装所需库步骤二:编写python程序步骤三:运行程序注意事项方法二

PostgreSQL如何查询表结构和索引信息

《PostgreSQL如何查询表结构和索引信息》文章介绍了在PostgreSQL中查询表结构和索引信息的几种方法,包括使用`d`元命令、系统数据字典查询以及使用可视化工具DBeaver... 目录前言使用\d元命令查看表字段信息和索引信息通过系统数据字典查询表结构通过系统数据字典查询索引信息查询所有的表名可

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测