4. Crypto入门

密码学概述

古典密码

  1. 单表替换加密

在单表替换加密中,所有的加密方式几乎都有一个共性,那就是明密文一一对应。

在密文长度足够长的时候,可以使用词频分析进行破解。

如:凯撒密码、埃特巴什码、仿射密码

  1. 多表替换加密

使用多个不同的字母表(替换表)来加密明文,从而增强安全性、抵抗频率分析攻击。

如:维吉尼亚密码

  1. 奇奇怪怪的加密方式

现代密码

  1. 对称加密

主要分为两种方式:

分组密码,又称为块密码。(所谓块加密就是每次加密一块明文)

序列密码,又称为流密码。(流密码的密钥派生自一个较短的密钥,派生算法通常为一个伪随机数生成算法。)

DES,AES,RC4 为代表。

  1. 非对称加密

RSA,ELGamal,椭圆曲线加密为代表。

  1. 哈希函数

MD5,SHA-1,SHA-512等为代表。

  1. 数字签名

RSA 签名,ELGamal 签名,DSA 签名为代表。

古典密码

base加密

base64

原理:把3个8位字节转为4个6位的字节,之后在6位的前面补两个0。

当六位全为 1时:111111 对应 ascii 值 63

1
2
3
4
5
6
7
源文本:The
对应 ascii 码:84 104 101
8 位 binary :01010100 01101000 01100101
6 位 binary :010101 000110 100001 100101
高位补 0:00010101 00000110 00100001 00100101
对应 base64 码表:21 6 33 37
查表:VGhl

通常使用在线网站进行base64加解密。

https://cyberchef.org/

例题:base64、base64(2)

  1. base64

flag{do_you_know_base64_encode}

  1. base64(2)

需要使用题目所给的码表,填到cyberchef的Alphabet中即可

flag{hello_world_base64!}

base32

例题:base32

flag{hello_base32}

base16

例题:base16

flag{easy0_b4sel6!}

凯撒密码

凯撒密码就是把字幕按照顺序移位,key就是移动的位数

例题:凯撒大帝

建议使用https://ctf.bugku.com/tool/caesar的枚举功能

flag{normal_caesar}

维吉尼亚密码

维吉尼亚密码(Vigenère Cipher)是一种经典的多表替换密码,通过动态改变凯撒移位量,大幅提升了古典密码的安全性。

它本质是多个凯撒密码的组合

  • 用一个密钥词(如 LEMON)控制每一位的移位量。
  • 每个密钥字母对应一个移位值(A=0, B=1, …, Z=25)。
  • 加密时,明文 + 密钥(模 26);解密时,密文 − 密钥(模 26)

加密步骤(示例)

以明文 ATTACK、密钥 LEMON 为例:

  1. 对齐:密钥重复至与明文等长
1
2
明文:A T T A C K
密钥:L E M O N L
  1. 转数字(A=0)
1
2
明文:0 19 19 0 2 10
密钥:11 4 12 14 13 11
  1. 相加并模 26
1
2
3
4
0+11=11 → L
19+4=23 → X
19+12=31 mod26=5 → F
...
  1. 结果:密文 LXFOPV

例题:Vigenere

https://ctf.bugku.com/tool/vigenere

flag{easy_Vigenere}

摩斯密码

应该没人不知道把,略

培根密码

培根密码常用两种不同元素代指二进制中的0和1,甚至可以是两种字体、字号、粗细、大小写等

例题:培根

flag{bacniancpher}

其他密码

base100

https://ctf.bugku.com/tool/base100

例题:一百

flag{b@se_loo}

核心价值观编码

例题:社会主义核心价值观

https://ctf.bugku.com/tool/cvecode

flag{hacking_is_a_journey_not_a_destination}

与佛论禅

例题:与佛论禅

https://my.chenyu.me/buddha/

flag{stay_curious_and_keep_experimenting}

盲文

https://www.lddgo.net/common/braille

手机键盘密码

通常以两个数字为一组,第一个数字是所在格子,第二个数字是在当前各自的第几个字母

23指的是 C 61指的是M

电脑键盘密码

通常是若干个字符为一组,实际明文指的是在键盘上被这些字符所包裹的那个字符,如:

1
2
3
4
5
6
wazxde		
S
4edft5
r
uhnmki
j

古埃及象形文字

提瓦特文

标准银河文字

颜文字(AA编码)

例题:颜文字

http://www.hiencode.com/aaencode.html

flag{js_da_fa_hao}

Brainfuck

例题:brainfuck

https://ctf.bugku.com/tool/brainfuck

flag{99754106633f94d350db34d548d6091a}

jsfuck

例题:jsfuck

http://www.hiencode.com/jsfuck.html

flag{3e8b4c45d}

现代密码

RC4

RC4 是一种流密码,属于对称加密算法,特点是极快、极简单、历史极长

  • 用一个密钥生成一串伪随机密钥流
  • 明文与密钥流做异或(XOR) 得到密文
  • 解密一模一样:密文再异或一次密钥流就还原

例题:RC4

http://www.hiencode.com/rc4.html

flag{knowledge_gained_is_power_unlocked}

DES

  • DES 是经典的分组密码
  • 把明文每 64 位(8 字节)分成一组
  • 56 位密钥 对每组做复杂的置换、代换(16 轮加密)
  • 输出也是 64 位一组的密文

ECB模式

ECB即 Electronic CodeBook 电子密码本模式

