현대 암호학을 위한 툴

Dreamhack
#Cryptography

1 views

Tool: PyCryptodome

1. 암호학에서의 Python의 사용도

  • 암호학에서는 RSA, Diffie-Hellman 등의 사용도가 높은 알고리즘에서 크기가 큰 수가 등장하는 경우가 빈번하다.
    • RSA 공개키 암호의 경우 상황에 따르나 평균적으로 220482^{2048}22048에 가까운 수를 사용한다.
    • 그런데 C와 C++와 같은 언어에서는 가장 큰 기본 정수 자료형의 범위가 최대 2642^{64}264이므로 이를 표현하는 것이 불가능하다.
    • 외부의 구현체를 사용하여 해결할 수 있지만, 각 정수를 정의하고 연산하는 과정이 상대적으로 번거로운 편이다.
  • 반면, Python에서는 기본 내장 정수 자료형(int)이 상한과 하한 없이 구현되어 있고, 사칙연산 등의 기본 연산에서 별도의 함수를 호출할 필요가 없어 사용이 간편하다.
    • 따라서 많은 비트수를 가진 정수를 다룰 때 Python을 사용하면 정수형 범위에 따른 오버플로우에 대한 걱정 없이 편리하게 연산할 수 있다.
  • 또한 Python은 외부 패키지/라이브러리를 설치하고 이를 불러오는 과정이 편리하다는 큰 특징을 가지고 있다.
    • 이 두 가지 특성 때문에 Python 언어는 암호학 실습 및 연구에 적합하다.
    • 드림핵에서 진행되는 대부분의 암호학 실습은 Python으로 진행될 것임에 유의해주시기 바란다.

2. PyCryptodome 패키지

  • PyCryptodomePyPI에 등록되어 있는 암호학 전용 패키지다.

  • 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과 거의 유사하여 쉽게 사용할 수 있다.
  • 존재하는 기능 중 주로 사용하게 될 기능은 ZmodGF, 행렬과 벡터 클래스, 행렬 관련 함수들이다.

    image.png
  • 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 링크에 접속한다.

    image.png
  • 강의 작성 당시 최신 버전인 SageMath 10.2가 업로드되어 있다.

    • 두 .dmg 파일 중에서 해당하는 Mac 아키텍쳐에 해당하는 .dmg 파일을 다운로드받는다.
    image.png
  • .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 * 를 이용해 사용하는 것 또한 가능하다.
  • 다음의 유의할 점이 있다.

    • Python에 설치된 패키지와 SageMath에 설치된 패키지는 개별적이다.
    • SageMath에 패키지 설치는 sage --pip install *을 이용해 진행할 수 있다.
    • 예를 들어 PyCryptodome은 sage --pip3 install pycryptodome을 이용해 설치한다.
  • Python에서 ^ 연산자는 xor 연산을 의미하지만, SageMath 셸에서는 거듭제곱, 즉 *과 같은 기능을 가진다.

    • 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에서 불러올 수 있으며, 해당 강의에서는 주로 processremote 기능만을 사용하게 될 것이다.

2. tqdm 패키지

  • 암호학을 포함한 해킹의 대부분의 분야는 가끔 많은 양의 연산이 필요한 경우가 존재한다.

    • 그럴 경우는 진행도를 진행표시줄로 확인할 수 있고, 완료까지 걸리는 예상 시간도 표시해주는 tqdm 패키지를 사용하면 적합하다.
  • Python의 경우 pip3 install tqdm, SageMath의 경우 sage --pip install tqdm로 설치 가능하다.

  • 주로 from tqdm import tqdm, trange를 통해 tqdmtrange를 사용할 것이다.

    • 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. 마치며

  • 현대 암호학을 다룰 때 빼먹을 수 없는 여러 툴을 설치하게 되신 것을 축하드립니다.
    • 이 툴들의 여러 기능을 사용해보고 익숙해져보세요

Loading comments...