라이브러리 경러롤 찾는다. 여기서 usr까지만 이동한다. 그리고 usr 내에 있는 include 디렉토리로 이동한다. cd /Library/Developer/CommandLineTools/usr/include 여기에 bits 디렉토리를 만든다. sudo mkdir bits bits 디렉토리로 들어가서 vi등을 사용하여 stdc++.h를 만든다. cd bits sudo vi stdc++.h stdc++의 내용은 이러하다 // C++ includes used for precompiling -*- C++ -*- // Copyright (C) 2003-2013 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. Th..
개념 설명 Confusion through Substitution (치환을 통한 혼란) 각 AES 라운드의 첫 번째 단계는 SubBytes이다. 여기에는 상태 행렬의 각 바이트를 가져와서 미리 설정된 16x16짜리 조회 테이블(lookup table)의 다른 바이트로 대체하는 작업이 포함된다. lookup table은 줄여서 "Substitution box(치환 박스)" 또는 "S-box"라고 하며, 처음 볼 때는 당황 할 수도 있다. 그것을 파헤쳐보자. 1945년 미국 수학자 Claude Shannon(클로드 섀넌)은 정보 이론에 관한 획기적인 논문을 발표했다. 해당 논문에서는 보안 암호의 필수 속성으로 "혼란(confusion)"을 인식하였다. "혼란"은 암호문과 키 사이의 관계가 가능한 복잡해야 함..
개념 설명 Round Keys(라운드 키) 지금은 KeyExpansion(키 확장)단계에 대한 자세한 내용은 건너뛰겠다. 요점은 16byte 키를 가져와서 초기 키에서 파생된 "라운드 키"라고 하는 11개의 4x4행렬을 생성하는 것이다. 이러한 "라운드 키 round key"를 통해 AES는 우리가 제공한 단일 키에서 추가 마일리지를 얻을 수 있다. (추가적인 이점이 있다는 듯) 다음 단계인 초기 키 추가 단계(initial key addition)에는 단일(하나의) AddRoundKey단계가 있다. AddRoundKey단계는 간단하다. 현재 상태 배열(state)과 라운드 키를 XOR한다. AddRoundKey는 각 라운드의 마지막 부분에서도 발생한다. AddRoundKey는 단순한 순열이라기보다는 "..
https://cryptohack.org/courses/symmetric/aes2/ CryptoHack – Home A fun, free platform to learn about cryptography through solving challenges and cracking insecure code. Can you reach the top of the leaderboard? cryptohack.org 너무 길어서 링크로 대체한다. 개념 설명 AES의 구조. 키 없이 되돌릴 수 없는 키 순열을 만들어내기 위해, AES는 입력에 많은 수의 애드혹(ad-hoc)혼합 작업을 적용한다. 이는 우아한 개별 수학적 문제를 기반으로 하는 RSA와 같은 공개 키 암호 시스템과 극명한 대조를 이룬다. AES는 훨씬 덜 우..
개념 설명 (Resisting Bruteforce) 무차별 대입 공격 저항. 블록 암호가 안전하다면, 공격자가 AES의 출력을 의사 난수 순열(pseudorandom permutation)과 구별할 방법이 없어야 한다. 게다가 가능한 모든 키를 무차별 대입하는 것보다 순열을 최소화하는 더 좋은 방법이 없어야 한다. 때문에 학계에서는 해당 공격이 실질적으로 불가능하더라도 키를 무차별 대입하는 것보다 수행하는데 더 적은 단계가 필요한 공격을 발견할 수 있는 경우 암호가 이론적으로 "파손"(broken)되었다고 간주한다. ! 128비트 키 스페이스를 무차별 대입하는 것이 얼마나 어려울까? (https://crypto.stackexchange.com/questions/48667/how-long-would-it..
대칭 암호학? 시작입니다. 사실 그 전에 계속 중국인의 나머지 정리를 이해하기 쉽게 증명해서 글을 쓰고자 했는데 너무 어려워서 다음에 쓰려고 미루고.. 진도나 나갑시다. 이번 대회에서는 그냥 sympy에서 crt를 사용하는 걸로.. Keyed Permutation (키드 순열) AES는 다른 우수한 블록 암호와 마찬가지로 "Keyed Permutation"을 수행한다. 즉 수행할 순열을 결정하는 키를 사용하여 가능한 모든 입력 블록을 특정한 출력 블록에 매핑하는 것이다. ! '블록'은 모든 종류의 데이터를 나타낼 수 있는 고정된 수의 비트 혹은 바이트를 나타낸다. AES는 블록을 처리하고 다른 블록을 출력한다. 특히 AES-128로 알려진 128비트(16byte) 블록과 128비트 키에서 작동하는 AES..
문제 설명 다음 방정식을 재배열하여 소수 p, q를 구하여라. N = p*q c1 = (2*p + 3*q)**e1 mod N c2 = (5*p + 7*q)**e2 mod N 문제 풀이 이번 문제를 풀기 위해서 정말 많은 개념들을 찾아봤다. 나는 합동식에 익숙치가 않아서 너무 어려웠던 문제이다.. $N = pq$이고, $c_1 = (2p + 3q)^{e_1} \bmod N$, $c_2 = (5p + 7q)^{e_2} \bmod N$이다. 우리는 p나 q를 중 하나를 구하면 N을 나눠서 다른 하나를 구할 수 있다. 연립 방정식을 푸는 것처럼 풀이가 가능하다. 위에 식은 이항으로 n제곱 되어있는데 이게 어떻게 연립방정식처럼 풀 수 있는가? Freshman's dream(대학교 1학년의 꿈)이 성립한다. $(x..
문제 설명 애드리언은 symbol(아마 르장드르 기호)와 마이너스 기호를 통해 메시지를 암호화 하는 방법을 찾고 있어요. flag를 복구할 방법을 알고 있나요? 문제 풀이 문제는 그냥 이전 개념들을 사용해서 푸는 것으로 보인다. from random import randint a = 288260533169915 p = 1007621497415251 FLAG = b'crypto{????????????????????}' def encrypt_flag(flag): ciphertext = [] plaintext = ''.join([bin(i)[2:].zfill(8) for i in flag]) for b in plaintext: e = randint(1, p) n = pow(a, e, p) if b == '1'..