密码学学习整理二

密码学总结二

一.对称密码学

密码体制的分类

  • 对称密码(加解密使用相同的密钥)
    • 流密码(序列密码)
    • 分组密码
  • 非对称密码(公钥密码,加解密使用不同的密钥)

1.对称密码学概述

  1. 随机性

    • 一个随机序列要求每个比特产生的概率都是1/2
    • 每个比特与其他比特统计上相互独立
    • 对于计算机而言,计算机产生的一系列随机数其实是周期性的,只是周期很大

    任何人考虑用数学的方法产生随机数肯定是不合理的

    计算机本身只能产生伪随机序列

  2. 随机序列类型

    1. (一般)伪随机序列
      • 伪随机序列应该在统计上是随机的
    2. 密码学意义上安全的伪随机序列
      • 不可预测性,即使知道了产生序列的算法、以前产生的所有比特,也不可能通过计算来预测下一个比特是什么(准确预测成功的概率很低)目的是防止攻击者在知道若干比特后,成功猜测后续比特
    3. 真随机序列
      • 不能被可靠地重复产生(用完全同样的输入操作两次,得到的是两个不相关的序列)
  3. 如何得到真随机序列

    使用一种专门的设备(真随机数发生器),输入是各种无法预测的信号:周围空气状况、电流的变化率…

    输入是不断变化的,输出也就不可重复。

    有人能预测产生的下一个数吗? 他必须重构输入信号,这没人能做到

  4. 一次一密

    1. 加密:明文流与密钥流对应比特异或
    2. 解密:密文流与密钥流对应比特异或
    3. 特点:密钥流是真随机序列,且不重复使用(故得名 一次一密)
    4. 安全性:因为密钥流是真随机的,所以没人能预测下一个比特
    5. 是无条件安全的,即使攻击者具有无限的计算资源和计算能力,也无法破译一次一密 (理论上不可破译,无条件安全的,对于任意密文 y 和明文 x,都有 Pr[x | y] = Pr[x],即,不能通过分析密文获得明文的任何信息)
    6. 原因:密钥是随机的,而且明文与密钥是统计上相互独立的,使得密文也是随机的,故而密钥的随机性很好的隐藏了明文的统计特性
    7. 证明:

      密钥流是随机的,则每个密钥比特的概率满足: Pr[k=0]=1/2, Pr[k=1]=1/2

      假设明文流某个比特的概率满足: Pr[m=0]=p, Pr[m=1]=1-p

      对应的密文比特的概率:

      Pr[c=0] = Pr[k=0]Pr[m=0]+Pr[k=1]Pr[m=1]=1/2

      Pr[c=1] = Pr[k=0]Pr[m=1]+Pr[k=1]Pr[m=0]=1/2

    8. 只使用异或运算,软硬件实现非常简单。但实用性不强
      1. 密钥是真随机的
      2. 密钥长度至少等于明文长度
      3. 每个密钥只用一次
  5. 流密码

    1. 基本思想

      用一个较短的密钥生成密钥流,在攻击者(计算能力是有限的)看来是随机的(伪随机的)。不是无条件安全的,仅是计算上安全的

    2. 产生密钥流的任务由 密钥流生成器 完成
    3. 关键:如何生成伪随机性“好”的密钥流,故而关键在于密钥流生成器的设计
    4. 分类:
      1. 同步流密码

        密钥流只根据密钥产生与明文流无关

      2. 自同步流密码

        密钥流不仅与密钥有关还与明文流有关

    5. 密钥流生成器的内部构造
      1. 驱动部分

        为非线性组合部分提供统计特性“好”的序列 (一般伪随机序列)

      2. 非线性组合部分

        将提供的输入序列组合成密码学特性“好”的序列 (密码学意义上安全的伪随机序列)

      3. 驱动部分应该实现简单,且提供统计特性较好的序列。反馈移位寄存器(FSR)可以满足该要求,是流密码设计中的常用模块
      4. FSR的功能

        • 以密钥为初始状态(输入)
        • 按照确定的递推关系(由反馈函数决定)
        • 产生一个周期长、线性复杂度高、统计特性好的初始序列
        • 并将输出提供给非线性组合等密码变换,以产生抗密码分析能力强的伪随机序列
      5. 为什么不直接使用种子作随机数
        1. 速度问题:收集种子通常很耗时
        2. 熵(不确定性):种子的熵通常比较低,但不管其熵如何,伪随机序列发生器都能产生统计性好的序列
      6. 如何收集种子才是安全的?
        1. 毫秒计的时间
        2. 用户的输入
        3. 鼠标点击的位置...它们混合在一起便有了不可预测性,可以抵抗种子猜测攻击
  6. 分组密码

    1. 特点
      • 将明文分成等长(比特)的明文分组。
      • 输入一个明文分组,输出一个等长(通常)的密文分组。
    2. 实质
      实质是设计一种算法,能在密钥控制下,把 n比特明文分组 简单而迅速地置换成 唯一的 n比特的密文分组,并且这种变换是可逆的(解密)所以,它必须是一个 双射函数 (因为明文分组空间等于密文分组空间)

    3. 设计分组密码的两种基本技术
      1. 混乱

        使明文和密文之间、密钥和密文之间的相关统计特性极小化,从而使攻击者无法找到密钥(常用方法代换)

      2. 扩散

        将明文及密钥的影响尽可能迅速地散布到较多个密文比特中(常用方法置换)
        混乱和扩散的思想由香农提出,目的:抵抗攻击者对密码系统的统计分析

    4. 代换
      1. 什么叫 代换?

        加密时,明文的每个分组都应产生唯一的密文分组 (具有可逆性,为了解密),称这种明文分组到密文分组的可逆变换为代换
      2. 如果明文分组为n比特,则明文分组有多少个可能的取值?

        2^n

      3. 不同可逆变换有多少个?

        2^n!

      4. 如果分组长度太小,系统则等价于古典的代换密码,容易通过对明文的统计分析而被攻破。但从实现的角度来看,构造分组长度很大的代换结构也不现实
      5. 实际中,常将明文分组再分成较小的“段”,对每个“段”用不同的代换结构(子代换)进行变换,称每个子代换为代换盒,简称为 S盒

  7. 数据加密标准(DES)

    1. 分组长度:明文分组、密文分组长度都是 64比特
    2. 密钥空间:密钥长度也是 64比特,其中有效密钥长度 56比特 (有8比特奇偶校验位)
    3. 算法:解密过程与加密过程完全相同,唯一不同的是,子密钥的使用顺序完全相反
    4. DES的安全性主要依赖于8个非线性代换S盒
    5. 具有雪崩效应: 明文或密钥的一点小的变动使密文发生一个大的变化。
    6. DES算法目前最大的问题: 随着计算机技术的飞速发展,56bit 的 有效密钥长度不足以抵御穷举攻击。因为密钥空间大小只有2^56 ≈ 10^17
    7. 三重DES (3DES) :使用两个或三个密钥,执行三次DES算法
  8. 流密码与分组密码的比较

    1. 流密码的优势
      • 速度快
      • 代码量少(RC4的代码只有30行)
    2. 分组密码的优势
      • 密钥可以重用
      • 有标准化算法(DES、AES)
  9. 填充
    1. 通常,明文长度是不固定的,按固定长度分组时,往往最后一个分组长度不足,如何解决?

      填充(Padding)
    2. 如何填充
      1. 填充一些字符补齐最后一个分组。
      2. 把最后一个分组的最后一个字节称作填充指示符,所表示的十进制数字就是填充了多少字节。
      3. 明文尾部、填充的字符和填充指示符一起作为最后一组进行加密。
      4. 不论最后一个分组长度是否足够,都要进行填充
        1. 长度不足时正常填充
        2. 长度足够时新建分组填充一个组
  10. 分组密码的工作模式
    为什么需要工作模式?
    分组密码的输入是一个明文分组,是定长的。
    要加密的明文是变长的,长度往往大于一个明文分组。
    即使有了安全的分组密码体制,也需要采用适当的工作模式来隐蔽明文的统计特性,以提高整体的安全性。

    模式名称 缩写 英文全称
    电子密码本 ECB Electronic CodeBook
    密码分组链 CBC Cipher Block Chaining
    密码反馈 CFB Cipher FeedBack
    输出反馈 OFB Output FeedBack
    计数器 CTR Counter
  11. ECB

    1. 每个明文分组独立加/解密
    2. 优点
      • 简单、高速
      • 无差错传播:单个密文分组出现错误只会影响该分组的解密,不会影响到其他分组
    3. 缺点
      • 分组彼此独立,相同密钥下,相同明文分组得出相同密文分组
      • 这会暴露明文数据的格式和统计特征
      • 且易受重放、插入攻击,五种模式中安全性最弱
    4. ECB适用于发送少量数据的场合,一般不推荐
  12. CBC

    1. 每个明文分组先与前一密文分组异或,再进行加密
    2. 初始矢量 IV
      • 加密第一个明文分组时,尚无反馈的密文,为此需要预先置入一个,称为 初始矢量 IV(Initial Vector)
      • 收发双方必须使用相同IV
      • IV无需加密保护,可以随密文一起发送给接收方
      • 最好使用不同IV(比如每次将IV加1)加密不同明文
    3. CBC适用于文件加密,较ECB模式慢
    4. 有限差错传播
      • 单个密文分组出现错误会影响该分组和后面一个密文分组的解密
      • 可自同步,只要后面一个密文分组没错,便不会影响后续密文分组的解密
  13. CFB

    1. 速度
      • 实现简单(只要求加密算法)
      • 比CBC慢很多,每次只有少数比特完成加密
    2. IV
      • 加密不同的明文,必须使用不同的IV
    3. 差错传播
      • 单个密文分组出现一个比特错误,不仅影响该分组,还会最多影响后续[64/j]个密文分组的解密
    4. 自同步
      • 单个密文分组出现错误,只要后续[64/j]个密文分组没有错误,后面的便可正确解密
    5. CFB适用于 明文按字符(如电传电报)或按比特处理的流密码中
    6. CFB适用于 无延迟的加密和传播
    7. CFB适用于 容忍以少量错误扩展换来恢复同步能力的场合
  14. OFB

    1. 速度
      • 实现简单(只要求加密算法)
      • 比CBC慢很多,每次只有少数比特完成加密
    2. IV
      • 加密不同的明文,必须使用不同的IV
    3. 无差错传播
      • 单个密文分组出现错误,只影响该分组的解密
    4. 自同步
      • 能从密文错误中得以恢复;但丢失密文比特会无法实现自同步
    5. 密钥流
      • 可预计算 (因为密钥流独立于明文)
    6. OFB适用于 必须避免错误传播的高速同步系统
  15. CTR

    1. 速度
      • 实现简单(只要求加密算法)
      • 效率高
        • 可预计算
        • 可并行加密、吞吐量仅受可并行数量的限制
    2. 其他
      • 可随机访问密文数据块
      • 可证明安全性
    3. CTR适用于 需要并行处理的应用领域
  16. 对称密钥管理
    1. 保护密钥是很重要的,因为所有的安全性都依赖于密钥的机密性(柯克霍夫斯原则)
    2. Q&A
      1. 是否可以记住密钥,这样就不用存储,别人也偷看不了?
        • 理论上可以,但不实际,因为密钥是随机的,很难记忆
      2. 既然有地方安全保存密钥,为啥不直接把敏感信息放在那里?
        • 保护短的密钥比保护数以兆计的信息更容易
    3. 用 密钥 保护数以兆计的信息,用一些其他技术保护大约16字节(128bit)的密钥
    4. 主要技术
      • 基于口令的加密(PBE)
        • 加密
          • 选择一个口令
          • 伪随机序列发生器产生一个salt
          • 用一个算法混合口令和salt,通常使用Hash函数
          • 从Hash函数的输出中取出所需要长度的比特作为密钥
          • 密钥用完后丢弃。用脑子记住口令。
          • salt无需保密,可以和加密后的数据一起保存。
        • 解密
          • 输入口令
          • 从保存点(磁盘)取出salt和密文
          • 用算法(Hash函数)混合口令和salt,产生密钥
          • 用该密钥解密密文,以恢复明文
      • 为什么不直接用口令作密钥?
        • 口令的熵很小,远达不到密钥所要求的随机程度
      • salt (盐值) 是干什么用的?
        • 为防止字典攻击中的预计算
      • 为什么salt和密文一起保存,保密salt不是更安全?
        • 使用salt的唯一目的是防止字典攻击中的预计算,而不是增加安全性
        • 即使salt不保密,仍能达到目的。
        • 此外,如果保密salt的话,还不如直接保密密钥。
      • 基于硬件的密钥存储
      • 生物统计学
  17. 保护密钥的密钥
    1. 通信时,通常使用两种密钥
      • 会话密钥 (临时密钥)
      • 密钥加密密钥 (KEK)
    2. 使用方法
      • 每次通信使用不同的会话密钥保护明文
      • KEK保护会话密钥,并将之传给对方
    3. 目的
      • 因为每次通信使用不同的会话密钥,攻击者无法获得同一密钥加密的大量密文,使得破译更加困难
    4. 用KEK保护会话密钥,用什么保护KEK?
      • 使用 基于口令的加密,步骤如下:
        • 用口令和salt产生KEK。
        • 用KEK加密会话密钥,用会话密钥加密明文
        • 记住口令,保存salt和加密后的会话密钥
        • 将密文和加密后的会话密钥传给对方
        • 至于KEK,丢掉就OK了
  18. 对基于口令的加密的攻击
    1. 假设攻击者闯入你的电脑,偷走salt和密文(或 加密后的会话密钥),他如何计算密钥?
      • 穷举攻击密钥(无需salt 也可以发动)
    2. 字典攻击 (猜测口令)
      • 因为salt不保密,如果攻击者获得了salt,他仍能发起字典攻击,只不过要多花一些时间
      • 构造或下载一本常用口令的字典,然后尝试每个口令和salt产生的密钥
    3. 两种攻击方法的比较
      • 相比之下,字典攻击速度更快。但若口令不在字典里,当然不会成功
    4. 一个聪明的攻击者一般会这样做
      • 首先尝试字典攻击,失败后换用改进的穷举密钥攻击。
    5. 如何抵挡字典攻击
      • 基本思想
        • 想办法 降低攻击者的计算速度
      • 基本方法
        • Hash函数混合salt和口令后,将输出再次用Hash函数混合,重复进行多次,假设1000次。
      • 优点
        • Hash函数计算速度比你想象的快得多。
        • 事实上,计算1000次Hash函数比你从键盘输入口令的时间还要短。
        • 但攻击者不得不对字典中每个口令计算1000次,使他总的计算时间会很长
      • 其他的实用方法
        • 对于一些在线系统,如ATM机、网上银行、电子邮箱、论坛等,可以限制用户输入口令的次数
        • 若在规定次数内没有输入正确的口令,便吞卡,或提示半小时后才能再次使用系统
  19. 基于硬件的密钥存储
    1. 基于硬件的密钥存储
    2. 把密钥保存在一个硬件设备上
      • 令牌
        • 可以随身携带:钱包里、钥匙链上、当戒指戴
        • 攻击者要获得密钥,必须先拿到令牌,这增加了攻击难度
        • 令牌内部还有进一步保护措施
          • 需要输入一个正确的口令才能使令牌发挥作用
          • 试图用物理手段获得密钥,令牌还有自毁功能
        • 令牌的唯一缺点
          • 必须把密钥加载到内存里才行,有可能会被木马等病毒偷走
          • 但密钥使用完毕就从内存中抹掉了,短短几分钟甚至几秒钟的停留还是问题不大的
    3. 密码加速器
      • 有专门进行密码运算的芯片,比一般CPU处理密码更快,也比常规计算机更安全的存储数据。
      • 安全特性
        • 存储空间对外界不可见
        • 一旦被撬,有自毁装置
        • 不允许密钥离开。加密时把明文送入加速器,它返回密文。
      • 通常与令牌一起使用
        • 只有插入令牌,提供令牌正确的口令,加速器才能工作

猜你喜欢

转载自www.cnblogs.com/FZfangzheng/p/9206446.html