2022 | Google CTF | crypto
Maybe Someday
题目¶
Leave me your ciphertexts. I will talk to you later.
chall.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
|
解题思路¶
- 需要在限制查询次数且无交互的情况下进行 Padding Oracle 攻击,针对使用 EME-PKCS1-v1_5 方案1填充的 Paillier 加密系统
-
尽管每轮查询机会仅 \(20\) 次,但目标明文只有 \(65536\) 种情况,知道 \(4\) 个字节以上就可以基本确定,不过考虑到顺序相关的信息无法获得,查询范围可以稍稍扩大一些
-
EME-PKCS1-v1_5 是为 RSA 设计的填充方案,也有现成的攻击方法,但对具有加法同态性的 Paillier 来说,Padding Oracle 攻击的实施将更简单一些
- 关于 Paillier 的加法同态性可参考 Crypto - P(ai)^3
-
被认为正确的填充满足以下条件
00 02 PS 00 M - 第一、二字节为
\x00\x02
- 除第一字节外,存在另一个
\x00
字节划分不包含\x00
字节的伪随机字节串PS
以及消息M
PS
的长度不少于 \(8\) 字节
- 第一、二字节为
-
因为填充验证并没有对
PS
做过多的限制,不包含字节\x00
且长度不少于 \(8\) 字节即可。因此可以通过加法消去分隔符\x00
字节,而后枚举消息的各个字节。假设目标明文填充后为 \(m\),且 \(m+m_0\) 恰好使原分隔符失效。设 \(b=2^8,m_1=j\cdot b^i\),若 \(j\) 的值与目标明文右数第 \(i\) 字节的值相同,则 \(m+m_0-m_1\) 将产生新的\x00
字节作为分隔符,使得填充验证能够通过
Flag¶
CTF{p4dd1n9_or4cl3_w1th_h0mom0rph1c_pr0p3r7y_c0m6in3d_in7o_a_w31rd_m47h_puzz1e}
-
RFC 3447: Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography Specifications Version 2.1 ↩
最后更新:
2022年7月14日 23:35:44
Contributors: