Tool: PyCryptodome
1. 암호학에서의 Python의 사용도
- 암호학에서는 RSA, Diffie-Hellman 등의 사용도가 높은 알고리즘에서 크기가 큰 수가 등장하는 경우가 빈번하다.
- RSA 공개키 암호의 경우 상황에 따르나 평균적으로 22048에 가까운 수를 사용한다.
- 그런데 C와 C++와 같은 언어에서는 가장 큰 기본 정수 자료형의 범위가 최대 264이므로 이를 표현하는 것이 불가능하다.
- 외부의 구현체를 사용하여 해결할 수 있지만, 각 정수를 정의하고 연산하는 과정이 상대적으로 번거로운 편이다.
- 반면, Python에서는 기본 내장 정수 자료형(
int)이 상한과 하한 없이 구현되어 있고, 사칙연산 등의 기본 연산에서 별도의 함수를 호출할 필요가 없어 사용이 간편하다.- 따라서 많은 비트수를 가진 정수를 다룰 때 Python을 사용하면 정수형 범위에 따른 오버플로우에 대한 걱정 없이 편리하게 연산할 수 있다.
- 또한 Python은 외부 패키지/라이브러리를 설치하고 이를 불러오는 과정이 편리하다는 큰 특징을 가지고 있다.
- 이 두 가지 특성 때문에 Python 언어는 암호학 실습 및 연구에 적합하다.
- 드림핵에서 진행되는 대부분의 암호학 실습은 Python으로 진행될 것임에 유의해주시기 바란다.
2. PyCryptodome 패키지
-
PyCryptodome은 PyPI에 등록되어 있는 암호학 전용 패키지다.
-
AES, DES, RSA와 같은 암호뿐만 아니라 소수 판별과 같은 기능을 가진 수학 함수들이 구현되어 있어 유용하게 사용된다.
-
Python 3이 설치된 환경이라면
pip를 이용해 쉽게 설치할 수 있고, 사용 시에는 용도에 따라from Crypto.Cipher import AES,from Crypto.Util.number import *과 같이 불러오는 방법이 다르다. -
아래는 강의 작성 당시 최신 버전인 PyCryptodome 3.19.0을 설치하는 과정이다.
$ pip3 install pycryptodome Collecting pycryptodome Downloading pycryptodome-3.19.0-cp35-abi3-macosx_10_9_universal2.whl.metadata (3.4 kB) Downloading pycryptodome-3.19.0-cp35-abi3-macosx_10_9_universal2.whl (2.4 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.4/2.4 MB 22.8 MB/s eta 0:00:00 Installing collected packages: pycryptodome Successfully installed pycryptodome-3.19.0 -
설치가 완료되면 임포트 후
isPrime함수를 이용해 65537이 소수인지의 여부를 확인해볼 수 있다.Python 3.11.1 (v3.11.1:a7a450f84a, Dec 6 2022, 15:24:06) [Clang 13.0.0 (clang-1300.0.29.30)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> from Crypto.Util.number import * >>> isPrime(65537) True
Tool: SageMath
1. SageMath란
-
SageMath, 또는 Sage는 CAS(Computer algebra system)라고도 불리는 컴퓨터용 수학 소프트웨어 중 하나다.
- 다양한 기능이 구현되어 있고, Python 위에서 동작하도록 구현된 소프트웨어이기 때문에 Python에서 사용 가능한 외부 패키지 또한 사용할 수 있다는 장점이 있다.
- 또한 자체적인 문법이 Python과 거의 유사하여 쉽게 사용할 수 있다.
-
존재하는 기능 중 주로 사용하게 될 기능은 Zmod와 GF, 행렬과 벡터 클래스, 행렬 관련 함수들이다.

-
Linux 또는 Windows의 WSL 환경에 설치하는 과정과 MacOS에 설치하는 과정을 설명한다.
2. SageMath 설치 (Linux, Windows)
-
예전에는 .exe 파일을 통해 Windows용으로 SageMath 설치가 지원됐지만, 현재는 중단되고 공식 문서에서도 WSL(Windows Subsystem for Linux) 설치 후 Linux 환경에서 SageMath를 설치하는 것을 권장하고 있다. (참고: Windows에서 SageMath 설치)
-
Linux 환경이 구축되었다면, Conda를 사용해 SageMath를 설치할 수 있다. Conda를 이용한 Sagemath 설치 과정을 진행한다.
-
먼저 셸에서 다음 명령어를 실행해 Mambaforge라는 Conda 계열 패키지 매니저를 설치한다.
curl -L -O https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-$(uname)-$(uname -m).sh sh Mambaforge-$(uname)-$(uname -m).sh -
이용약관에 동의한 후 설치가 완료되면 다음과 같은 메시지와 함께 설치가 완료된다.
... ==> For changes to take effect, close and re-open your current shell. <== Thank you for installing Mambaforge! -
python3 --version을 이용해 설치되어 있는 Python의 버전을 확인한 후, 해당하는 버전을 포함하여 다음 명령어를 입력한다. 예시에서는 3.10.13을 사용하였다.conda create -n sage sage python=3.10.13 -
다음과 같은 메시지와 함께 SageMath 설치를 완료했다.
... Preparing transaction: done Verifying transaction: done Executing transaction: done # # To activate this environment, use # # $ conda activate sage # # To deactivate an active environment, use # # $ conda deactivate -
conda activate sage를 실행해서 SageMath 환경을 활성화해주면, 이후sage를 실행하여 SageMath 셸을 실행할 수 있다.(base) $ conda activate sage (sage) $ sage ┌────────────────────────────────────────────────────────────────────┐ │ SageMath version 10.2, Release Date: 2023-12-03 │ │ Using Python 3.10.13. Type "help()" for help. │ └────────────────────────────────────────────────────────────────────┘ sage: -
강의 작성 당시 시점으로 최신 버전인 10.2 버전을 설치할 수 있었다.
-
사용하는 셸(bash, zsh 등)에 따라
~/.bashrc파일이나~/.zshrc와 같은 파일에conda activate sage를 추가해주면 셸 실행 시마다conda activate sage를 입력하지 않아도 된다. -
또한
conda config --set changeps1 False를 입력하면 Conda 설치로 인해 자신이 현재 어떤 환경에서 사용 중인지 알려주는 커맨드 줄 맨 앞의(base)나(sage)를 제거할 수 있다.$ sage ┌────────────────────────────────────────────────────────────────────┐ │ SageMath version 10.2, Release Date: 2023-12-03 │ │ Using Python 3.10.13. Type "help()" for help. │ └────────────────────────────────────────────────────────────────────┘ sage:
3. SageMath 설치 (MacOS)
-
MacOS에서는 Conda를 이용한 설치와 .dmg 파일을 사용한 설치 모두 가능하다.
- .dmg 파일을 사용하여 설치를 진행해본다.
-
SageMath MacOS의 GitHub 링크에 접속한다.

-
강의 작성 당시 최신 버전인 SageMath 10.2가 업로드되어 있다.
- 두 .dmg 파일 중에서 해당하는 Mac 아키텍쳐에 해당하는 .dmg 파일을 다운로드받는다.

-
.pkg 파일을 실행시켜 설치를 완료하면 원하는 셸에서
sage를 입력해 SageMath 셸을 사용할 수 있다.┌────────────────────────────────────────────────────────────────────┐ │ SageMath version 10.2, Release Date: 2023-12-03 │ │ Using Python 3.11.1. Type "help()" for help. │ └────────────────────────────────────────────────────────────────────┘ sage:
4. SageMath 활용
-
SageMath는 Python과 같이 셸에서도 사용할 수 있고,
sage *.sage명령어를 통해 작성한 코드를 실행시킬 수 있다.- Conda를 이용하여 설치하였을 경우에는 Python에서
from sage.all import *를 이용해 사용하는 것 또한 가능하다.
- Conda를 이용하여 설치하였을 경우에는 Python에서
-
다음의 유의할 점이 있다.
- Python에 설치된 패키지와 SageMath에 설치된 패키지는 개별적이다.
- SageMath에 패키지 설치는
sage --pip install *을 이용해 진행할 수 있다. - 예를 들어 PyCryptodome은
sage --pip3 install pycryptodome을 이용해 설치한다.
-
Python에서
^연산자는 xor 연산을 의미하지만, SageMath 셸에서는 거듭제곱, 즉*과 같은 기능을 가진다.- XOR 연산은
^^을 이용한다.
- XOR 연산은
-
SageMath 셸에서 하나의 테스트를 해보고 마무리한다.
GF(65537)(12345678)^65536을 입력하였을 때, 1이 잘 나오는지 확인한다.
$ sage ┌────────────────────────────────────────────────────────────────────┐ │ SageMath version 10.1, Release Date: 2023-08-20 │ │ Using Python 3.11.1. Type "help()" for help. │ └────────────────────────────────────────────────────────────────────┘ sage: GF(65537)(12345678)^65536 1
pwntools 와 tqdm
1. pwntools 패키지
- pwntools 패키지는 바이너리 분석 뿐만 아니라 소켓 통신을 편하게 해주는 여러 기능을 가지고 있어, 시스템 해킹을 비롯한 다양한 분야에서 사용된다. pwntools 패키지를 암호학 강의에서도 사용하겠다.
- Python의 경우
pip3 install pwntools를 사용, SageMath의 경우sage --pip install pwntools로 설치 가능하다.from pwn import *를 통해 Python이나 SageMath에서 불러올 수 있으며, 해당 강의에서는 주로process와remote기능만을 사용하게 될 것이다.
2. tqdm 패키지
-
암호학을 포함한 해킹의 대부분의 분야는 가끔 많은 양의 연산이 필요한 경우가 존재한다.
- 그럴 경우는 진행도를 진행표시줄로 확인할 수 있고, 완료까지 걸리는 예상 시간도 표시해주는 tqdm 패키지를 사용하면 적합하다.
-
Python의 경우
pip3 install tqdm, SageMath의 경우sage --pip install tqdm로 설치 가능하다. -
주로
from tqdm import tqdm, trange를 통해tqdm과trange를 사용할 것이다.for val in arr:과 같이arr의 모든 원소에 대하여 연산을 진행할 경우,for val in tqdm(arr):을 사용하면 진행도를 확인할 수 있다.- 또한
iter과 같은 iterator 오브젝트를 순회하는 경우, 즉 전체 길이는 정의되지 않았지만__next__를 통해 다음 원소만이 정의된 경우는tqdm(iterator, total=100)과 같이 total 인자를 사용해 최대 길이를 지정할 수 있다.
-
for i in trange(n):는for i in tqdm(range(n)):과 동일한 기능을 가진다.- Python 셸에서 한 예시를 확인한 후 넘어가겠다.
>>> from tqdm import tqdm, trange >>> val = 0 >>> for i in trange(10000000): ... val += 3 ... 100%|██████████████████████████| 10000000/10000000 [00:01<00:00, 9315038.92it/s] >>> val 30000000
마치며
1. 마치며
- 현대 암호학을 다룰 때 빼먹을 수 없는 여러 툴을 설치하게 되신 것을 축하드립니다.
- 이 툴들의 여러 기능을 사용해보고 익숙해져보세요