KakaoTalk Decrypt
우리가 복호화 해야 되는 파일은 users > {userDir} > chat_data 안에 있는 edb 파일이다
이 데이터베이스에서 카카오톡 메시지를 확인할 수 있다
Fig. 1.과 같이 대화 기록 데이터베이스를 복호화하기 위해서는 key, iv 쌍을 생성해야 한다. pragma와 userId를 512바이트가 될 때까지 반복하여 연접한 후 MD5 해싱을 수행하면 key가 된다. key에 대해 Base64 인코딩 수행 후 MD5 해싱을 수행하면 iv가 된다. 구체적인 알고리즘은 Fig. 2와 같다.
카카오톡 메시지를 복호화 하기 위해 제시한 알고리즘의 key와 id 값을 먼저 생성해야 한다
앞서 pragma는 문제에서 주어졌고 userId 값을 찾아내야 한다
userId는 users 폴더에 있다고 하니 다운받은 users 폴더 위치에 들어가면 login_list.dat 파일을 살펴보자
여기서 로그인한 userId를 획득할 수 있다 (musa@ttl.com)
last_pc_login.dat 파일에서도 획득할 수 있다
- 실제 카카오톡 userId는 이런 식으로 획득할 수 없어요!
import base64
import hashlib
def generate_key_iv(pragma, userId):
key = (pragma + userId).encode('utf-8')
while len(key) < 512:
key += key
key = key[:512]
key = hashlib.md5(key).digest()
iv = hashlib.md5(base64.b64encode(key)).digest()
return key, iv
pragma = 'b2WmF9Q5h7RzN0dT8p1Xj6Lk3VvYeH4zJsA/q9TgErI0aO5yCwLkM2oFb7ZpC=='
userId = 'musa@ttl.com'
key, iv = generate_key_iv(pragma, userId)
print("Key:", key.hex())
print("IV:", iv.hex())
해당 알고리즘은 파이썬으로 작성했다 key 생성법은 pragma+userId를 연접하여 512 바이트가 될 때까지 연접 후 MD5 해싱을 수행하면 key 값이 된다 이 key 값에 대해 Base64 인코딩 후 MD5 해싱을 수행하면 iv가 된다
↑ 코드 실행 결과 ↑
이제 생성한 key와 iv를 가지고 암호화된 카카오톡 메시지를 복호화 하면 된다
encDB 부분이 암호화된 chatLogs_395923568983.edb 파일이다
from Crypto.Cipher import AES
import base64
import hashlib
# 복호화 함수
def decrypt_database(key, iv, encDB):
decDB = b""
i = 0
while i < len(encDB):
cipher = AES.new(key, AES.MODE_CBC, iv)
decrypted_data = cipher.decrypt(encDB[i:i+4096])
decDB += decrypted_data
i += 4096
return decDB
def save_decrypted_database(decDB, output_file):
with open(output_file, "wb") as f:
f.write(decDB)
# 암호화된 파일과 복호화 파일
input_edb_file = "chatLogs_395923568983.edb"
output_db_file = "chatLogs_395923568983.db"
# 암호화된 파일 읽기
with open(input_edb_file, "rb") as f:
encrypted_data = f.read()
# 복호화
decrypted_data = decrypt_database(key, iv, encrypted_data)
# 복호화 파일 저장
save_decrypted_database(decrypted_data, output_db_file)
print("데이터 복호화 성공 : ", output_db_file)
논문에서 제시한 AES 알고리즘을 이용하여 파이썬으로 작성하면 다음과 같고, key와 iv 생성된 코드와 함께 사용하면 된다
암호화된 chatLogs_395923568983.edb 파일을 AES 알고리즘을 사용하여 원본 chatLogs_395923568983.db로 복호화 해주는 알고리즘이다
코드 실행 시 정상적으로 복호화에 성공한다
헥스에디터로 파일을 확인해 보면 SQLite 헤더 값을 확인할 수 있다
알 수 없는 문자열이 나온다면 복호화에 실패한 것이다
DB가 SQLite인걸 확인했기 때문에 DB를 열어 메시지를 확인하기 위해 DB Browser for SQLIte 도구를 설치해야 하는데
난 도구 설치가 귀찮아서 SQLite db를 열 수 있는 사이트를 이용했다
사이트에 복호화된 db를 넣으면 정상적으로 메시지 내용을 확인할 수 있다
메시지에서 TVN7azRrQDBfVDRsa19EM2NyIXB0fQ== 문자열이 접속키인거 같은데 문자열 뒤에 ==는 Base64 인코딩 형태이므로 해당 문자열을 Base64 디코딩 할 수 있다
디코딩 후 MS로 시작하는 접속키를 획득할 수 있다
[ 참고 자료 ]