Crypto:密码学

数学、密码学,以及脑洞

Crypto

Encrypt(加密) & Decrypt(解密)

  • 古典密码

  • 对称加密(流密码/块加密)

  • 非对称加密

  • 其它

古典密码

  • 前置知识:

    • 几大类古典密码

      • 单表代换密码:每个明文字母都有一个密文字母进行对应,攻击者可能通过观察某些密文字母出现的频率来猜测其对应的明文。

      • 栅栏密码:利用明文字母的排列组合进行加密。

      • 维吉尼亚密码:用字符串作为密钥,按照字符串中每个字符在字母表中的次序对明文进行循环加密。

      • ......

  • 入门级:凯撒密码(cyberpeace)

  • 入门级:栅栏密码(cyberpeace)

    • 通过特殊规则来完成加解密:

      ccehgyaefnpeoobe{lcirg}epriec_ora_g

    • 注意,这个谜面的栅栏加密方式加了点小佐料~

对称加密:加解密同密钥

流加密

  • 明文流与密钥流长度相等

块密钥

  • 一个分组密钥可以加密多块数据

非对称加密:加解密不同密钥

  • 前置知识一:

    • 非对称加密相对于对称加密的一个最大的不同在于:它的加密和解密所使用的密钥是不同的,用来加密的密钥不能用来解密,用来解密的密钥也无法用来加密。

    • 当前比较常见的两种非对称加密:

      • RSA(基于两个大素数积的分解困难性)

      • ECC(基于椭圆曲线上的有理点构成Abel加法群上椭圆离散对数的计算困难性)

  • 前置知识二:

RSA

  • 入门级:RSA 求乘法逆元

    • 住你上铺的兄弟突然声称他掌握了某项黑科技,并向你发送了一个压缩包,这看起来十分可疑!

  • 首先,打开这个压缩包;

  • 解压出来一个无后缀文件名,是不是还要再解压一次?;

  • 查看内部文件,发现除了加密文本之外,还有个 gy.key ,这时候就需要用到 OpenSSL 工具来读取其中的公钥信息;

  • 通过解码获得了 n 和 e ,先试试 N 能不能分解成 p 和 q

  • 居然可以!现在我们有了 p q n e ,还能从它们解出 φ(n),回忆一下前置知识2-7,这时候就可以尝试解 e 的乘法逆元 d 了。

  • 入门级:RSA 求最大公约数

    • 上铺的兄弟对你的配合很感激,于是向你发送了并夕夕零食链接,并表示你可以任意选购其中任意一种,但你发现他发送的链接好像有点不对劲————他居然同时发了两个文件!

      • 算了算了,还是零食重要,调查文件

      • 放马过来,看我再破一题!调查文件

  • 题目开门见山,明明白白告诉我们,要求 最大公约数 ,看来这是核心,打开文件,果然有两个 n 等着我们;

  • python为我们提供了相当便捷的工具库(当然如果你想自己实现一遍算法也是完全ok的),我们可以通过工具来算出它们的 最大公约数 ,由于 pq 都是大素数,则这个公约数必定就是 p*q 中的一个;

  • 有了这个 p ,我们就可以通过这个 p 推出每个 n 对应的另一个乘数 q ,现在我们又再次拿到了 n p q e ,对 d 求解就顺理成章了。

  • 拿到私钥,由前置知识2-7,我们就可以解出对应的明文了。

其它类型

推理类型

  • 成长级:上铺兄弟最近又新学了Java Script,他写了一个网页对应的源代码,并声称你前两次的实力得到了他的认可,是时候决出寝室 Crypto King 的归属权了。

    • 让我们结束这场哑谜吧!

编解码类型

  • 与上节课中 MISC 分类有部分重合,本质上都是考验我们 对编码类型的敏感程度

  • 看到结尾有 = ,第一反应:Base64!

  • Base64 解码之后,看到这串字符串,怎么看都感觉还是 Base64,再解一遍!

  • 解完发现是一串 数字 + 斜线 ,数字还都是 ASCII 码表上 字母区间 里的,直接对照 ASCII 码表破译即可。

隐写类型

  • 与上节课中 MISC 分类有部分重合,内容基本一致,此处不再展开讲解。

参考链接

本期作业

平台:xctf

writeups: writeup 攻防世界 简单题

  1. MD5 【易】

    本题非常简单,题目大意为给定一个 md5 值,然后找出明文, md5 爆破即可。

  2. easy_RSA【易】

  3. Normal_RSA【易】

  1. 幂数加密【易】

  2. fanfie【难】

    混合加密+仿射密码

  3. easy_ECC【难】

    需要编码,考察对椭圆加密公钥算法的理解,需要对 ECC算法具有一定的了解,然后编程实现。