SageMath 사용법 with Docker
SageMath 는 대수학, 조합론, 그래프 이론, 수치해석, 수론, 미적분학, 통계학 등 수학의 다양한 분야의 기능을 갖춘 컴퓨터 대수학 시스템 프로그램이다. 학창 시절 이후로는 사칙 연산 수준의 수학 밖에 쓰지 않았지만 드림핵(Dreamhack)에서 제공하는 암호학 관련 CTF를 풀고 관련 자료를 검색하다보니 SageMath를 사용할 필요성을 느끼게 되었다.
SageMath를 설치하고 사용하는 방법은 다양하지만 이 글에서는 Kali Linux 환경에서 Docker 를 이용해 SageMath 컨테이너를 생성, 사용하는 방법에 대해 설명하겠다.
참고로 SageMathCell 사이트에서 온라인으로 SageMath 스크립트를 실행하는 서비스를 제공하나, 파이썬 모듈이 포함된 스크립트는 실행 못하는 것 같다. SageMath 스크립트만 필요한 독자라면 이 서비스를 이용해도 괜찮을 것 같다.

SageMath 도커 생성 & 사용법
테스트에 사용한 Kali Linux 환경은 다음과 같다.
Distributor ID: Kali
Description: Kali GNU/Linux Rolling
Release: 2025.1
Codename: kali-rolling
docker 버전은 다음과 같다.
$ docker --version
Docker version 26.1.5+dfsg1, build a72d7cd
SageMath 가 잘 작동함을 확인하기 위해 다음과 같은 테스트 스크립트를 사용했다.
# ctf_test.sage
print("="*50)
print("SageMath CTF Environment Check")
print("="*50)
# 1. RSA 관련 연산 (Modular Inverse & Chinese Remainder Theorem)
print("[1] RSA / Number Theory Test")
p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF
q = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF43
n = p * q
e = 65537
phi = (p-1) * (q-1)
# Sage의 inverse_mod 함수 사용
d = inverse_mod(e, phi)
print(f"Computed private key d: {hex(d)[:20]}...")
# 2. 타원곡선 (Elliptic Curve) 연산
print("\n[2] Elliptic Curve Test")
# NIST P-256 곡선 예시
E = EllipticCurve(GF(p), [0, 0, 0, -3, 0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b])
print(f"Curve: {E}")
G = E.gens()[0]
P = 1337 * G
Q = 7331 * G
R = P + Q
print(f"Point Addition Result: {R.xy()[0]}") # X 좌표 출력
# 3. 격자 기반 공격 (LLL Algorithm) - CTF 필수 코스
print("\n[3] Lattice Reduction (LLL) Test")
# 간단한 격자 생성
matrix_data = [
[1, 0, 0, 4931],
[0, 1, 0, 3940],
[0, 0, 1, 9210],
[0, 0, 0, 19230]
]
L = Matrix(ZZ, matrix_data)
L_reduced = L.LLL()
print("LLL Reduced Matrix (first row):")
print(L_reduced[0])
print("\n" + "="*50)
print("SageMath is working perfectly!")
print("="*50)
SageMath 컨테이너는 Docker Hub 에 등록되어 있기 때문에 우리가 따로 컨테이너를 만들 필요는 없다. Sage 9.2.beta0 이후 버전부터는 python3 버전이 포함되어 있기 때문에 추가로 설치할 필요도 없다. 단, 컨테이너 내에서 python 명령어를 직접 실행할 순 없다. 사용하려면 sage -python 을 통해 실행해야 한다.
아래 명령어는 현재 경로를 컨테이너의 /home/sage/scripts 경로에 마운팅하고, 컨테이너를 생성하여 sage 셸로 접속한다. 볼륨 마운팅을 하는 이유는 테스트 중 스크립트를 쉽게 수정하기 위함이다. /bin/bash 가 아닌 /bin/sage -sh 로 실행하는 이유는 sage 명령어가 필요로 하는 환경 변수들을 이용하기 위해 sage 전용 셸을 실행하는 /bin/sage -sh 명령어로 실행한다.
sudo docker run -it -v $(pwd):/home/sage/scripts sagemath/sagemath:latest /bin/sage -sh

마운팅된 스크립트는 /home/sage/scripts/ 경로에 존재하니 sage 명령어로 스크립트를 실행한다.
sage /home/sage/scripts/ctf_test.sage

만약 실행할 sage 스크립트에 pycryptodome, pwntools 와 같은 파이썬 모듈이 필요하다면 sage 명령어에 -pip 옵션을 주어 필요한 모듈을 설치해야 한다.
sage -pip install pycryptodome pwntools

스크립트 실행에 필요한 추가 파이썬 모듈이 없고, 컨테이너에 들어와서 sage 명령어를 실행하는 것이 번거롭다면 다음 명령어로 호스트에서 즉시 실행할 수도 있다. ctf_test.sage 대신 실행할 스크립트 이름을 지정하면 된다.
sudo docker run --rm -v $(pwd):/home/sage/scripts sagemath/sagemath:latest sage scripts/ctf_test.sage