본문 바로가기
개발 IT

DRM과 AES-128 암호학

by 에마텐 2026. 3. 31.

16바이트의 미학: 리디북스 DRM과 AES 암호학의 심층 분석

주제: 리디북스 복호화 로직 역추적을 통한 현대 대칭키 암호 시스템의 이해


1. 발단: "이 파일은 왜 잠겨 있는가?"

컴퓨터 공학을 전공하며 재미있는 순간 중 하나는 일상적으로 사용하던 프로그램의 역공학이다. 리디북스 서재 폴더에는 수백 개의 폴더가 있고, 그 안에는 확장자가 없거나 의미 없는 바이너리로 가득 찬 파일들이 있다.

리디북스는 전자책 사업이라는 특성 상 파일을 DRM으로 암호화해서 저장한다. 당연하지만 유저 1명이 책을 구매한 후 리디북스에서만 열람할 수 있게하고, 타 유저들에게 공유할 수 없게 만들기 위함이다.

리디북스 유저 중 하나로서 수백 개의 책을 구매한 소비자의 입장에서는 이 파일들이 영원하지 않을 거란 걱정을 하게 된다. 소프트웨어와 DRM이 걸린 상품을 판매하다 도산하면 구매 물품이 증발하는 사례도 흔치 않게 들려온다. 그런고로 CS 학생의 취미활동의 일환으로 리디북스의 암호화 알고리즘을 분석하게 되었다.

리디북스 네이티브 앱은 electron으로 프로그램되어 있어 역공학(리버스 엔지니어링)이 수월하다. asar파일을 언패킹하기만 하면 소스코드를 전부 볼 수 있기 때문이다. (당연하지만 주석따위 없어 분석은 힘들다.)

그렇게 소스코드를 들여다 봐서 알 수 있는 암호화의 핵심은 device_id라는 변수였다.

첫 번째 호기심: "내 기기 ID가 왜 암호화의 핵심일까?"

리디북스는 사용자의 기기를 식별하기 위해 36자리의 UUID(device_id)를 사용한다다. 그런데 암호 알고리즘인 AES-128은 정확히 16바이트(128비트)의 키를 요구한다.

  • 코드의 처리: device_id.encode("utf-8")[:16]
  • 분석: 서버는 사용자의 기기 ID를 기반으로 암호화 키를 생성한다. 36자 중 앞의 16자만 잘라서 사용한다는 점은, 보안의 핵심이 '전체 문자열'보다는 '정해진 길이의 유니크한 시드(Seed)'에 있음을 시사한다.

2. 금고 속의 금고, .dat 파일의 정체

기기 ID를 알았다고 해서 바로 책을 풀 수 있는 것은 아니다. 코드에는 .dat 파일을 먼저 복호화하는 과정이 있다.

두 번째 호기심: "왜 한 번에 풀지 않고 .dat을 거칠까?"

여기서 Key Wrapping(키 래핑)이라는 개념을 배웠다.

  1. 콘텐츠(책): 1GB가 넘는 파일일 수 있다. 이를 사용자마다 다르게 암호화하면 서버는 과부하로 터질 것입니다. 따라서 책은 공통의 세션 키(CEK)로 암호화된다.
  2. 보안: 이 세션 키를 그냥 보내면 보안이 뚫린다. 그래서 서버는 사용자의 device_id를 키로 사용하여 이 세션 키만 따로 암호화해서 보낸다.
  3. 결과물: .dat 파일. 일종의 '디지털 봉투'로 기능한다.

구체적인 바이트 분석 (Offset)

금고를 열기 위해선 정확한 위치를 알아야 한다. 리디북스의 복호화 로직은 다음과 같은 정교한 오프셋을 사용한다.

  • .dat 파일의 헤더: 맨 앞 16바이트IV(Initial Vector)다.
  • 추출된 세션 키의 위치:
    • 일반 도서(EPUB/PDF): 복호화된 평문에서 ? : ? 바이트 구간. (ASCII 16자)
    • 만화/이미지(ZIP): 복호화된 바이너리에서 ? : ? 바이트 구간.

3. 심화: AES 암호화의 수학적 원리

키를 구했으니 이제 실제 암호화 알고리즘인 AES대해 알아보자.

세 번째 호기심: "AES는 RSA와 무엇이 다른가?"

학부 수업에서 배운 RSA는 소인수분해를 이용하지만, AES는 Substitution-Permutation Network(SPN) 구조를 가진다.

  • RSA: 공개키 방식. 거대 소수 연산이 필요해 대용량 데이터에 쓰기엔 너무 무거움.
  • AES: 대칭키 방식. 비트 단위 연산 위주라 하드웨어 가속(AES-NI)을 받으면 매우 빠르게 작동함.

3.1. 4단계의 복호화 (Round Functions)

  1. SubBytes (치환): 입력 바이트를 S-Box 테이블에서 찾아 다른 값으로 바꾼다. (예: 1fc8). 이는 비선형성을 부여해 수학적 추측을 불가능하게 만든다.
  2. ShiftRows (전치): 행렬의 각 행을 옆으로 밀어버린다. 데이터의 위치를 섞어 확산(Diffusion)을 일으킨다.
  3. MixColumns (열 혼합): 열 단위로 수학적 연산을 수행해 한 바이트의 변화가 열 전체로 퍼지게 한다.
  4. AddRoundKey: 마지막으로 암호화 키와 XOR 연산을 하여 보안을 완성한다.

