• 密码学01 Intro


    密码学关心的问题和应用

    • Secrecy,即信息是否泄露
    • Integrity,即信息是否被篡改
    • Oblivious Transfer(不经意传输)
    • Zero Knowledge Proof(零知识证明)
    • Secure Multi-party Computation(多方计算)
    • Digital Currency(数字货币)

    如何定义安全?CPA-secure、CCA-secure....

    观点一:

    Only I know the encryption algorithm and keys, so it's safe.

    观点二:

    It would takes 100 years to break the system for an adversary with a currently most advanced computer using the best known method.

    严格证明:

    Computationally Security

    Game-Based Proof

    Simulation-Based Proof

    如何取随机数?什么是伪随机序列?如何衡量伪随机序列的随机性?

    Oblivious Transfer

    你可以找女孩A和B中其中一个女孩的号码,但是不能让另一个人知道

    一些概念

    现代加密方法包括如下几个部分:

    (mathcal M) 表示信息空间,即所有可以加密的信息的集合

    (mathcal K) 表示密钥空间,即所有密钥组成的集合

    ( ext{Enc,Dec}) 表示加密、解密方法

    ( ext{Gen}) 表示密钥生成器

    一个比较显然的要求是 (Dec(Enc(M))=M),即加密后解密的信息要保真

    Classical Cipher

    给了几个例子

    凯撒密码(Caesar Cipher)

    定义函数 (next:SigmamapstoSigma) 为 按照某种顺序排列 (Sigma) 的内容,某字符的下一个字符是什么

    然后构造映射 (f_k=next^k),其中 (k) 是非 (0) 常正整数,那么 (f_k)({f_k}^{-1}) 就是一对加密和解密算法了。

    (k=3) 的情况就是经典凯撒密码

    这个密码问题很大

    • 首先这是一个固定的算法
    • 其次 (k) 的值域很小,只需要做 (26) 次就可以得到所有情况

    由此自然引出

    Sufficient Key Space Principle(充分密钥空间原则)

    任何加密算法必须有足够大的密钥空间,使得不会被暴力枚举破解。

    一个原则是密钥要尽可能地长

    但是足够大的密钥空间并不一定能保证安全,MAS加密是一个例子

    ROT-13

    (k=13) 的凯撒密码

    这个密码的一个好处在于,(f_{13}={f_{13}}^{-1}),即加密和解密是一样的

    Mono-alphabetic Substitution Cipher(单字母替换密码)

    构造一个permutation (pi:SigmamapstoSigma)

    那么 (pi)({pi}^{-1}) 就是加密和解密。这里permutation 的意义在于,如果不是双射的话,就无法解密了

    凯撒密码可以看成是这个的特例。这类密码的一大特色就是要有一个对应小本本

    容易计算,MAS密码的密钥空间就是排列数量 (left|Sigma ight|!)。取小写字母表就是 (26!approx 2^{88})

    MAS的最大缺点在于,它永远将相同字符加密成相同的字符(双射),即它完全保存了原文的所有信息。这使得第三方可以基于统计学原理来进行攻击。例如说"u常在q后,h很可能在t后"之类的统计学规律,常见的模式会被保留,甚至说直接用字母频率的相对大小进行匹配。

    Poly-alphabetic Substitution Cipher(多字母替换密码)

    考虑构造这样构造的排列 (pi:Sigma imesSigmamapsto Sigma imesSigma)

    也就是我们把每两位字符映射为两位字符。这样可以部分解决相同字母映射下的象永远相同的问题

    缺点也很明显,我们需要更大的空间储存映射表

    Vigenere Cipher

    这个密码首先需要一个catch phrase,例如说 (phrase=cafe)

    然后构造 (pi:SigmamapstoSigma),规定 (pi(code_i)=f_{phrase_{ipmod |phrase|}}(code_i))

    可以发现这实际上就是一个特殊的PAS密码,即我们每 (|phrase|) 位造一个映射,并且每个映射都是相同的

    VC的破解

    分成几个步骤

    1. (phrase)的长度 (m)
    2. 把密文每 (m) 位分组,那么模 (m) 同余的位放在一起就是一个(k)未知的凯撒密码了

    现在考虑怎么破译单次的凯撒密码

    我们当然可以枚举(26)种可能的密钥,然后找到make sense的明文

    但是由于判定明文是否make sense是不那么平凡的,因此书上给出了另一个可以自动化完成的做法

    定义 (p_i) 表示第 (i) 个字符在英语中出现的频率,(q_i) 表示第 (i) 个字符在密文中出现的频率,假设密钥是 (k),那么有

    (sum {p_i}^2approx sum{q_{i+k ext{ mod } 26}}^2)

    于是我们可以计算不同key对应的 (sum p_iq_{i+k ext{ mod } 26}),然后按照和期望值的差来排序

    那么就可以枚举 (m),然后对模 (m) 相同的位做凯撒的破译,最后合并就好了

    有一个小小的优化,它源自如下观察:

    若两个位置 (i,j) 满足 (iequiv jpmod {m}),且明文对应的第 (i,j) 位相同,那么密文的对应位置上的字符也相同

    那么就可以寻找长度较短的、出现了多次的密文的子串,(m) 一定是用它们之间的距离的一个因数。还可以多次寻找重复的pattern,枚举这些距离的GCD的因数来求 (m)

    Modern Cipher

    古典密码更像是艺术,缺乏科学的分析

    现代密码学的目标在于:给定一个密码构造,可以严格证明它是安全的

    需要证明,首先要:

    • 定义什么是"安全"
    • 需要给出一些假设(可以是未被证明的猜想)

    安全性取决于安全目标(security goal)和攻击模型(threat model),即不同的目标和不同水平的攻击,会使得安全性的定义发生变化。

    security goal

    这里用secure encryption举例

    前几个要求相对而言比较基本,并且非常显然

    1. 攻击者无法通过密文获得密钥
    2. 攻击者无法通过密文获得明文
    3. 攻击者无法破译任意明文的任意字符
    4. 无论攻击者掌握了多少信息,密文不会泄露除此之外的任何信息

    threat model

    1. Cipher text-only attack: 攻击者只知道密文
    2. Known-plain text attack: 即已知明文攻击,攻击者在攻击前可以知道若干明文到密文的单向映射(比如说加密文件有固定的格式,有已知的片段)
    3. Chosen-plain text attack: 攻击者可以选择知道若干明文到密文的单向映射(比如说加密设施是公开的,那么攻击者就可以任意获得任意明文对应的密文,但反过来不行)
    4. Chosen-cipher text attack: 攻击者可以选择知道若干密文到明文的映射(比如说解密设施是公开的)

    assumptions

    加密解密问题通常依赖于一些难以计算/不存在高效算法的问题

    • 大数分解问题
    • SAT问题

    选择假设的时候需要注意这几个点

    1. 选择虽未被证明,但是经过长时间检验的假设
    2. 选择更弱的假设。若存在两个假设A,B,其中A能推出B,那么选择A而不是B。这样在B被证伪后,A仍然坚挺。如果两个假设不可比较,那么选择被研究得更深入的假设
    3. 在假设被证伪后,需要针对性地研究它在证明一个加密方法时扮演的角色

    provable security

    基于我们的假设,针对特定的攻击者,达到了一些安全目标。这样的安全性被称为可证明的安全性

    通常可证明的安全性是对现实中的安全性的一种建模,即仅针对重要部分形式化证明。

    Kerckhoffs' Principle

    古典密码的安全性很大程度上基于信息的不对称(即我用的什么加密方式,攻击者是不知道的)

    柯克霍夫原则:

    The cipher method must not be required to be secret, and it must

    be able to fall into the hands of the enemy without inconvenience.

    即现代密码的安全性仅依赖于密钥,而不是加密方式

    这么要求的理由有以下几个:

    1. 相比起同时保密密钥和加密方法,只保存密钥要方便得多
    2. 相比起更改加密方法,定期更换密钥更容易保持安全
    3. 统一的加密方法更容易实现标准化

    也就是说,尽量使用公开、经过验证的加密策略,配以定期更换的密钥,更能保护安全。所谓home-brewed算法很多其实经不起验证

    本文来自博客园,作者:jjppp。本博客所有文章除特别声明外,均采用CC BY-SA 4.0 协议

  • 相关阅读:
    反射获取class的Class
    线程礼让yield和线程的强制执行join
    Lambda表达式
    java中的静态代理
    java多线程中的callable接口实现
    java利用线程并行的方法模拟龟兔赛跑
    java中的多线程
    HTTP 协议之请求格式
    java的反射概述
    Tomcat和servlet的关系
  • 原文地址:https://www.cnblogs.com/jjppp/p/15221020.html
Copyright © 2020-2023  润新知