Cryptography

    Dreamhack - d (writeup)

    Dreamhack - d (writeup)

    이번에는 드림의 "d"문제를 풀어 볼 것이다. 일단 아래 문제코드를 살펴보자. from Crypto.Util.number import * from flag import flag p = bytes_to_long(flag) assert isPrime(p) q = getPrime(256) d = pow(65537, -1, (p - 1) * (q - 1)) print(d) # 22800184635336356769510601710348610828272762269559262549105379768650621669527077640437441133467920490241918976205665073 위 파이썬 코드의 내용을 정리하면 아래와 같다. d = 228001846353363567695106017103486108282..

    Dreamhack - Robot Only(writeup)

    Dreamhack - Robot Only(writeup)

    이번에는 드림핵의 robot only문제를 한번 풀이해보겠다. 아래의 문제 코드이다. #!/usr/bin/env python3 import random import signal import sys MENU_GAMBLE = 1 MENU_VERIFY = 2 MENU_FLAG = 3 MENU_LEAVE = 4 money = 500 verified = False def show_menu(): print('=======================================') print('1. go to gamble') print('2. verify you\'re a robot') print('3. buy flag') print('4. leave') def get_randn(): return random.ra..

    Dreamhack - ICM2022(writeup)

    Dreamhack - ICM2022(writeup)

    이번에는 드림핵의 암호 문제인 ICM2022를 풀어볼 것이다. 문제코드는 아래와 같다. import random from fractions import Fraction def enc(p, n, key1, key2): q = (Fraction(p, n+1)*key1**(n+1)) - (Fraction(p, n+1)*key2**(n+1)) print("[OK] plain is encrypted : ", q) return q def dec(q): # cencored def key_make(): n, key1, key2 = 0, 1, 0 while key2 < key1: n = random.randrange(1, 10) #3 key1 = random.randrange(1, 100) # key2 = random...

    Dreamhack - darimchal_001(writeup)

    Dreamhack - darimchal_001(writeup)

    오늘은 드림핵의 워게임, darimchal_001 문제를 풀어볼 것이다. 일단 이 문제의 c코드의 main 을 확인해 보겠다. int main (int argc, char *argv[]) { if (argc != 2) { __print_sw_title(argv[0]); return ERRO; } if ( __is_valid_pwd(argv[1]) ) { __create_tag(argv[0]); printf("\n +-+ 무, 무슨... 말도 안돼!! 어떻게 복호화 키를...?? +-+ \n"); } else { printf("\n 너의 파일들은 이제 요단강을 건너다가 저승사자와 하이파이브를 하게되었다! 으하하하하!\n"); // ㅋㅋㅋㅋㅋㅋ } return OK; } 위 main 함수에서는 하나의 인자를..

    Cryptography(암호학) - Hash(해시)

    Cryptography(암호학) - Hash(해시)

    이번에는 Hash에 대해 알아볼 것이다. 해시 함수(Hash function)는 임의의 크기의 데이터를 받아서 고정된 크기의 데이터를 반환하는 함수이다. 이때 나온 값을 해시 값이라고 한다. 암호학적 해시 함수는 해시 함수 중 특정 성질을 만족하는 함수이다. 암호학적 해시 함수는 다음 성질을 만족한다. 1. 제 1 역상 저항성 2. 제 2 약상 저항성 3. 충돌 저항성 제1 역상 저항성은 해시 값이 y일때 y를 이용하여 평문 x를 찾는것은 어렵다는 성질이고, 제2 역상 저항성은 x를 해시화 했을때, 해시 값이 같은 x'를 찾기 어렵다는 성질이다. 마지막 충돌 저항성은 충돌(해시 값이 같은)이 일어나는 x, x'는 찾기 어렵다는 성질이다. 위 성질들은 해시를 많이 접해보면서 쉽게 이해할 수 있을 것이다. ..

    Cryptography(암호학) - RSA(공개키 암호)

    Cryptography(암호학) - RSA(공개키 암호)

    RSA 암호 알고리즘은 대표적인 공개키 암호 알고리즘이다.(공개키 알고리즘 : https://hackhijack64.tistory.com/60) RSA 암호 알고리즘은 아주 큰 두 소수의 곱으로 이루어진 합성수 인수분해 문제의 어려움을 이용한 암호이다. 따라서 RSA로 암호화할 때는 합성수의 소인수분해가 어려워지도록 각 인자를 적절히 설정 해야한다. RSA는 공개키와 개인키로 이루어져 있다. 공개키는 모두에게 공개되어 있고, 암호화에 사용된다. 개인키는 아무한테도 노출되면 안되고, 암호를 복호화 할때 사용된다. 먼저 RSA를 이해하려면 오일러 정리를 알아야한다. 오일러 정리는 n과 서로소인 양의 정수 m과 다음 식이 성립된다는 것이다. P(n)은 오일러 파이 함수라고 하며, n이하의 양의 정수중 서로소인..

    Cryptography(암호학) - DES(Data Encryption Standard)

    Cryptography(암호학) - DES(Data Encryption Standard)

    오늘은 대칭키 암호 중 하나인 DES 암호에 대해 알아볼 것이다.(드림핵 참고) DES는 NSA에서 IBM의 루시퍼 알고리즘을 개량하여 만든 것이다. DES는 56비트의 키를 이용하고, 8바이트 블록암호이다. 현대에는 DES 공격기법이 많이 연구되어 특별한 경우 아니면 잘 사용하지 않는다. DES는 IP(초기순열), FP(최종순열), Feistel 구조, 각 라운드에 사용되는 48비트의 키를 생성하는 키 생성 함수로 이루어져 있다. 1. DES의 원리 DES는 순열, 치환을 사용한다. DES는 순열과 치환을 여러 라운드에 거쳐 진행하는 곱 암호(Product Cipher)의 일종이다. DES 전체의 라운드 함수를 적용하는 과정은 Feistel 구조를 가진다. Feistel 구조는 다음과 같은 과정으로 진..

    Cryptography(암호학) - AES(블록암호)

    Cryptography(암호학) - AES(블록암호)

    오늘은 대칭키 암호 시스템에서 블록 암호인 AES를 알아볼 것이다.(드림핵 참고) AES는 연산 능력의 향상에 의해 다른 블록 암호인 DES가 안전해지지 않자, 새롭게 표준 된 암호이다. AES는 지금까지도 치명적인 취약점은 발견되지 않았다고 한다. 1. SPN AES는 SPN이라는 암호 구조를 가지고 있다. SPN은 곱 암호의 일종인데, S-box를 사용하는 치환, P-box를 사용하는 순열을 여러 과정에 걸쳐 반복한다. 그냥 치환, 순열(배열), 치환, 순열을 반복하는 구조이다. SPN은 Feistel과 달리 입력 전체에 라운드 함수를 적용하기 때문에, 같은 라운드를 사용할 경우 더욱 암호학적으로 안정성을 갖게 된다. 2. AES의 구조 AES는 기본적으로 라운드마다 128비트를 암호화하는 블록 암호..