CTF竞赛进阶 (一) 密码学

0x01 概述

Crypto 相比于 web 和 pwn,更考验参赛者的基础知识,对数学能力、逻辑思维能力与分析能力都有很高的要求。
密码学题目多种多样,包括但不限于:

  1. 通过密文分析明文
  2. 缺陷自定义密码体制分析解密文
  3. 加/解密机交互接口,利用弱点来泄露某些敏感信息

0x02 编码

0x02a 概念

字符编码(英语:Character encoding)、字集码是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。常见的例子包括将拉丁字母表编码成摩斯电码和ASCII。其中,ASCII将字母、数字和其它符号编号,并用7比特的二进制来表示这个整数。通常会额外使用一个扩充的比特,以便于以1个字节的方式存储。

在计算机技术发展的早期,如ASCII(1963年)和EBCDIC(1964年)这样的字符集逐渐成为标准。但这些字符集的局限很快就变得明显,于是人们开发了许多方法来扩展它们。对于支持包括东亚CJK字符家族在内的写作系统的要求能支持更大量的字符,并且需要一种系统而不是临时的方法实现这些字符的编码。

0x02b Base encode

  1. Base64
    Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法。每 6bit 为一个单元,对应一个可打印字符.
    base64 通常用于只能处理文本数据的场合,表示、传输、存储一些二进制数据,包括 MIME 电子邮件、XML 复杂数据等。
    tips:
    原数据长度不是 3 的倍数且剩下 1 个输入数据,则在编码结果后面加 2 个“=”;
    剩下 2 个输入数据,则在编码结果后面加 1 个“=”;
    是 3 的倍数则一个“=”也不加。

  2. base32 and base16
    与 base64 目的一样,只是具体编码规则不同。
    base32 编码将二进制文件转换成 32 个 ASCII 字符组成的文本
    转换表:
    ABCDEFGHIJKLMNOPQRSTUVWXYZ234567

base16 …
转换表:
0-9
A-F

  1. uuencode
    uuencode这个名字是衍生自"Unix-to-Unix encoding",原先是 Unix 系统下将二进制的资料借由 uucp 邮件系统传输的一个编码程式,是一种二进制到文字的编码。uudecode 是与uuencode 搭配的解码程式,uuencode/decode 常见于电子邮件中的档案传送以及 usenet 新闻组和 BBS 的贴文等等。近来已被 MIME 所大量取代。
  2. xxencode
    类似 BASE64 ,转换表不同
    XXencode 编码,XX编码介绍、XXencode编码转换原理与算法

0x02c 其他编码

  1. URL encode
    百分号编码(英语:Percent-encoding),又称:URL编码(URL encoding)是特定上下文的统一资源定位符 (URL)的编码机制,实际上也适用于统一资源标志符(URI)的编码。也用于为 application/x-www-form-urlencoded MIME准备数据,因为它用于通过HTTP的请求操作(request)提交HTML表单数据。
  2. jjencode and aaencode
    jjencode 和 aaencode 都是针对 JavaScript 代码的编码方式。前者是将 JS 代码转换成只有符号的字符串,后者是将 JS 代码转换成常用的网络表情。本质上适对 JS 代码的一种混淆。

0x03 古典密码

0x03a 线性映射

  1. 凯撒密码
    凯撒密码(英语:Caesar cipher),或称凯撒加密、凯撒变换、变换加密,是一种最简单且最广为人知的加密技术。凯撒密码是一种替换加密技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以罗马共和时期凯撒的名字命名的,据称当年凯撒曾用此方法与其将军们进行联系。
    凯撒密码通常被作为其他更复杂的加密方法中的一个步骤,例如维吉尼亚密码。凯撒密码还在现代的ROT13系统中被应用。但是和所有的利用字母表进行替换的加密技术一样,凯撒密码非常容易被破解,而且在实际应用中也无法保证通信安全。
    CTF竞赛进阶 (一) 密码学_第1张图片
  2. 维吉尼亚密码
    维吉尼亚密码(又译维热纳尔密码)是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式。
    维吉尼亚密码曾多次被发明。该方法最早记录在吉奥万·巴蒂斯塔·贝拉索( Giovan Battista Bellaso)于1553年所著的书《吉奥万·巴蒂斯塔·贝拉索先生的密码》(意大利语:La cifra del. Sig. Giovan Battista Bellaso)中。然而,后来在19世纪时被误传为是法国外交官布莱斯·德·维吉尼亚(Blaise De Vigenère)所创造,因此现在被称为“维吉尼亚密码”。
    维吉尼亚密码以其简单易用而著称,同时初学者通常难以破解,因而又被称为“不可破译的密码”(法语:le chiffre indéchiffrable)。这也让很多人使用维吉尼亚密码来加密的目的就是为了将其破解CTF竞赛进阶 (一) 密码学_第2张图片

