密码学:理论与实践 第三版
密码学和理论是关于我在Coursera stanford在线加密课程上学到的东西的一系列博客文章。 这堂课完全融合了理论,数学和程序设计,我非常喜欢。
第一部分解释了“好的密码”一词的含义。 它包含一个密码定义和多个密码安全性定义。 尽管听起来并不多,但这是我在那里学到的最重要的事情之一。
这很重要,因为密码旨在保护您免受定义明确的攻击,并且容易受到其他任何攻击。 不能只是从他最喜欢的框架的内置密码列表中提取随机密码,而将其称为一天。 必须了解他选择什么以及为什么选择。
密码
密码是一种使用秘密密钥来加密和解密数据的东西。 加密将密钥和数据作为输入并产生密文。 解密采用密钥和密文并产生数据。 这就对了。
密码分为两大类:对称密码和非对称密码。 它们之间的区别在于它们如何对待密钥。
对称密码
对称密码使用相同的密钥来加密和解密数据。 如果使用密钥加密消息,则必须使用相同的密钥对消息进行解密。 密钥必须始终保密。
对称密码的形式定义:
定义: 密码是在三元组(K,M,C)上定义的一对高效算法(E,D),其中
- E:K×M→C
- C:K×C→M
这样
- ∀m∈M,k∈K:D(k,E(k,m))= m。
在以上定义中,K是所有可能的密钥的集合,M是消息的集合,C是所有可能的密文的集合。
最后一个属性称为“一致性属性”。 它说,如果您加密一条消息,则必须能够使用相同的密钥对其进行解密。
非对称密码
非对称密码使用两个不同的密钥。 一种用于加密数据,另一种用于解密数据。 无法使用加密密钥来解密密文。 加密密钥可以安全地发布到互联网上。
非对称密码通常在其内部使用对称密码。 这篇文章是关于背后的基础知识
对称密码,因此无需正式定义非对称密码。
密码安全
上面的密码定义包括好的和可怕的密码。 即使忽略密钥并按原样返回明文的密码也满足该定义。 因此,我们需要定义什么是好的安全密码。
为了使事情变得复杂,“好的密码”的含义在很大程度上取决于上下文。 您如何使用密码和攻击者强度与密码本身一样重要。 攻击者可以修改消息吗? 您可以为每条消息生成新密钥,还是必须重用它们?
结果是存在多个密码安全性定义。 他们都为现实世界中的密码用法和攻击者建模。 其中一些是在发现新型攻击后创建的,并且先前的定义已不再有用。
完美保密
香农(Shannon)发明了第一个密码安全性定义,定义了一种称为“完美保密性”的东西。 完全保密的想法是,密文除了其长度外,不应透露任何有关原始消息的信息。 不管攻击者多么强大,没有密钥的密文都应该与没有密文一样好。
可能最强大的攻击者是能够尝试所有可能密钥的人。 为了防止受到攻击,尝试尝试所有密钥必须生成相同长度的所有纯文本。 如果存在一个将密文解密为“是”的密钥,则存在另一个将密文解密为“否!”的密钥。 另一个将其解密为“ jaj”。
不仅如此,每个纯文本必须在结果中出现完全相同的次数。 如果有两个密钥解密为“是”,则恰好有两个密钥会将其解密为“否!”。
定义:密码(E,d)在(K,M,C)具有完善保密如果∀Ç∈C和∀米0,M 1∈M; | m 0 | = | m 1 |:
- Pr [E(k,m 0 )= c] = Pr [E(k,m 1 )= c]其中,k在K(k←K)中均匀。
注意:Pr代表“概率”,而k←K表示密钥k是随机选择的。 | m 0 | = | m 1 | 表示两条消息的长度相同。
任何试图猜测以密文形式加密了哪条消息的攻击者,都和掷硬币一样准确。 具有相同长度的所有消息都有相同的机会以相同的密文进行加密。
完全保密并不意味着完全可以使用密码。 完美保密有两个不幸的特性:
- 如果您两次使用相同的密钥,则不能保证安全性。
- 它要求密钥至少与原始消息一样长。
通过仔细阅读定义可以看到第一个属性。 该定义仅说明当攻击者只有一个密文可用时发生的情况。 它忽略了他发现用相同密钥加密的两个密文的任何可能性。
证明第二个属性并不是那么困难,至少如果您知道正确的窍门。 由于这是一个很好的练习,因此在这里我不会破坏它。 下面的方框指出了引理,您应该尝试证明自己是否接受挑战。 它也将pdf与答案联系起来,以供那些不想浪费时间使用愚蠢难题的人使用。
定理:如果(K,M,C)上的密码(E,D)具有完全保密性,则| K |≥| M | 例如,键的数量必须大于消息的数量。
证明: 可在此处(pdf)
因此,您必须传输密钥和消息一样长,并且必须对每个秘密消息都进行加密。 当然,如果您具有能够传输所有这些密钥的安全通道,则很可能也可以通过它传输秘密消息。
核心问题是,完全保密的定义没有考虑攻击者的能力。 该定义假定攻击者知道除密钥和加密消息外所有已知的事情。 真正的攻击者没有那么强大,他们无法尝试所有可能的密钥。
语义安全
语义安全性是尝试以更实际的方式定义密码安全性。 与以前一样,密文不应透露有关原始消息的任何信息,除了其长度,而且攻击者只能看到一条加密的消息。
但是,“显示”的定义有所不同。 不可能编写出能够猜测哪个消息以密文形式加密的相当快的计算机程序。 “合理快速”排除尝试尝试所有可能的键的尝试。 那太慢了。
语义安全的正式定义涉及两个玩家的游戏。 一个玩家被称为挑战者,另一个被称为对手。 挑战者对消息进行加密,而对手则试图破解该密码。 游戏规则:
- 对手创建两个长度相同的消息,并将其发送给挑战者。
- 挑战者生成随机密钥。
- 质询者对这些消息之一进行加密,然后将密码发送给对手。
- 对手猜测发送回的消息。
如果攻击者可以猜测哪个消息已加密,则该密码在语义上是不安全的。 对手不必一直都是正确的,他必须比掷硬币更好。 他的准确性被称为“语义安全优势优于被测密码”。
定义:让我们描述两个实验EXP(0)和EXP(1)。 每个实验EXP(b)都需要挑战者和对手。 对手试图猜测它正在进行哪个实验,而挑战者知道这一点。 仅在进行以下交流后才允许使用它们:
- 对手创建两个长度相同的消息m 0和m 1并将它们发送给挑战者。
- 挑战者生成随机密钥。
- 质询者加密消息m b并将E(k,m b )发送给对手。
- 对手的猜测b。
与加密E相比,对手A的语义安全优势是
- Adv ss [A,E] = | Pr [W 0 ] – Pr [W 1 ] | ∈[0,1],其中W b = [A(EXP(b))= 1]例如,事件W b在对手在实验b中且猜测消息1时发生。
定义:如果对所有“有效”的Adv ss [A,E]可以忽略,则加密E在语义上是安全的。
换句话说,如果对手的回答不受他所参加的实验的影响,则加密E在语义上是安全的。他说“我在实验1中”的机会在实验1和实验0中相同。
“客观概率”和“编写计算机程序的能力”之间看似很小的差异有一个重要的后果:密钥不必与消息一样长。 但是,它仍然只能使用一次,攻击者仍然只能看到一条加密消息。
此模型中的攻击者知道消息中可能加密的内容。 但是,他无法使用该知识并从密文中提取更多信息。 因此,定义保证了这样的事情:无论攻击者对加密文本了解多少,他都不会从密文中学到任何新知识。
最后,撰写邮件的是攻击者。 即使攻击者可以撰写您要发送的邮件的一部分,任何语义上安全的密码也可以提供安全性。 对于他来说,以某种可能损害信息其余部分的方式写信是不可能的。
选择的纯文本攻击(CPA)
一次密钥不太实用,因此第三个保密性定义从语义安全性定义中删除了一次密钥使用条件。
挑战者和对手玩的游戏与以前相同。 仅有一种变化:攻击者可以根据自己的意愿编写尽可能多的消息,并且可以根据自己的意愿查看尽可能多的密文。 当然,所有密文都使用相同的密钥加密。
对手和挑战者进行迭代交流。 在每次迭代中,对手都会生成两条长度相等的消息m0和m1并将它们发送给挑战者。 质询者对其中之一进行加密并将密码发回。 挑战者有两个限制:
- 每次迭代都必须使用相同的密钥。
- 它必须在每次迭代时发送回具有相同索引的消息。
对手必须猜测挑战者是发回索引为0还是索引为1的消息。他不必始终保持正确,我们只要求他具有非零精度。
定义:设(E,D)为(K,M,C)的密码。 对于b = 0,1,将EXP(b)定义为:
- 挑战者生成随机密钥。
- 对手无数次询问挑战者。 在每次迭代中,我:
- 对手会创建两条长度相同的消息m i,0和mi i,1并将它们发送给挑战者。
- 对手的猜测b。
定义:如果所有“有效” A的优势在于,在选择的明文攻击下,(K,M,C)上的密码(E,D)是安全的:
- Adv PRF [A,E] = | Pr [W 0 ] -Pr [W 1 ] | 可以忽略不计。
由于事件W b发生在对手处于实验b中并且猜测消息1时,因此上述定义可以重写为:
- Adv PRF [A,E] = | Pr [A(EXP(0))= 1] -Pr [A(EXP(1))= 1] | 可以忽略不计。
否则,如果对手的回答不受他所在的实验的影响,则加密E是CPA安全的。他说“我在实验1”的机会在实验1和实验0中相同。
所选明文攻击定义中的对手是如此强大,以至于必须对加密算法进行随机化处理以抵抗其攻击。 如果对同一封邮件进行两次加密,则应获得两个不同的密文。 简而言之,cpa安全密码无法确定。
声明:设(E,D)为(K,M,C)的密码。 如果E(k,m)是确定性的,则在选择的明文攻击下该密码是不安全的。
证明:对手需要向挑战者提出两个查询。 首先,对手两次发送相同的消息,例如m 1,0 = m 1,1 。 质询者对这些消息之一进行加密并发回密文。 加密哪个消息都没有关系,两种情况下的密文都是相同的。
第二个查询包含与以前相同的消息的一个副本和一个不同的消息,例如m 2,0 = m 1,1和m 2,1 ≠m 1,1 。
如果质询者发回与以前相同的密文,则对手知道他在实验0中。如果质询者发回与以前相同的密文,则对手知道他在实验1中。
相比之下,乍看之下,由攻击者编写消息进行加密这一事实更为重要。 某些密码对于被动攻击者而言是绝对安全的,但如果攻击者可以撰写邮件,它们就会惨遭失败。
和以前一样,攻击者无法以破坏其他消息的方式来编写部分消息。 另外,无论他对加密消息了解多少,他都不会从密文中学到任何新知识。
在所有上述三个安全性定义中,该定义是唯一适用于磁盘加密的。 语义安全密码和安全密码都不足以加密文件。 至少,如果您不想在每次磁盘写操作之后更改密钥。
实用安全
最后两个定义使用术语“有效”和“合理快速”来定义对手的能力。 我们未定义它们,因此这里给出了一个实际的估计:足够快比2 90次操作快。
如果存在只需要少于2 90次操作的攻击,则该密码是不安全的。
最终警告–诚信
这篇文章中解释的最强密码安全性定义是“选择的明文攻击”。 据我所知,任何满足此定义的密码都可以将您的秘密保密。
不幸的是,这仍然并不意味着这种密码能够确保您的数据安全。 虽然攻击者无法从密文中提取任何新信息,但他可以修改加密的文本 。 例如,他仍然可以将您的“是”更改为“否”,或修改加密账单中的帐号。
这带回了本文开头提到的上下文。 在一种情况下完全安全的密码在另一种情况下很容易失败。 密码旨在防止明确定义的攻击和易受其他攻击。
当然,也有防止这种攻击的方法,但这超出了我计划编写的内容。
下一个 …
下一部分将关于伪随机发生器。 它们很重要,因为如果所有密码要防止选择的明文攻击,都必须使用一个。 没有其他办法了。
翻译自: https://www.javacodegeeks.com/2013/12/this-is-stuff-cryptography-theory-1-meaning-of-secure.html
密码学:理论与实践 第三版