0x01 前言

攻防世界上的一道题,考查DES加密OFB模式下的弱密钥问题。题目名为easy_BlockCipher。

0x02 解题

题目给了一段代码和一个ciphertext的二进制加密文件,先看代码:

from Crypto.Cipher import DESf = open('key.txt', 'r')
key_hex = f.readline()[:-1] # discard newline
f.close()
KEY = key_hex.decode("hex")
IV = '13245678'
a = DES.new(KEY, DES.MODE_OFB, IV)f = open('plaintext', 'r')
plaintext = f.read()
f.close()ciphertext = a.encrypt(plaintext)
f = open('ciphertext', 'w')
f.write(ciphertext)
f.close()

代码很简单,利用DES的OFB模式加密plaintext,给定了IV的值,为13245678,加密内容写进ciphertext,没有给KEY的值,但key是通过key.txt生成的十六进制值。

因此,已知IV,密文,只需要知道key的值就可以求出明文了。

简单看下DES加密,照搬《深入浅出密码学》里的笔记啦:

DES算法概述

DES是一种使用56位密钥对64位长分组进行加密的密码。DES是一种对称密码,加密和解密过程使用相同的密钥。DES也是一种迭代算法,DES对明文中的每个分组的加密过程都包含16轮,每轮操作完全相同。每轮都会使用不同的子密钥,并且所有子密钥Ki都是从主密钥K中推导而来。

DES的安全性

针对密码的攻击种类繁多,可以把密码攻击分为穷尽密钥搜索攻击(或蛮力攻击)与分析攻击。利用穷尽密钥搜索攻击可以较容易的破解单重DES,因此,对大多数应用程序而言,单重DES都不再适用。

理论上讲,利用DES穷尽密钥搜索应该可以破解这题。

但是这题并不需要穷举密钥,其实DES加密中存在弱密钥:

在 DES 的计算中,56bit 的密钥最终会被处理为 16 个轮密钥,每一个轮密钥用于 16 轮计算中的一轮,DES 弱密钥会使这 16 个轮密钥完全一致。

其中四个弱密钥为:

0x0000000000000000
0xFFFFFFFFFFFFFFFF
0xE1E1E1E1F0F0F0F0
0x1E1E1E1E0F0F0F0F

所以这题其实只需要尝试用这四个密钥+IV解密文本就可以了,可以利用CyberChef直接解密,也可以编写解密的代码:

from Crypto.Cipher import DESf = open('ciphertext', 'r')
ciphertext = f.read()
f.close()
IV = '13245678'KEY = "\xE1\xE1\xE1\xE1\xF0\xF0\xF0\xF0"
a = DES.new(KEY, DES.MODE_OFB, IV)
plaintext = a.decrypt(ciphertext)
print(plaintext)

最终得到明文:

The furthest distance in the worldIs not between life and death
But when I stand infront of you
Yet you don't know that I love youIs not when I stand infront of you
Yet you can't see my love
But when undoubtedly knowing the love from both
Yet can not be togetherIs not being apart while being in love
But when painly cannot resist the yearning
Yet pretending you have never been in my heartIs not when painly can not resist the yearning
yet pretending you have never been in my heart
but using one's in different heart
To dig an uncrossable river
For the one who loves youflag{_poor_single_dog_has_found_an_echo_from_it}

0x03 总结

CTF中DES的题目比RSA及AES的题目少的多,且加密的安全性也比另外两种密钥差的多,尤其是单重的加密。另外在解密的时候解了半天都没解出来,发现代码给定的IV值为13245678,结果我一直用12345678做IV,看来以后做题的时候还是得认真点。

