zoukankan      html  css  js  c++  java
  • 密码学学习整理二

    密码学总结二

    一.对称密码学

    密码体制的分类

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

    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处理密码更快,也比常规计算机更安全的存储数据。
        • 安全特性
          • 存储空间对外界不可见
          • 一旦被撬,有自毁装置
          • 不允许密钥离开。加密时把明文送入加速器,它返回密文。
        • 通常与令牌一起使用
          • 只有插入令牌,提供令牌正确的口令,加速器才能工作
  • 相关阅读:
    Java Tread多线程(2)多线程安全问题
    Android 自己定义ViewGroup 实战篇 -> 实现FlowLayout
    类的继承私有成员问题
    HTTP协议之响应头Date与Age
    《长寿的基因》:尝试挑战主流医学界的观点,态度不严谨,有点像民间科学家。2星。
    《医疗产业大棋局》,4星。有点旧了,依旧是比较难得的有深度的中美两国医疗市场的概括与分析。
    《时间的朋友2016》:吴伯凡写的稿子,比去年李翔写的差。3星。
    《你凭什么做好互联网》。5星。洞察力比较强的从业者的经验集。适合互联网行业各级别各角色阅读。
    《长安十二时辰》。5星。大唐首都反恐24小时。基本是大片剧本。有创意的穿越架空小说。
    读过MBA的CEO更自私?《哈佛商业评论》2016年第12期。4星
  • 原文地址:https://www.cnblogs.com/FZfangzheng/p/9206446.html
Copyright © 2011-2022 走看看