• 古典密码异或加密XOR


    异或基础知识

    首先先简单了解异或(XOR)的数学公式:

    1. XOR满足交换律

      a ⊕ b = b ⊕ a

    2. 与0做异或运算,输出为它本身

      a ⊕ 0 = a

      0 ⊕ 0 = 0

      1 ⊕ 0 = 1

    3. 不同为1,相同为0

      1 ⊕ 0 = 1

      0 ⊕ 1 = 1

      0 ⊕ 0 = 0

      1 ⊕ 1 = 0

    4. 异或运算及异或运算符^

    wl90DH.png

    参考资料:异或加密

    异或在密码学中的具体使用

    异或加密的原理就是上述的异或运算,相信大伙们可以很容易地理解这个异或运算,下面介绍的是异或加密的具体实现。

    一次性密码本 One Time Pad(OTP)

    一次性密码本OTP可以使用异或实现,OTP的密钥k与明文消息m有相等的长度,密钥与明文直接进行异或运算即可得到密文c消息。如果需要解密时,只需要对密文和密钥再进行一次异或运算就可以得到明文消息

    例如:密钥k = 73 明文消息m = 87

    密文消息c = k ⊕ m = 30(见下方的图片)

    wl90DH.png

    m = k ⊕ c = 73 (具体过程可以自己推推)

    优缺点:若密钥只使用一次且密钥随机==>安全性极高,但是在实际中,该加密的密钥与明文一样长且在传输过程中需要绝对的保密,传输不方便

    多次密码本 Many Time Pad(MTP)

    相较于OTPMTP通过将明文消息M分成与密钥相同长度多组明文消息Mi,再通过共享密钥K生成多组密文Ci, 相当于按顺序用了多次的共享密钥,但可以使得密钥的长度大大减少

    MTP解密方法

    Many Time Pad Attack - Crib Drag 方法

    若我们得知多组中的一组密文Ci对应的密钥K,即共享密钥K已知,则可以作用与其它组的密文解密

    wlFeZ4.png

    即可以通过多次的循环解密得到多个明文消息部分,再从中选择可读部分(有些是乱码),这样说不直观,我们通过一道ALEXCTF-2017的题目来引入

    参考资料:

    Many Time Pad Attack - Crib Drag(需fanqiang)

    个人转载:

    搬运

    相关题目

    题目来源:

    https://adworld.xctf.org.cn/task/answer?type=crypto&number=5&grade=1&id=5028&page=2

    1. 文件信息

    文件所给的是一长串数字字母字符串,去掉空格后为

    0529242a631234122d2b36697f13272c207f2021283a6b0c79082f28202a302029142c653f3c7f2a2636273e3f2d653e25217908322921780c3a235b3c2c3f207f372e21733a3a2b37263b3130122f6c363b2b312b1e64651b6537222e37377f2020242b6b2c2d5d283f652c2b31661426292b653a292c372a2f20212a316b283c0929232178373c270f682c216532263b2d3632353c2c3c2a293504613c37373531285b3c2a72273a67212a277f373a243c20203d5d243a202a633d205b3c2d3765342236653a2c7423202f3f652a182239373d6f740a1e3c651f207f2c212a247f3d2e65262430791c263e203d63232f0f20653f207f332065262c31683137223679182f2f372133202f142665212637222220733e383f2426386b

    这里的字符串记为密文m

    1. 脚本解密

    这里推荐使用 Crib Drag脚本 该脚本是使用python2写的

    运行代码

    python2 cribdrag.py 16进制密文
    

    wlkOHg.png

    接下来输入一个可能存在于明文或者密钥里的字符串,这里输入该比赛的flag开头ALEXCTF{

    wlEPJA.png

    ​ 05 29 24 2a 63 12 34 12 密钥m的第0位开始8位
    ​ 41 4c 45 58 43 54 46 7b ALEXCTF{ 的16进制形式
    XOR ———————————
    ​ 44 65 61 72 20 46 72 69 异或运算的结果

    结果为Dear Fri,脚本运算的结果也是如此,前面的0-280为各个位开始的8个字节进行的异或运算的结果,在较有意义的字符串前面会加上 ***

    脚本会回显一条交互命令

    Enter the correct position, 'none' for no match, or 'end' to quit:

    选择一个合适的位置,没有的话就输入none或end

    0位的字符串明显是有意义的,我们输入0即可

    此时,脚本又会回显一段交互命令

    Is this crib part of the message or key? Please enter 'message' or 'key':

    选择将crib填入message还是key中,这里的crib(对照文)就是我们输入的ALEXCTF{

    我们假定选择为key(这里选key或者message似乎不是特别的重要)

    wlnHiD.png

    继续输入ALEXCTF{,查看其他位是否还有有意义的字符串

    wluI6s.png

    简单排查了一遍之后,key和message如上图所示

    接下来就是要进行字符串猜测,比如第一行的Dear Fri,我们可以猜测Dear Friend, 将这个字符串作为新的crib带入脚本中,并选择为message部分

    wlMwMd.png

    这里key第一行为ALEXCTF{HERE,猜测完成后我们根据经验又可以猜测之后会有一个下划线,于是下一个新的cribALEXCTF{HERE_

    wlQI6H.png

    多次Crib Drag后,得到进一步的如上信息,接下来再次进行猜测,我们刚刚了解到OTP一次性密码本,我们这里看到第二行sed One time,直接猜测并输入新的crib:sed One time pad,大概在52位的地方可以看到一组有意义的字符串

    wllcvQ.png

    wlljV1.png

    重复上面的步骤,输入新的crib为ALEXCTF{HERE_GOE

    更新一遍信息后

    wl1RzD.png

    这里猜测为cure, Let Me know (最后面有个空格注意下)

    得到ALEXCTF{HERE_GOES_

    之后就反复猜测,这里就不一一赘述了

    最后得到ALEXCTF{HERE_GOES_THE_KEY}

    参考资料

    ALEXCTF CR2: MANY TIME SECRETS WP

  • 相关阅读:
    Linux下Java安装与配置
    HYSPLIT模式简介及在线平台使用
    HYSPLIT模式简介及单机版使用图文教程
    有关气象类资料数据下载网址
    Excel图表编程应用大全(2):图表编程基础
    当装系统时遇到“选中的磁盘采用GPT分区形式”
    SQL函数
    Centos6.7 Redis3.2.8的主从搭建
    Centos 6.7 中 Redis-3.2.8的安装
    Mysql innodb_buffer_pool_size的研究
  • 原文地址:https://www.cnblogs.com/labster/p/13635902.html
Copyright © 2020-2023  润新知