首页 > 其他分享 >20211121杨博川《密码工程》1、2章笔记

20211121杨博川《密码工程》1、2章笔记

时间:2024-03-03 17:44:47浏览次数:24  
标签:公钥 加密 20211121 系统 Alice 笔记 博川 Bob 密码学

一二章笔记

@

目录


课程:《Linux》
班级:2111
姓名:杨博川
学号:20211121
日期:2024年3月3日


第1章 密码学研究范围

思维导图

知识概述

1.1密码学作用

密码学本身没有价值,必须作为一个系统的一部分,以起到相应的作用。我们可以把密码学比作现实世界中的一把锁,锁本身是没有任何作用的,它需要一个大的系统来发挥作用。这个更大的系统可以是某座建筑的一扇门、一条锁链、一个保险箱等。这个大系统甚至可以扩展到使用锁的人∶ 确保在必要时锁住系统并且保证钥匙不能被他人获取。同样,密码学也是作为一个更大的安全系统的一部分来发挥作用。
虽然密码学只是整个安全系统的一小部分,却是非常关键的一部分。密码学需要能够提供系统的访问控制功能。这是一个棘手的问题,因为安全系统多数部分像围墙和围栏一样将所有访问者拒之门外。在这里,密码学就起到了"锁"的作用∶它必须识别哪些是合法访间,哪些是非法访问。这就比将所有用户拒之门外要困难得多。因此,密码和一些相关因素往往成为对任何安全系统的攻击点。

1.2木桶原理

木桶原理在多个方面影响了我们的工作。比如说,我们总是喜欢假设用户都会设置恰当的口令,但是实际并非如此,用户总是选择简短的口令。用户为了避免麻烦,可以做出任何事,比如将口令写在一张易事贴上并贴在显示器上。所以在设计系统时,不可以忽视这类问题,它们能够影响到最终的结果。如果你设计了一个系统,这个系统每周都给用户分发一个12 位的随机口令,那么用户肯定会将这个口令贴在显示器上.这样本来就很脆弱的环节就会更脆弱了,并且会对系统的整体安全性带来负面影响。严格地讲,强化最脆弱环节之外的环节没有丝毫意义。但实际中各环节的区分并不是那么明确,攻击者可能并不知道最脆弱的环节是哪个而是去攻击了一个比较坚固的环节。对不同类型的攻击者,最脆弱的环节可能不尽相同。每个环节的强度都取决于攻击者的能力、工具和对系统的访问,哪个环节会被攻击也取决于攻击者的目标,所以最脆弱的环节是由具体情况而定的。因此,有必要对实际情况中可能成为最脆弱环节的所有环节进行强化;同时,对多个环节进行强化也能够使得整个系统具备纵深防御(defense in depth)的性质——如果某个环节被攻破了,剩余环节还能保障安全性。

1.3对手设定

对手设定非常残酷,没有任何规则可循,我们也处于不利的情况下∶我们抽象地讨论"攻击者",但是不知道他是谁、他掌握了什么,他的目的是什么,他何时发起攻击,也不知道他有什么资源。并且攻击可能会在我们设计系统很久以后才发生,攻击者有五年或者十年更多研究的优势,也可以使用我们并不掌握的未来技术,而且利用所有这些优势,他只需要找到系统的一个脆弱点,而我们却要保护整个系统。尽管如此,我们的任务是构建一个能够抵抗所有攻击的系统,这导致了系统的攻击者和守护者之间的不平衡,也正是密码学令人兴奋的原因。

1.4专业偏执狂

偏执在这种工作中是非常有用的。假设我们参与开发一个电子支付系统,这个系统中涉及几个参与方∶客户、商家、客户的银行和商家的银行。为了理解都有哪些威胁,我们使用偏执狂模型。对于每一个参与方,我们假定其他任何人都参与了一个欺骗这个参与方的大阴谋,并同时假设攻击者可能有任意数量的其他目标,例如泄露这个参与方的交易隐私或在某个关键时刻拒绝参与方对系统的访问。如果一个密码系统在这样的偏执狂模型中可以幸存,那么它才有望在现实世界中得到使用。我们将交替使用专业偏执狂和偏执狂模型来指代安全理念(心态,mindset)。

