** 드림핵 cryptography 로드맵을 기반으로 작성하였음
암호학이란?
- 암호학은 정보를 보호하기 위한 언어학적 및 수학적 방법론을 다루는 학문
- 현대에는 컴퓨터에 대한 의존도가 높아지면서 네트워크를 통해 민감한 정보가 빈번하게 오가게 되었고, 자연스레 컴퓨터 환경에서 암호학은 매우 중요한 역할을 담당하게 됨
- 메신저를 개발할 때는 메세지를 도청 및 감청으로부터 보호해야하며, 사용자의 비밀번호를 보관할 때는 해킹으로부터 안전하도록 암호화해서 저장해야 함
- 실제 상용 프로그램에 쓰이는 암호 알고리즘의 특징을 이해하고, 안전한 서비스를 개발하기 위해 어떤 암호 기술을 사용해야 하는지 이해해보자.
- 암호학은 정수론, 대수학, 확률론 등 다양한 수학 이론에 기반하므로 자세한 이해를 위해서는 대학 수준의 수학 지식이 필요할 수 있음
- 암호학(Cryptography)은 좁은 의미에서 제삼자로부터 정보를 보호하는 방법에 대한 연구를 말함
- 핵심이 되는 연구 주제는 키 생성(Key generation), 암호화(Encryption), 그리고 복호화(Decryption)
- 키 생성은 암호화 및 복호화에 사용할 키를 만드는 과정이고, 암호화는 키를 이용해 평문(Plaintext)을 암호문(Ciphertext)으로 변환하는 과정
- 송신자가 암호문을 전송하면 수신자는 키를 이용해 암호문을 평문으로 복호화
- 암호 시스템(Cryptosystem) : 암호화와 복호화로 정보가 전달되는 체계
Tool : PyCryptodome
암호학에서 Python의 사용도?
- 암호학에서는 RSA, Diffie-Hellman 등의 사용도가 높은 알고리즘에서 크기가 큰 수가 등장하는 경우가 빈번함
- RSA 공개키 암호의 경우 상황에 따르나 평균적으로 22048에 가까운 수를 사용
- BUT C와 C++와 같은 언어에서는 가장 큰 기본 정수 자료형의 범위가 최대 264이므로 이를 표현하는 것이 불가능
- 외부의 구현체를 사용하여 해결할 수 있지만, 각 정수를 정의하고 연산하는 과정이 상대적으로 번거로운 편
- 반면, Python에서는 기본 내장 정수 자료형(int)이 상한과 하한 없이 구현되어 있고, 사칙연산 등의 기본 연산에서 별도의 함수를 호출할 필요가 없어 사용이 간편
- 따라서 많은 비트수를 가진 정수를 다룰 때 Python을 사용하면 정수형 범위에 따른 오버플로우에 대한 걱정 없이 편리하게 연산할 수 있다!
- 또한 Python은 외부 패키지/라이브러리를 설치하고 이를 불러오는 과정이 편리하다는 큰 특징
- 위 두 가지 특성 때문에 Python 언어는 암호학 실습 및 연구에 적합하다.
PyCryptodome 패키지
- PyCryptodome은 PyPI에 등록되어 있는 암호학 전용 패키지
- AES, DES, RSA와 같은 암호뿐만 아니라 소수 판별과 같은 기능을 가진 수학 함수들이 구현되어 있어 유용하게 사용
- Python 3이 설치된 환경이라면 pip를 이용해 쉽게 설치할 수 있고, 사용 시에는 용도에 따라 from Crypto.Cipher import AES, from Crypto.Util.number import *과 같이 불러오는 방법이 다름
Tool : SageMath
SageMath란?
- SageMath, 또는 Sage는 CAS(Computer algebra system)라고도 불리는 컴퓨터용 수학 소프트웨어 중 하나
- 다양한 기능이 구현되어 있고, Python 위에서 동작하도록 구현된 소프트웨어이기 때문에 Python에서 사용 가능한 외부 패키지 또한 사용할 수 있다는 장점이 있음
- 또한 자체적인 문법이 Python과 거의 유사하여 쉽게 사용할 수 있음
- 존재하는 기능 중 Zmod와 GF, 행렬과 벡터 클래스, 행렬 관련 함수들을 사용해보자.
SageMath 설치 (Linux)
Linux 환경이 구축되었다면, 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
두 번째 명령어를 입력할 때 license 관련 문구가 한무더기 나오면서 --more-- 이 뜨면서 멈출 수 있다.
이는 사실 멈춘 것이 아니라 화면에 출력된 내용이 많아져서 페이지를 나누어 표시하고 있는 것으로, 사실상 터미널이 추가 출력을 보기 위해 사용자의 입력을 기다리고 있는 상태이다.
- Enter 키 : 한 줄씩 내용을 계속해서 출력
- Space 키 : 한 페이지씩 넘기면서 내용을 출력
- q 키 : 출력 중지를 하고 바로 다음 단계로 진행
그래서 당황하지 않고 q키를 눌러주면 바로 넘어갈 수 있다 ㅎㅎ
중간에 이런 화면이 나오는데, 사실 예전에 no가 앞에 있다는 이유로 no를 입력했다가 꽤나 힘들어진 경험이 있다...
(터미널에 자동으로 뜨지 않고 명령어 몇 줄을 입력해야 conda에 진입이 되는..)
혹여나 no를 입력한 사람을 위해... 아래 명령어를 터미널에 입력하면 conda에 진입할 수 있다.
eval "$(/home/유저이름/mambaforge/bin/conda shell.bash hook)"
무튼 제대로 yes를 입력해주고 재부팅하면 터미널을 열었을 때 앞에 (base)가 뜨면서 바로 사용이 가능해진다.
이제 sagemath를 설치해보자.
자신의 python 버전을 확인한 후 아래 명령어를 수정하여 입력하면 끝
conda create -n sage sage python=3.10.14
위 메시지에 나온대로, 해당 환경을 활성화하려면 conda activate sage를 입력한 뒤 sage를 입력하면 진입 가능
Tip) 사용하는 셸(bash,zsh 등)에 따라 ~/.bashrc 파일이나 ~/.zshrc 와 같은 파일에 conda activate sage를 추가해주면 셸 실행 시마다 conda activate sage를 입력하지 않아도 된다.
또한 conda config --set changeps1 False를 입력하면 Conda 설치로 인해 자신이 현재 어떤 환경에서 사용 중인지 알려주는 커맨드 줄 맨 앞의 (base)나 (sage)를 제거할 수 있다.
그런데 난 보여지는 게 더 편하기에 따로 위 방법을 시행하지 않았어서, 입맛대로 수정하면 될 듯 하다.
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이 잘 나오는지 확인해보자.
Tool : pwntools 패키지
- pwntools 패키지는 바이너리 분석 뿐만 아니라 소켓 통신을 편하게 해주는 여러 기능을 가지고 있어, 시스템 해킹을 비롯한 다양한 분야에서 사용됨
- pwntools 패키지를 암호학 강의에서도 사용해보자.
- Python의 경우 pip3 install pwntools를 사용, SageMath의 경우 sage --pip install pwntools로 설치 가능
- from pwn import * 를 통해 Python이나 SageMath에서 불러올 수 있음
Tool : tqdm 패키지
- 암호학을 포함한 해킹의 대부분의 분야는 가끔 많은 양의 연산이 필요한 경우가 존재한다.
- 진행도를 진행표시줄로 확인할 수 있고, 완료까지 걸리는 예상 시간도 표시해주는 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)):과 동일한 기능을 가진다!
'Cryptography' 카테고리의 다른 글
[Crypto] 암호학 기본 개념 및 SSH 이해하기 - 대칭키(AES), 비대칭키(RSA) 알고리즘 (0) | 2024.11.28 |
---|---|
[Crypto] Double DES 문제 풀이 (0) | 2024.08.31 |
[Crypto] 고전 암호와 현대 암호 알아보기 (1) | 2024.08.30 |
[Crypto] 메르센 트위스터의 난수 생성 예측하기 (0) | 2024.08.28 |
[Crypto] 난수 생성기 : 메르센 트위스터 (Mersenne Twister) 알아보기 (0) | 2024.08.25 |