规则:

  • 把明文切成 64 位一组
  • 每组独立用 DES 加密
  • 最后把密文组拼起来

例如:

明文:AAAAAAAA BBBBBBBB AAAAAAAA

用 DES+ECB 加密:

  • 第 1 组 AAAAAAAA → 密文 X
  • 第 2 组 BBBBBBBB → 密文 Y
  • 第 3 组 AAAAAAAA → 密文 还是 X

特点:相同明文块 → 相同密文块

例题:DES

https://www.toolhelper.cn/SymmetricEncryption/DES

选择模式ECB,填充模式PKCS7,格式Hex

flag{collaboration_creativity_and_coding}

CBC模式

CBC 即 Cipher Block Chaining 密码分组链接模式

  • 当前明文块 先和 前一个密文块 异或
  • 再用 DES 加密

因为每一组都依赖前一组(类似区块链)

所以:相同明文,在不同位置 → 密文一定不同

CFB/OFB/CTR模式

  • CFB:流密码、串行、有错误传播
  • OFB:流密码、无错误传播
  • CTR:流密码、并行最快、现代最爱

AES

例题:AES

https://www.toolhelper.cn/SymmetricEncryption/AES

模式CFB,填充None,格式Hex

flag{every_line_of_code_counts}

RSA

RSA解密常用下面的工具进行:

https://pan.baidu.com/s/1sIcFvRvrPWpKVBA-r7b7EA?pwd=ruzh

知识铺垫

RSA 是非对称加密

  • 公钥(随便给别人)
  • 私钥(自己藏好)
  • 公钥加密 → 只能私钥解密
  • 私钥签名 → 只能公钥验证

安全来自:大数分解很难(两个大质数相乘容易,反过来拆很难)。


原理:

  1. 两个不同质数 p、q
  2. 算 n = p × q
  3. 算欧拉函数 φ(n) = (p-1)(q-1)
  4. 选公钥指数 e:1 <e < φ(n),且与 φ(n) 互质(常用 e=65537)
  5. 算私钥指数 d:d 是 e 在模 φ(n) 下的逆元即:(e × d) mod φ(n) = 1
  • 公钥:(e, n)
  • 私钥:(d, n)

加密:$ C=M^emod\ n $

解密:$ M=C^d mod\ n $

简单示例

我们用很小的质数演示:
① 选质数
p = 11q = 17
② 算 n
n = 11 × 17 = 187
③ 算 φ(n)
φ(n) = (11-1)(17-1) = 10 × 16 = 160
④ 选 e
e 要和 160 互质,随便选一个:e = 3(满足 gcd (3,160)=1)
⑤ 算 d
求 d 使 (3×d) mod 160 = 1得:d = 107


加密 / 解密演示:
设明文 M = 5(必须小于 n)
加密(公钥 3, 187)
C = 5³ mod 187 = 125
解密(私钥 107, 187)
M = 125¹⁰⁷ mod 187 = 5
成功还原!

dpdq泄露

例题:dqdp泄露

打开上面给出的工具,进入IDE选项卡,在【脚本】中选择基础脚本-dpdp泄露.py

更改脚本中的几个数值,然后右键运行即可。

即下面的脚本:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import gmpy2
import libnum

p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229
q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469
c = c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852
dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929
dq = 783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041
def decrypt(dp, dq, p, q, c):
    InvQ = gmpy2.invert(q, p)
    mp = pow(c, dp, p)
    mq = pow(c, dq, q)
    m = (((mp - mq) * InvQ) % p) * q + mq
    print(mp - mq)
    print(libnum.n2s(int(m)).decode())
decrypt(dp, dq, p, q, c)
# m=pow(c,dp,p)
# m=pow(c,dq,q)
# #前提就是 m<p,m<q
# print(libnum.n2s(m))

noxCTF{W31c0m3_70_Ch1n470wn}

dp 泄露

打开工具

填入已知的e、n、c

右键选择分解模数(N),在弹出的N分解工具中输入框填写N的值,点击下面的本地DB查询按钮

将得到的p和q复制到左边的$ Prime(P,Q) $框中,只填写数值,中间用英文逗号隔开

右键,计算私钥(D)

右键,计算明文(M)

点击工具栏中的【常规】- (M)数字»字符,得到flag

flag{wow_leaking_dp_breaks_rsa?_98924743502}

e与phi不互素

打开工具

填入已知的p,q,e,c

选择【模式】- e Φ不互素,得到明文M

点击工具栏中的【常规】- (M)数字»字符,得到flag

flag{1f803313-8999-4ec3-abc6-907a10fde606}

共模攻击

打开上面给出的工具,进入IDE选项卡,在【脚本】中选择基础脚本-共模攻击.py

发现默认脚本数值与当前一致


也可以在RSA选项卡中填入已知的所有值,其中e1,e2都填在$ Public(E) $中,中间英文逗号隔开,c1,c2同理,选择【模式】- 共模攻击,得到明文M

点击工具栏中的【常规】- (M)数字»字符,得到flag

flag{6ed4c74e022cb18c8039e96de93aa9ce}

小e攻击

在RSA选项卡中填入已知的所有值,

选择【模式】- 小e攻击,稍等程序计算,得到明文M

点击工具栏中的【常规】- (M)数字»字符,得到flag

flag{23d5e9dc-cb38-11ea-8d78-dca90498a2db}

Licensed under CC BY-NC-SA 4.0
已存在于互联网
发表了126篇文章 · 总计210.25k字
萌ICP备20267077号
Powered by ctOS