1.5威胁模式

从用户的角度来看,与普通的信用卡相比,SET的安全性更差。使用普通的信用卡进行在线购物是安全的,因为用户总是能从诈骗交易中要回自己的钱,但是使用SET就增加了用户的风险。因此,尽管整个支付系统更安全了,但SET把剩下的风险由商家或银行转嫁给了用户,使得用户的威胁模型由"只有能够很好地伪造我的签名时才能造成损失"改变为"只有能够很好地伪造我的签名或者某种病毒感染了我的电脑时才能造成损失"。威胁模型非常重要,在开始一个密码安全项目时,首先要考虑所要保护的资产和抵抗的威胁是什么,威胁分析中的一个错误会导致整个项目毫无意义。本书中我们不会过多地讨论
威胁分析,因为我们只探讨密码学这一有限的领域,但是在任何实际系统中,决不要忘记对每一个参与方进行威胁分析。

1.6密码学不是唯一解决方案

密码学不是安全问题的唯一解决方案,它可能是解决方案的一部分,也可能是问题的一部分。在某些情况下密码学会使问题变得更糟,甚至根本不清楚使用密码学是否是一种改进。因此,正确使用密码学需要经过仔细考虑,我们之前关于SET的讨论就是一个例子。
码学有多种用途,它是许多健壮的安全系统的一个关键部分,但是如果使用的方式不正确,系统也会变得更加脆弱。很多情况下密码学只提供了一种安全感,而没有实际的安全性,仅仅到达这一步是非常诱人的,因为大多数用户想要的正是一种安全感。即使最终的系统并非真正安全,以这种方式使用密码技术仍可能符合某些标准和规则。在类似的情况下(这些情况普遍存在),客户相信的任何魔法也都能提供同样的安全感并同样能够运作。

1.7密码学是非常难的

由于一些原因,许多人似乎仍然认为密码学很容易。但事实并非如此,本书将帮助你了解密码学工程的挑战以及帮助你克服这些挑战,但是读完本书之后不要立即就开发一个新的码投票机器或其他关键的安全系统,而是利用从本书中学到的知识和其他人———特别是经验丰富的密码学专家———一起设计和分析新系统。即使我们在密码学和安全方面已有多年经验,在设计出一个系统之后也会邀请其他密码学和安全方面的专家来进行再次审查。

1.8密码学是简单的部分

虽然密码学本身是很难的,但它仍是安全系统中比较容易的部分。就像一把锁,密码组件的边界和需求都有良好的定义。但是要清晰地定义整个安全系统就困难多了,因为它涉及更多的方面,例如负责授权访问的组织过程和负责检查其他过程是否得到执行的过程,这类问题就很难处理,因为情况总在变化。计算机安全中的另一个重要问题在于软件的质量,如果计算机上的软件中包含了很多会导致安全漏洞的缺陷,那么安全软件就不可能有效。

1.9通用攻击

同时,我们也要清醒地认识到有些安全问题是无法解决的,对于某些特定类型的系统存在一些黑盒或通用攻击。一个经典的例子就是数字版权管理(DRM)系统中的模拟漏洞,DRM系统用于控制电子文件复制,例如图片、歌曲、电影或者书籍,但是没有任何一种技术——包括密码学——可以保证这些文件在系统之外能够抵抗通用攻击,例如攻击者可以通过给计算机屏幕拍照来复制图片,或者利用麦克风来重录歌曲。
确认系统不能抵抗哪些通用攻击很重要,否则我们可能会浪费很长的时间来修复一个无法修复的问题。同样,当有人宣称他们的系统能够抵抗通用攻击时,我们也要持怀疑的态度。

1.10安全性和其他设计准则

安全性绝不是系统的唯一设计准则,相反,安全性只是众多准则之一。

1.11更多阅读材料

对密码学感兴趣的读者应该阅读Kahn的《The Codebreakers》同,这本书介绍了密码,提供了很多例子来说明密码系统工程师面临的问题。另外还有一本介绍历史的著作《The Code Book》【129值得一读。本书从某些方面来说是 Bruce第一本著作《应用密码学》12】的续篇。《应用密码学》涵盖了更广泛的主题,并且包括了书中讨论的所有算法的详细说明,然而,它没有探究本书中讨论的工程细节。