0x03b 固定替换

  1. 培根密码
    培根密码,又名倍康尼密码[1](英语:Bacon’s cipher)是由法兰西斯·培根发明的一种隐写术。
  2. 猪圈密码
    猪圈密码(英语:pigpen cipher),亦称共济会密码(masonic cipher)或 共济会员密码(Freemason’s cipher),是一种以格子为基础的简单替代式密码。即使使用符号,也不会影响密码分析,亦可用在其它替代式的方法。右边的例子,是把字母填进格子的模样。
    早在1700年代,共济会常常使用这种密码保护一些私密纪录或用来通讯,所以又称共济会密码。
    CTF竞赛进阶 (一) 密码学_第3张图片

0x03c 移位密码

  1. 栅栏密码
    栅栏密码是一种置换式密码。其名称来自其加密方法。所谓栅栏密码,就是将要加密的明文分为N个一组,再从每组的选出一个字母连起来,形成一段无规律的密文。
    栅栏密码并非一种强的加密法,其加密原理限制了密钥的最高数量不可能超过明文字母数,而实际加密时密钥数目更少,因此有些密码分析员甚至能用手直接解出明文。
  2. 曲路密码
    曲路密码是一种置换密码,其中密钥是从明文创建的块中读取密文时要遵循的路径,该密钥需双方事先约定好(曲路路径)。
    CTF竞赛进阶 (一) 密码学_第4张图片

0x04 分组密码

0x04a 分组密码常见工作模式

  1. ECB
    ECB模式(电子密码本模式)
    ECB模式是将明文消息分成固定大小的分组,当最后一个分组的内容小于分组长度时,需要用特定的数据进行填充以至于长度等于分组长度,每个分组的加密和解密都是独立的,可以进行并行操作,但是安全性较低,对于相同的明文会被加密成相同的密文,因此不能很好的保护数据模式。CTF竞赛进阶 (一) 密码学_第5张图片
  2. CBC模式(密码分组链接模式)
    CBC模式中的第一个分组需要用初始化向量IV(一个随机的且长度为一个分组长度的比特序列)进行异或操作再进行加密,而后面的每一个分组都要先和前一个分组加密后的密文分组进行异或操作,然后再加密。加密是连续的,不能进行并行操作。CTF竞赛进阶 (一) 密码学_第6张图片
  3. OFB模式(输出反馈模式)
    OFB模式是通过将明文分组和密码算法的输出进行异或操作来产生密文分组的,也需要使用初始化向量(IV),可以将块密码变成同步的流密码,将之前一次的加密结果使用密钥再次进行加密,产生的块作为密钥流,然后将其与明文块进行异或,得到密文。由于 XOR 操作的堆成性,加密和解密操作是完全相同的。
    CTF竞赛进阶 (一) 密码学_第7张图片
  4. CFB模式(密文反馈模式)
    CFB模式类似OFB模式,是将前一个分组的密文加密后和当前分组的明文进行异或操作生成当前分组的密文,第一个明文分组通过初始化向量lV进行加密再与之进行异或操作得到第一个密文分组。
    CTF竞赛进阶 (一) 密码学_第8张图片
    CTF竞赛进阶 (一) 密码学_第9张图片
  5. CTR模式(计数器模式)
    CTR 模式也被称为 ICM 模式、SIC 模式。在 CTR 模式中,每次加密时都会生成一个不同的值来作为计数器的初始值,每个分组对应一个逐次累加的计数器,通过对计数器进行加密来生成密钥流,再将密钥流与明文分组进行异或操作得到密文分组。
    CTF竞赛进阶 (一) 密码学_第10张图片
    CTF竞赛进阶 (一) 密码学_第11张图片

