Information Security Study

[crypto][GlacierCTF 2023] Missing Bits 본문

CTF

[crypto][GlacierCTF 2023] Missing Bits

gayeon_ 2023. 11. 29. 21:52

개인 키의 일부 비트가 누락됐다. 암호문을 재구성하고 해독할 수 있는가?

 

 

 

 

from Crypto.PublicKey import RSA
from Crypto.Util.number import bytes_to_long
from Crypto.Util.number import long_to_bytes

content = open("2048_key_original.priv", "rb").read()
key = RSA.import_key(content)

filecontent = open("plaintext_message", "rb").read()

ct = pow(bytes_to_long(filecontent), key.e, key.n)

open("ciphertext_message", "wb").write(long_to_bytes(ct))

encode_file.py 파일이다.

 

from Crypto.PublicKey import RSA

: RSA 암호화를 위한 공개키 및 개인키를 생성하는 모듈을 불러온다.

from Crypto.Util.number import bytes_to_long, long_to_bytes

: 바이트와 정수 간의 변환을 수행하는 데 사용되는 함수를 불러온다. RSA 암호화 및 복호화 과정에서 바이트를 정수로 변환하거나 그 반대로 변환하는 데 사용된다.

content = open("2048_key_original.priv", "rb").read()

: 2048_key_original.priv 파일에서 읽은 내용을 가져와서 content 변수에 저장한다. 이 파일은 RSA 개인키를 포함하고 있다.

key = RSA.import_key(content)

: 가져온 개인키 파일 내용을 사용하여 RSA 개인키 객체를 생성한다.

filecontent = open("plaintext_message", "rb").read()

: plaintext_message 파일에서 읽은 내용을 가져와서 filecontent 변수에 저장한다. 암호화할 평문 메시지다.

ct = pow(bytes_to_long(filecontent), key.e, key.n)

: bytes_to_long 함수를 사용하여 바이트를 정수로 변환하고, RSA의 암호화 공식 (ct = plaintext^e mod n)을 사용하여 평문 메시지를 암호화한다.

open("ciphertext_message", "wb").write(long_to_bytes(ct))

: 암호문을 바이트로 변환하고 ciphertext_message 파일에 쓰기를 수행한다.

주어진 RSA 개인키로 평문 메시지를 암호화하여 암호문을 생성하고, 그 결과를 ciphertext_message 파일에 저장하는 코드이다.

 

 

xwiBgUBTtaSyUvdrqfgAEduRdnzRbKcwEheMxwIDAQABAoIBAAqaJbojNCwYqykz
n0Fn2sxMsho4PhThPQcX79AGqSxVNxviWK2GXETP7SsnvWGmRXHIRnR6JGOhyHVe
dTDYZxOAOhl85FksVQYVUaygf9Epekja/vSj5OE8NIcAdEBr3aZ6gdLxi+q1a5Kh
1nEmsF6FiYGpsPkN63ovbow/CKt4N7UQJqZEQw380rNA0sOQenmzXRFOpXA8PRFb
G6itGRiP1gB9tpdQnWggQ5n+x8/2k+k3CRW6/xIP9dMAVZh2jVombenLxgnhQCJB
bYaR4I8B0zzYqXqFfeHCMNl+pJmmmFcvs2ZE71fqyjRid6ZDqS4GXtSuRQM0UL7L
UQVBaYECgYEA5BiLN7FjwgOuT4FKxFdzizdq/t5mvRksbmBP/JWk3vxQYeCmMiPQ
xrQUqdHGGxG8iMIwH7dnhNaPa81lrP9fCKyij/caEbe4lmEm+VdM/xZQF+PiCc1f
ziYXphz9wuAc8++kvKxM2EaiDe8F25nsXW+FaxNoXKbJg0zTQLyzKiECgYEA8SLi
hbAwo2l0zal8GMIemzr+APxLw+fmd4aryVAMov8ANkG8KDMwdmvvkn3rL7WaKym5
fakqvXR45/QGPe8niVzx6oaWGSSfijeVan27pG/bzVqyymFHZP9cRhEHW4HN57hO
pXy0kUFqVaxJWCs+thH0LTZoToAepg+sr82FaecCgYEAnJnpQzRsHDEwxO8sqP6t
moBS2mdRPDUDV0iSwgTvrBSpD3oQQM5sMXBD24/lpoIX4gEIz025Ke+xij77trmh
wq/b8GGjqVRsy/opqvjwKRZlqPFRKI+zXjKy+95dryT1W9lFTjAxli9wZYaci/fy
2veNL0Wk2i+8nIPraj/j9mECgYEA0ou6LC7OGTDwKs7sqxV78eBNfoDMis7GPeEZ
x9ocXom3HqjA6HzhuNS/xzIpE2xGo5939c+qoOe81hMNDDDwXZEJLdS75FJE90NX
NDd6iracvi6OZAUSeI47fHZL7UtmhQg5q2c6poXumcWn+NMxm3oLsRqLcteNa0PO
bWZPMksCgYBidblknACvEinDUQB8dvElzROql0ZUMX9hQOsSrg0ju3smun8qujcT
PJQrWctoNw0ZXnQjDkVzaJxog1F3QkKUg6B1Rn2Q0RYuCAeNDn+KqBkTT18Du7yw
+GU/4U6EMw+uL7dNjasD1jjx90ro6RmDDBmGDQuludO0G7h9XQzl+Q==
-----END RSA PRIVATE KEY-----

priv.key 파일이다. 개인 키가 들어있다.

 

 

 

 

948e 162a 845c b91b 25d1 a63b 68d5 15b7
dccc e90a 5ac7 bfd3 8ff0 3e09 55d6 f7aa
9739 5905 0798 eb82 43bc 30f3 769e 324b
b8f9 8b5e bd06 b123 4a8e fbfd 1403 e9bf
5e09 a22e 310f 43c6 deae 1f2a d1f6 a365
3fe1 aec9 f997 ff00 af36 e349 e68f 110f
d706 5f07 e92d 32f7 7dde b7f3 9898 9421
5a17 e570 938b 13f8 0e79 20ad f9b1 96da
f7a3 fc51 1f45 b393 be00 cfd7 b1b7 f9d2
7431 5d91 00e7 326a 4430 9dbf c0ac 2bc7
994e a8b8 4464 55c9 bc64 3b50 9eff 91ee
b46d 056b 18f9 0275 19dd d301 5eb4 1e3c
b9e4 2301 e312 120f 3537 2a2e 9068 318b
d4e8 9458 abc1 e747 5015 556d ca3b 2a05
8dde 66c7 6bbd 5b9a 15f7 0e65 d81c b1b6
ddfc c0c7 abc2 fc86 3d30 b4a2 ce9a ca14

ciphertext_message 파일이다.