1.12专业偏执狂练习

学习一门语言的最好方式之一就是沉浸其中,如果想学习法语那就搬到法国去。本书的回目的正是让读者沉浸到密码学和计算机安全的语言和思维中去。接下来的练习能够帮助读者加深理解,会促使读者经常考虑安全方面的问题,例如在阅读新文章、和朋友讨论时事或者在Slashdot(一个资讯科技网站)上看到一个新产品的描述的时候。思考安全方面的问题将不再是一件乏味无聊的事情,也不需要当作一项任务而专门划分一段时间来完成,我们甚至可能在遛狗、洗澡或者看电影的时候开始思考。简而言之。读者能够培养出专业偏执狂的思维并像安全专业人员那样进行思考。
对计算机安全从业者(实际上对所有的计算机科学家)来说,意识到围绕科技的更广泛的背景问题是非常重要的。科技并不是独立存在的,而仅仅是一个包含了人、经济、道德、文化差异、政治、法律等的生态系统的小方面。在安全中涉及这些问题时,下面的练习会给读者一个机会来讨论和探索这些问题。

第2章 密码学简介

思维导图

知识概述

2.1加密——Kerckhoff

Kerckhoff原则∶ 加密方案的安全性必须仅仅依赖于对密钥K.的保密,而不依赖于对算法的保密这个原则的提出是有很多原因的。算法是很难改变的,它们被嵌入到软件或者硬件中,是难以升级的。在实际情况中,同一个算法会使用很长一段时间。另外,保持密钥的保密性已经很困难,保持算法的保密性就更加困难了(代价也更昂贵),毕竟密码系统不单是为两 24个用户而建立的,系统中的任何用户(可能以数百万计)都使用相同的算法,Eve只需要从某个用户那里获得这个算法,而有的用户肯定是容易被收买的,或者她还可以窃取一台记录了算法的笔记本电脑。还记得我们的偏执狂模型吗? Eve也可能恰好是这个系统中的其他用户,甚至可能是系统的设计者之一
还有更多理由表明应该公开算法。根据经验,我们知道人们很容易犯小错误而设计一个脆弱的密码算法。如果不公开算法,那么直到攻击者开始攻击系统也不会有人发现这个错误,然后攻击者就可以利用这个缺陷来攻破系统。我们分析过许多不公开的加密算法,发现所有这些算法都是有缺陷的,这也正是许多私有的、秘密的算法不被信任的原因。不要相信"算法保密是为了增加安全性"这样的老观念,那是错误的。采用这样的做法对安全性的提升是很小的,反而很有可能会降低安全性。结论非常简单∶ 不要相信不公开的算法。

2.2认证

认证与消息编号方案结合使用可以解决大部分问题,不过Eve仍然可以阻止Alice 和Bob 进行通信,或者通过先删除消息以后再发送给 Bob的方式来延迟消息传递。如果消息没有经过加密,那么 Eve还可以根据消息的内容选择性地删除或延迟消息,但Eve能做的Z6 也只有删除或延迟消息了。最好的理解方式是考虑 Alice发送一系列消息m,m,m。…,Bob只接收具有正确MAC的消息,并且每条消息的编号严格大于9他接收到的上一条消息的编号,所以Bob接收的消息是 Alice 发送的消息序列的子序列。子序列是原序列删除零或多条消息之后得到的序列。
在这种情况下,密码学的作用也仅限于此。Bob将接收到Alice发送的消息的一个子序列,而其他人除了可以删除某些消息或者阻止所有通信之外,不能够操控消息的传输。为了避免丢失信息,Alice 和 Bob通常使用某种方案来重新发送那些丢失的消息,但那是针对特定的应用而言的,不属于密码学的范畴。当然,在很多情况下,Alice 和Bob会同时使用加密和认证,我们在后面将非常详细地讨论这种组合。但绝不要混淆这两个概念,加密一条消息并不能阻止其内容被改变,而认证
一条消息不能使消息保密,密码学中常见的一个误解是认为加密消息就能够防止Eve改变它,但事实并非如此。

2.3公钥加密

公钥密码使得分发密钥的问题变得非常简单。现在 Bob 只需要发布一个任何人都可以使用的公钥,Alice 也用同样的方式发布公钥,然后Alice 和 Bob就可以安全地通信了。即使在很大的群组中,每一个成员都只需要公开一个公钥,这样就相当容易管理了。既然公钥加密如此简单,我们为何还要使用私钥加密呢?因为公钥加密的效率非常低,相比私钥加密相差好几个数量级,在所有的情况下都使用公钥加密显然开销太高了。在使用
公钥密码的实际系统中,公钥算法和私钥算法几乎总是结合使用的。公钥算法用来建立一个[28]密钥,该密钥用来加密真正的数据,这样就将公钥密码的灵活性和对称密码的高效性结合起来了。

2.4数字签名

这种性质在理论上非常好,但也只是在理论上有效。在实际应用中,需认识到数字签名还有一定的局限性。主要问题在于并不是 Alice本人亲自计算签名,而是她的计算机计算签名,因此数字签名并不能证明Alice认可了该消息,甚至也不能证明她在计算机屏幕上看到了该消息。既然病毒能够轻易地控制计算机,那么在这种情况下数字签名实际上也不能证明什么。然而,如果使用适当,数字签名还是相当有用的。

2.5PKI

在PKI中,每一个参与方只需要让CA给他的公钥颁发证书,并知道 CA的公钥以验证其他参与方的证书。这样的工作量远比与每一个通信方交换密钥小得多,这正是PKI的巨大优势∶ 一次注册,随处使用。由于实际原因,PKI通常设置多层次的CA。其中有一个最高层的CA,称为根,它为低层CA的公钥颁发证书,而低层 CA则给用户的公钥颁发证书。这个系统以同样的方式工作,但是现在 Alice 需要检验两个证书以验证 Bob 的公钥。
PKI并不是最终的解决方案,其中还有很多问题。首先,CA必须被每一个人信任。在有些情况下,这是容易做到的。一个公司的人力资源部门知道所有的员工,可以担任 CA的角色。但是世界上没有一个实体能够被所有人信任、仅凭一个PKI来管理整个世界的想法显然是不可行的。

2.6攻击

密文攻击(ciphertext-only attack)就是大多数人谈到攻破一个加密系统时所指的攻击。这是这样一种情形。Alice 和Bob对他们的数据进行了加密,攻击者得到的只有密文。在只知道密文的情况下试图解密一个消息就称为唯密文攻击,这是最困难的一种攻击方式,因为已知的信息量最少。
已知明文攻击是一种同时知道明文和密文的攻击。显然,这种攻击的目标是获得解密密钥。乍一看这好像令人难以置信,如何知道明文呢?实际上,在很多情况下都可以获得通信的明文。有时候一些消息是容易预测的,比如 Alice在外度假,她的电子邮件自动回复设置为能够给每一封收到的电子邮件回复"我在度假",攻击者可以给 Alice发送一封电子邮件,然后读取答复得到自动回复的具体内容,那么当Bob发送一个电子邮件给 Alice时,也会有同样的自动回复。不过这一次是加密的,现在攻击者就得到了一条消息的密文和明文。如果能够得到密钥。就可以解密Alice 和Bob使用这个密钥交互的其他所有消息。后一部分非常重要。值得重述一遍∶通过一些明文-密文对获得密钥,然后使用密钥来解密其他密文。
选择明文攻击(chosen-plaintext attack)是很合理的,一个好的加密算法应该能够抵抗选择明文攻击。如果有人声称选择明文攻击与他们的系统无关,我们一定要持怀疑态度。
"选择密文"这个术语其实不太恰当,实际上应该称为"选择密文和明文攻击",但是这样显得太长了。在选择明文攻击中,攻击者可以选择明文值;而在选择密文攻击中,攻击者既可以选择明文值也可以选择密文值。对每个选择的明文,攻击者可以得到相应的密文,而且对每一个选择的密文也可以得到相应的明文。

2.7深入探讨