0x04b 费斯妥密码和 DES

  1. 费斯妥密码
    在密码学中,费斯妥密码(英语:Feistel cipher)是用于构造分组密码的对称结构,以德国出生的物理学家和密码学家霍斯特·费斯妥(Horst Feistel)命名,他在美国IBM工作期间完成了此项开拓性研究。通常也称为费斯妥网络(Feistel network)。大部分分组密码使用该方案,包括数据加密标准(DES)。费斯妥结构的优点在于加密和解密操作非常相似,在某些情况下甚至是相同的,只需要逆转密钥编排。因此,实现这种密码所需的代码或电路大小能几乎减半。
    费斯妥网络是一种迭代密码,其中的内部函数称为轮函数。
  2. DES 密码
    数据加密标准(英语:Data Encryption Standard,缩写为 DES)是一种对称密钥加密块密码算法,1976 年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来。它基于使用56位密钥的对称算法。这个算法因为包含一些机密设计元素,相对短的密钥长度以及怀疑内含美国国家安全局(NSA)的后门而在开始时有争议,DES 因此受到了强烈的学院派式的审查,并以此推动了现代的块密码及其密码分析的发展。
    DES 现在已经不是一种安全的加密方法,主要因为它使用的 56 位密钥过短。1999年1月,distributed.net 与电子前哨基金会合作,在 22 小时 15 分钟内即公开破解了一个 DES 密钥。也有一些分析报告提出了该算法的理论上的弱点,虽然在实际中难以应用。为了提供实用所需的安全性,可以使用 DES 的派生算法 3DES 来进行加密,虽然 3DES 也存在理论上的攻击方法。DES 标准和 3DES 标准已逐渐被高级加密标准(AES)所取代。另外,DES 已经不再作为国家标准科技协会(前国家标准局)的一个标准。
    在某些文献中,作为算法的 DES 被称为 DEA(Data Encryption Algorithm,数据加密算法),以与作为标准的 DES 区分开来。在发音时,DES 可以作为缩写按字母拼出来(/ˌdiːˌiːˈɛs/),或作为一个词念成/ˈdɛz/。
    初始置换 -> subkeys 的生成 -> 轮函数
  3. AES
    高级加密标准(英语:Advanced Encryption Standard,缩写:AES),又称Rijndael加密法(荷兰语发音:[ˈrɛindaːl],音似英文的“Rhine doll”),是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。现在,高级加密标准已然成为对称密钥加密中最流行的算法之一。
    该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael为名投稿高级加密标准的甄选流程。

0x05 流密码

在密码学中,流密码(英语:Stream cipher),又译为流加密、资料流加密,是一种对称加密算法,加密和解密双方使用相同伪随机加密数据流(pseudo-random stream)作为密钥,明文数据每次与密钥数据流顺次对应加密,得到密文数据流。实践中数据通常是一个位(bit)并用异或(xor)操作加密。

该算法解决了对称加密完善保密性(perfect secrecy)的实际操作困难。“完善保密性”由克劳德·香农于1949年提出。由于完善保密性要求密钥长度不短于明文长度,故而实际操作存在困难,改由较短数据流通过特定算法得到密钥流。

0x06 公钥密码

0x06a 概述

公开密钥密码学(英语:Public-key cryptography)也称非对称式密码学(英语:Asymmetric cryptography)是密码学的一种算法,它需要两个密钥,一个是公开密钥,另一个是私有密钥;公钥用作加密,私钥则用作解密。使用公钥把明文加密后所得的密文,只能用相对应的私钥才能解密并得到原本的明文,最初用来加密的公钥不能用作解密。由于加密和解密需要两个不同的密钥,故被称为非对称加密;不同于加密和解密都使用同一个密钥的对称加密。公钥可以公开,可任意向外发布;私钥不可以公开,必须由用户自行严格秘密保管,绝不透过任何途径向任何人提供,也不会透露给被信任的要通信的另一方。