Crypto日记之DES-OFB加密模式的弱密钥问题相关推荐

  1. .NET中的DES对称加密

    DES是一种对称加密(Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法.一般密码长度为8个字节,其中56位加密密钥, ...

  2. js des加密 java_java JS DES互相加密解密 通用!!!

    如果 出现 异常 javax.crypto.IllegalBlockSizeException 那就看我博客园的 另外一篇  解决这个异常 帮客户整了1天 试了N个JS 的方法 终于找我弄出来了! j ...

  3. 信息安全工程师笔记-加密模式ECB、CBC、CFB、OFB、CTR

    简述 DES和AES都属于分组密码,它们只能加密固定长度的明文.如果需要加密任意长度的明文,就需要对分组密码进行迭代,而 分组密码的迭代方法就称为分组密码"模式". 分组密码有很多 ...

  4. 加密模式介绍(ECB、CBC、PCBC、CFB、OFB、CTR)

    加密模式介绍(ECB.CBC.PCBC.CFB.OFB.CTR) 加密与解密的加密模式有很多种,在玩Cipher的时候,其中创建Cipher对象的时候需要指定加密模式,去学习了一下各种加密模式,在这里 ...

  5. 分组加密模式 ECB CBC OFB CFB ,分组加密填充

    目录 分组加密模式 ECB模式 CBC模式 CFB/OFB都可以作为流加密 CFB模式 OFB模式 分组加密的填充 PKCS7 分组加密模式 多个分组加密互相之间如何关联 ECB模式 每个分组之间单独 ...

  6. 加密模式ECB、CBC、CFB、OFB、CTR

    简述 DES和AES都属于分组密码,它们只能加密固定长度的明文.如果需要加密任意长度的明文,就需要对分组密码进行迭代,而 分组密码的迭代方法就称为分组密码"模式". 分组密码有很多 ...

  7. Linux crypto相关知识的汇总 Linux加密框架crypto对称算法和哈希算法加密模式

    参考链接 Linux加密框架中的算法和算法模式(二)_家有一希的博客-CSDN博客 对称算法 分组算法模式 ECB模式 ECB模式下,明文数据被分为大小合适的分组,然后对每个分组独立进行加密或解密 如 ...

  8. 用python实现DES加解密,并附带EBC和CBC两种分组加密模式

    之前在网上看了好多关于DES加解密的文章,很多都是直接贴代码,然而大多数都不能运行.花了一天写了个能运行的程序,其中有参考网上的一些好的代码.希望入了密码学坑的同学能得到帮助.python刚上手,代码 ...

  9. LINUX、C#下使用DES算法CBC模式进行对称加密、解密

    openssl是一个加密库,封装了多个算法,我们这里使用的是DES算法CBC模式. 一.准备OPENSSL的LINUX及C#库 openssl项目地址: https://www.openssl.org ...

最新文章

  1. 如何利用离散Hopfield神经网络进行高校科研能力评价(1)
  2. log4j记录不同的日志_使用log4j将不同类型的日志信息记录到不同的文件中
  3. django filter查询多选_动态filter查询数据Django实现方法
  4. python数据结构和算法讲解_【学习】python数据结构和算法
  5. html5图片比例控制,按比例调整图像大小以适应HTML5画布
  6. weblogic 文件服务器,weblogic配置文件服务器
  7. python教材答案第四章_python核心编程课后习题解答第四章
  8. Android tv开发px,【Android】TV端项目开发挖坑总结
  9. 严重漏洞可导致 Juniper 设备遭劫持或破坏
  10. Solr4.8.0源码分析(13)之LuceneCore的索引修复
  11. evolving checkers players [Fogel and Chellapilla, 2002]
  12. MySql解除安全模式
  13. C/C++ 内存泄漏-原因、避免以及定位
  14. Java各种学习资源(视频+文档)
  15. JSP中response.sendRedirect()与request.getRequestDispatcher().forward(request,respon 区别
  16. 使用php制作导航栏,如何制作简单导航栏
  17. 关于Maven中pom文件标签的详解,分别对比父工程pom文件与子工程pom文件。
  18. m-序列简述及其相关性质
  19. 微信小程序的校园二手物品交易平台系统 uniapp 小程序
  20. ROS教程(二十一):Roslaunch在大型项目中的使用技巧

热门文章

  1. 8000 sentences of oral English(five)
  2. Excel批量插入多行
  3. 可以在电脑上面看电视了
  4. 【每日知识】JS获取当前时间
  5. java车队版team,让我们一起认识下 Team CCC车队的环法战车
  6. 工程伦理案例分析-波音737MAX空难
  7. php丢色子,PHP制作的掷色子点数抽奖游戏实例(代码)
  8. linux mysql升级5.7_linux 升级 MySQL5.7.32 mysql升级(yum方式)
  9. 方舟生存进化mysql_MySQL——关于索引的总结_pubg黑号,dnf辅助
  10. windows以及chrome自带的快捷键