生日攻击得名于生日悖论。如果一个房间里有23个人,那么其中两个人生日相同的概率超过这个概率大得令人不可思议,因为一共有365 个可能的生日。
中间相遇攻击和生日攻击属于同一类(我们将这两种攻击统称碰撞攻击),不过中间相遇攻击更加常见而且更加有用。我们可以自己选择构造一个密钥表,而不用等待密钥重复出现。

2.8安全等级

我们经常讨论一个攻击者需要采取一定数量的步骤、但是还没有具体说明什么是一个步骤,这在一定程度上是偷懒,但也是为了简化分析。在攻击加密函数时,对给定的密钥,单独进行一个给定消息的加密计算就是一个步骤。但有时一个步骤也可能仅仅是在一个表中查找某些东西,它是可变的。不过在所有情况下,一个步骤能够被计算机在很短的时间内完成,有时可能需要一个时钟周期。有时可能需要 100万个时钟周期,但是对于这种密码攻击所需要的工作量,100万的数量级并不是十分重要。基于步骤分析的易用性远比其内在的不
确定性更重要,我们总可以进行更详细的分析来确定一个步骤相当于多少工作量,但是为了进行快速估计,我们总是假定一个单独的步骤需要一个时钟周期。

2.9性能

全性不可能免费得到。虽然许多密码学家想让密码算法尽量高效,但有时这些算法还是被认为效率很低,为了效率而定制密码方案可能会有风险。如果偏离了安全性的大道、我们必须进行大量的分析来确保设计的系统并不脆弱,这样的分析需要经验丰富的密码学家。
最近我们听到一种观点认为应该让人们更多地选择安全性而不是性能,"已经有太多不安全的快速系统了,我们再也不需要这样的系统"。这种观点非常正确,人们在安全性上采用折中措施的开销和尽力做好的开销几乎相同,而前者只能提供很小的安全性。所以我们坚定地认为,如果想要实现任何安全性,就要尽量去实现好。

2.10复杂性

个系统越复杂,就越可能有安全问题。实际上,复杂性是安全性的最大障碍,这是一个很简单的准则,但是需要一段时间才能真正理解它。这与几乎到处使用的"测试-修复"的开发过程有关∶创建某个系统,测试错误,返回修复,再次测试并发现新的错误,等等。测试、修复,不停地重复,这样的过程会一直持续下去,直到公司财务或其他因素决定这个产品该交付了。当然,只要它只用于与测试相同的环境,这种过程产生的系统会工作得非常好。这对于功能性来说可能已经足够好了,但是对 37]于安全系统而言完全不合适。
这种"测试-修复"方法的问题在于,测试只是说明了错误的存在,这些错误仅仅是测试者想发现的。安全系统需要在机智并怀有恶意的人进行攻击时仍然能够工作,而一个系统不可能对所有可能受到的攻击都进行测试。测试仅仅能够针对功能,而安全性不是功能的缺失。无论攻击者做什么,他都应该无法获得任何信息,而测试并不能体现这种性质的缺失。系统必须一开始就是安全的。

苏格拉底检验

第一个问题



第二个问题



遇到的问题及解决办法

假设Alice欲使用RSA方案发送签名消息给Bob,选取Alice的公钥,Bob的公钥。求Alice对消息的签名。
Alice对消息的签名应该是用Alice的私钥加密消息,这样Bob用Alice的公钥解密之后可以确保该消息由Alice发送,达到签名效果。
Alice对消息的加密是用Bob的公钥进行加密,Bob收到消息后,用自己的私钥进行解密,因为Bob的私钥只有他自己拥有,别人无法看到消息内容,达到保密效果。
整个过过程为Alice用自己的私钥加密消息,然后用Bob的公钥加密消息,然后发送消息,Bob收到消息后,先用自己的私钥解密消息,实现保密效果,再用Alice公钥解密消息,验证签名。

参考资料

除了教材,我还查阅了一些资料,对密码攻击类型知识点进行了深入学习:
https://www.cnblogs.com/mrcharles/p/11879751.html
http://www.cnitpm.com/pm1/58220.html