基于公开密钥加密的特性,它还能提供数字签名的功能,使电子文件可以得到如同在纸本文件上亲笔签署的效果。

公开密钥基础建设透过信任数字证书认证机构的根证书、及其使用公开密钥加密作数字签名核发的公开密钥认证,形成信任链架构,已在TLS实现并在万维网的HTTP以HTTPS、在电子邮件的SMTP以SMTPS或STARTTLS引入。

另一方面,信任网络则采用去中心化的概念,取代了依赖数字证书认证机构的公钥基础设施,因为每一张电子证书在信任链中最终只由一个根证书授权信任,信任网络的公钥则可以累积多个用户的信任。PGP就是其中一个例子。

0x06b RSA

RSA加密算法是一种非对称加密算法,在公开密钥加密和电子商业中被广泛使用。RSA是由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)在1977年一起提出的。当时他们三人都在麻省理工学院工作。RSA 就是他们三人姓氏开头字母拼在一起组成的。

1973年,在英国政府通讯总部工作的数学家克利福德·柯克斯(Clifford Cocks)在一个内部文件中提出了一个与之等效的算法,但该算法被列入机密,直到1997年才得到公开。

对极大整数做因数分解的难度决定了 RSA 算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA 算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用 RSA 加密的信息的可靠性就会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的 RSA 钥匙才可能被强力方式破解。到目前为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被破解的。

1983年9月12日麻省理工学院在美国为RSA算法申请了专利。这个专利于2000年9月21日失效。由于该算法在申请专利前就已经被发表了,在世界上大多数其它地区这个专利权不被承认。

0x07 其他常见密码学应用

0x07a Diffle-Hellman 密钥交换

迪菲-赫尔曼密钥交换(英语:Diffie–Hellman key exchange,缩写为D-H) 是一种安全协议。它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥。这个密钥可以在后续的通讯中作为对称密钥来加密通讯内容。公钥交换的概念最早由瑞夫·墨克(Ralph C. Merkle)提出,而这个密钥交换方法,由惠特菲尔德·迪菲(Bailey Whitfield Diffie)和马丁·赫尔曼(Martin Edward Hellman)在1976年首次发表。马丁·赫尔曼曾主张这个密钥交换方法,应被称为迪菲-赫尔曼-墨克密钥交换(英语:Diffie–Hellman–Merkle key exchange)。

0x07b Hash 长度扩展攻击

在密码学和计算机安全中,长度扩展攻击(Length extension attacks)是指针对某些允许包含额外信息的加密散列函数的攻击手段。

该攻击适用于在消息与密钥的长度已知的情形下,所有采取了 H(密钥 ∥ 消息) 此类构造的散列函数。MD5和SHA-1等基于Merkle–Damgård构造的算法均对此类攻击显示出脆弱性。注意,由于密钥散列消息认证码(HMAC)并未采取 H(密钥 ∥ 消息) 的构造方式,因此不会受到此类攻击的影响(如HMAC-MD5、HMAC-SHA1)。SHA-3算法对此攻击免疫。

0x07c Shamir 门限方案

Shamir (t,n)门限方案是通过构造一个t-1次多项式,并将需共享的秘密作为该多项式的常数项,将秘密分成n部分分别给n个参与者,使t个参与者联合可恢复秘密,但少于t个参与者联合不能得到共享秘密的任何信息。Blakley独立地提出的另一个(t,n)门限方案,它的基本思想是利用多维空间中的点来建立门限方案,将共享的秘密看成t维空间中的一个点,每个子秘密为包含这个点的t-1维超平面的方程,任意t个t- 1维超平面的交点刚好确定共享的秘密,而t-1个子秘密(即t-1个t-1维超平面)仅能确定其交线,因而得不到共享秘密的任何信息。

你可能感兴趣的:(CTF)