3.2. 8비트 활용: 갈로아 필드 (Galois Field)

AES 내부의 MixColumns 단계에서는 일반적인 곱셈을 쓰지 않는다.

  • 이유: 일반 곱셈은 결과가 255(8비트)를 넘어가 비트가 손실됨.
  • 해결: GF(2^8)라는 특수 수학 체계를 사용하여 연산 결과가 항상 0~255 내에 머물게 함.
  • 수식: A(x) * B(x) mod m(x), 여기서 m(x)는 기약 다항식.

이 수학적 '닫힌 계' 덕분에 AES는 정보의 유실 없이 완벽하게 복호화가 가능해진다.


4. 실전: CBC 모드와 체이닝 효과

복호화 키(CEK)를 손에 넣었어도, 파일 전체를 한꺼번에 풀 순 없다. 데이터는 128비트 단위로 쪼개져 있기 때문이다.

네 번째 호기심: "똑같은 'A'라는 글자가 반복되면 암호문도 반복될까?"

단순한 ECB 모드라면 그렇겠지만, 리디북스는 CBC(Cipher Block Chaining) 모드를 사용한다.

  1. Chain Effect: 현재 블록을 암호화하기 전에 이전 블록의 암호문을 가져와 XOR 연산을 한다.
  2. 효과: 첫 블록이 조금만 바뀌어도 뒤의 모든 암호문이 도미노처럼 바뀐다. 이를 (Avalanche Effect)라고 한다.
  3. 복호화: 반대로 복호화할 때는 현재 블록을 풀고 이전 암호문을 XOR하면 평문이 나온다. (a XOR b == c; c XOR b == a 양방향)

5. 고찰: 보안의 미래와 AI의 역할

리디북스가 Electron 앱을 선택했다는 점은 양날의 검이다. JavaScript로 되어 있어 분석이 쉽지만, 기업들은 이를 막기 위해 난독화(Obfuscation)Native Addon(C++/Rust)을 사용한다.

과거에는 사람이 소스코드를 며칠씩 분석해야 했지만, 이제는 AI(LLM)에게 난독화된 로직을 주면 암호학적 특징을 파악해 복호화 코드를 생성해 준다.

  • 공격 측: AI로 분석 비용이 낮아짐.
  • 방어 측: 하드웨어 보안 칩(TEE)이나 더 고도화된 화이트박스 암호화 도입.

결국 보안은 "공격자가 들이는 비용을 방어 가치보다 높게 유지하는 싸움"임을 이번 탐구를 통해 체감할 수 있었다.

6. 마치며

사실 이 복호화 과정은 2022년에 이미 시도한 사항이었다. 다만 주석 없는 자바스크립트 코드 - 당시에는 자바스크립트에 대한 이해도도 낮았다 - 를 방학 내내 쳐다보았지만 암호화에 사용하는 모듈 정도만 발견하고 정확한 원리는 알 수 없어 결국 포기하고 말았다. 이후에 깃허브에 능력자들이 이미 복호화 코드를 만들어 둔 걸 보고 허탈해 하며 끝났던 기억만 남았다.

그리고 얼마 전 DRM 알고리즘이 약간 변경된 걸 발견하여 깃허브를 뒤지다 pdf와 epub만이 현재 복호화 가능하다는 걸 발견했다. 과거에는 이미지(만화)파일도 복호화가 가능했기에, 해결을 위해 codex에 과거 버전의 코드와 현재 버전의 코드를 비교 분석시켰다. 결과는 토큰을 많이 먹긴 했지만 놀랍게도 간단히 구현해냈다.

추가적으로 device_id를 숨기게끔 바뀐 리디북스의 api를 우회하기 위해 로컬 파일에서 device_code를 찾게 시키니 난독화된 파일들을 뒤져 직접 device_id를 찾아내는걸 보고 무력감과 허탈함을 느낄 수 밖에 없었다. 클로드가 치명적인 보안 이슈 수십개를 단 며칠 만에 발견했다는 소식이 과언이 아니라는 점을 알 수 있었다. 아무래도 탈출해야 될 듯... 그래도 암호화 알고리즘을 수학적으로 분석하며 이정도 알고리즘을 만들려면 '아직' 인간의 영역이 남아있다는 걸 느끼긴 했다. 물론 이 수학적 배경도 AI 덕분에 배웠지만...

본문에선 정확한 비트값은 생략했다.
알고리즘을 자세히 보고 싶으면 https://github.com/minhyungk/ri-di-ddrm

리디북스 DRM 탐구를 통해 배운 것:

  1. 계층화: 보안은 한 겹이 아니라 여러 겹(KEK -> CEK)으로 쌓아야 안전하다.
  2. 표준화: 독자적인 암호 알고리즘보다 검증된 AES 표준을 쓰는 것이 효율적이다.
  3. 효율성: 하드웨어 가속과 수학적 필드(Galois Field)의 결합이 현대 보안의 기초다.