标签:公钥,加密,20211121,系统,Alice,笔记,博川,Bob,密码学
From: https://www.cnblogs.com/bochuan/p/18050356

相关文章

  • Programming Abstractions in C阅读笔记:p312-p326
    《ProgrammingAbstractionsinC》学习第77天,p312-p326,总计15页,第7章完结。一、技术总结第7章主要讲算法分析——引入时间复杂度这一概念来评估算法的快慢。时间复杂度使用大O符号来表示。第7章以排序算法为示例,包含:选择排序,归并排序以及快速排序,这些基本的排序算法都是我们要......
  • c++复习笔记——STL(vector)
    c++-----STL容器系列(1)vector1介绍Vector是stl容器中一种常见的容器,基本和数组类似,其大小(size)可变,常用于数组长度不确定时来代替数组,当数据超过vector预定值时vector将自动扩容。Vector是一种顺序存储器,在内存中连续排列,可以通过下标访问,时间复杂度为O(1)。2创建和使用使用......
  • 【Java基础】Maven入门笔记
    本篇笔记参考尚硅谷Maven课程,概括总结了Maven的核心功能Maven仓库地址:MavenRepository:Search/Browse/Explore一、Maven简介1.Maven是一个依赖管理工具、构建工具2.Maven介绍Maven是一款为Java项目管理构建、依赖管理的工具(软件),使用Maven可以自动化构建、测试、打......
  • Java笔记:Lambda表达式
    Lambda表达式在Java中是函数式编程的一种体现,允许把函数作为一个方法的参数传递进方法中,或者将函数作为方法的返回值。1.语法和基础使用语法://Lambda实现是一个简单的表达式(parameters)->expression;//Lambda实现是一个函数体(parameters)->{statements;}paramet......
  • Java学习笔记——第四天
    数组数组是什么数组就是一个容器,用来存一批同种类型的数据。数组有什么用遇到批量数据的存储和操作时,数组比变量更适合。代码简洁,逻辑清晰。数组的定义静态初始化数组定义数组的时候直接给数组赋值。格式1(完整格式)数据类型[]数组名=new数据类型[]{元素1,元素2,元素3…......
  • Go语言精进之路读书笔记第43条——使用testdata管理测试依赖的外部数据文件
    43.1testdata目录Go语言规定:Go工具链将忽略名为testdata的目录。开发者可以在名为testdata的目录下存放和管理测试代码依赖的数据文件,数据文件可作为输入也可作为输出gotest命令在执行时会将被测试程序包源码所在目录设置为其工作目录,可以这样使用f,err:=os.Open("testda......
  • Semantic Kernel 学习笔记:通过 Kernel Memory 初步体验 Retrieval Augmented Generati
    学习材料:QuickintrotoKernelMemory:install,uploadadoc,askaquestion创建控制台项目dotnetnewconsoledotnetaddpackageMicrosoft.KernelMemory.Core创建IKernelMemory实例varmemory=newKernelMemoryBuilder().WithOpenAIDefaults(OPENAI_API_KEY......
  • Java学习笔记——第三天
    流程控制程序中最经典的三种执行顺序顺序结构:自上而下地执行代码,最普通的执行顺序。分支结构:根据条件,选择对应代码执行。循环结构:控制某段代码重复执行。分支结构if分支if分支的作用根据条件(真或假)来决定执不执行某段代码或执行哪段代码。if分支应用场景需要根据不同......
  • 李超线段树学习笔记
    前言如有错误,欢迎各位大佬指出。GM说学了斜率和线段树就可以尝试。前置芝士:斜率线段树1.什么是李超线段树?李超线段树主要解决平面坐标系内有关直线的问题,李超线段树是一种特殊的线段树。这里给出一个引例P4097[HEOI2013]Segment。题目大意及要维护两个操作:给......
  • 随笔记录篇——C++iostream库 以及std
    这篇文章非原创,来自我学习过程中看到的其他博主发的一些资料,解决了我的疑问,在此进行整理。C语言的标准输入输出库是stdio.h库,是一个函数库,而不是类库。其中包含了我们其中所用的scanfpringf都是一些独立的全局函数,因为C语言是不支持类的。C++的标准输入输出库iostream是一个类......