책 소개
소스 코드 파일은 여기에서 내려 받으실 수 있습니다.
요약
암호 해킹과 파이썬 코딩을 모두 맨땅에서 시작하는 책이다. 암호학도 파이썬도 모르는 사람뿐만 아니라, 프로그래밍 경험이 거의 없는 사람도 볼 수 있는 책이다. 그러나 이 책은 프로그래밍의 기초에만 머무르지만은 않는다. 후반에서는 현대 암호학의 정수인 공개 키 기반 암호까지 다룬다. 암호학과 파이썬을 학습하는 과정을 지루하지도 가파르지도 않게 구성한 훌륭한 안내서다.
이 책에서 다루는 내용
■ 실제 동작하는 프로그램에 있는 루프, 변수, 흐름 제어 구문 결합
■ 복호화한 메시지가 올바른 영어인지 무작위 문자열인지 바로 검출할 수 있는 사전 파일 사용
■ 암호화/복호화 코드가 올바르게 동작하는지 검증할 수 있는 테스트 프로그램 작성
■ 모듈러 연산으로 메시지를 암호화하는 아핀 암호화/해킹 코드 예제
■ 무차별 대입법, 빈도 분석 등의 암호 해킹 기법
이 책의 대상 독자
암호화, 해킹 또는 암호에 대해 궁금한 독자들을 대상으로 하는 책이다. 이 책의 암호(23장과 24장에서 다루는 ‘공개 키 암호’는 제외)는 이미 수 세기 전에 작성됐지만 요즘에는 그와 같은 암호를 해킹할 수 있는 연산 능력을 모든 컴퓨터가 보유하고 있다. 현대의 조직이나 개인은 더 이상 그런 암호를 사용하지는 않지만, 이를 학습해 암호 작성의 기초를 알 수 있고 해커가 암호의 취약점을 이용해 복호화해내는 원리를 학습할 수 있다.
이 책은 프로그래밍을 해본 적이 없는 독자들을 위한 책으로, 우선 초보자를 위한 최고의 언어 중 하나인 파이썬 언어로 기본 프로그래밍 개념을 학습한다.
이 책의 구성
초반에는 기본적인 파이썬과 암호 개념을 소개한다. 그다음부터는 일반적인 암호용 프로그램을 설명하고 암호를 해킹하는 프로그램을 설명하는 내용이 번갈아 등장한다. 각 장은 학습한 내용을 복습하는 데 도움이 될 만한 연습 문제를 포함하고 있다.
1장, ‘종이 암호화 도구 만들기’에서는 컴퓨터가 등장하기 전에 암호화를 수행한 방법을 보여주는 간단한 종이 도구를 소개한다.
2장, ‘대화형 셸 프로그래밍’에서는 파이썬의 대화형 셸을 사용해 코드를 한 번에 한 행씩 실행하는 방법을 설명한다.
3장, ‘문자열과 프로그램 작성’에서는 전체적인 프로그램 작성법과 이 책의 모든 프로그램에서 사용한 문자열 데이터 유형을 다룬다.
4장, ‘뒤집기 암호’에서는 첫 번째 암호를 구현하기 위한 간단한 프로그램 작성법을 다룬다.
5장, ‘카이사르 암호’에서는 수천 년 전에 최초로 발명된 기본 암호를 설명한다.
6장, ‘무차별 대입법으로 카이사르 암호 해킹하기’에서는 무차별 대입 해킹 기법과 암호화 키 없이 메시지를 해독하는 방법을 설명한다.
7장, ‘전치 암호’에서는 전치 암호화와 그를 통해 메시지를 암호화하는 프로그램을 다룬다.
8장, ‘전치 암호 복호화’에서는 전치 암호화의 남은 부분 즉, 키로 메시지를 해독하는 방법에 대해 설명한다.
9장, ‘테스트 프로그램 작성법’에서는 프로그램을 테스트하는 프로그래밍 기법을 소개한다.
10장, ‘파일 암호화 및 복호화’에서는 하드 드라이브에서 파일을 읽거나 쓰는 프로그램을 작성하는 방법을 다룬다.
11장, ‘영어 문장 감지 프로그램’에서는 프로그램을 통해서 영어 문장을 감지할 수 있는 방법을 소개한다.
12장, ‘전치 암호 해킹’에서는 이전 장의 개념을 결합해 전치 암호를 해킹해본다.
13장, ‘아핀 암호를 구현하기 위한 모듈러 연산 모듈’에서는 아핀(Affine) 암호의 수학적 개념을 설명한다.
14장, ‘아핀 암호 프로그래밍’에서는 아핀 암호 프로그램을 작성하는 방법을 다룬다.
15장, ‘아핀 암호 해킹’에서는 아핀 암호 해킹 프로그램을 작성하는 법을 다룬다.
16장, ‘단순 치환 암호 프로그래밍’에서는 간단한 치환 암호를 이용한 암호화 프로그램 작성 방법을 다룬다.
17장, ‘단순 치환 암호 해킹’에서는 단순 치환 암호를 해킹하는 프로그램 작성 방법을 다룬다.
18장, ‘비즈네르 암호 프로그래밍’에서는 좀 더 복잡한 치환 암호인 비즈네르(Vigenère) 암호 프로그램을 다룬다.
19장, ‘빈도 분석’은 영어 단어의 구조와 그것을 이용한 비즈네르 암호 해킹을 고찰해본다.
20장, ‘비즈네르 암호 해킹’에서는 비즈네르 암호를 해킹하는 프로그램을 다룬다.
21장, ‘일회용 암호’에서는 일회용 암호와 해킹이 수학적으로 불가능한 이유를 설명한다.
22장, ‘소수 찾기 및 생성’에서는 숫자가 소수인지 빠르게 판단하는 프로그램을 작성하는 방법을 다룬다.
23장, ‘공개 키 암호를 위한 키 생성’에서는 공개 키 암호화와 공개 및 개인 키를 생성하는 프로그램을 작성하는 방법을 다룬다.
24장, ‘공개 키 암호 프로그래밍’에서는 단순한 노트북 컴퓨터로는 해킹할 수 없는 공개 키 암호 프로그램을 작성하는 방법을 다룬다.
부록 ‘파이썬 코드 디버깅’에서는 IDLE의 디버거로 프로그램의 버그를 찾고 잡는 방법을 다룬다.
목차
목차
- 1장. 종이 암호화 도구 만들기
- 암호화란 무엇인가?
- 코드 대 암호
- 카이사르 암호
- 이중 암호화가 동작하지 않는 이유
- 요약
- 2장. 대화형 셸 프로그래밍
- 간단한 수학 표현식 몇 가지
- 변수에 값 저장하기
- 요약
- 3장. 문자열과 프로그램 작성
- 문자열 값으로 텍스트 다루기
- print() 함수로 값 출력하기
- 이스케이프 문자 출력
- 작은 따옴표와 큰 따옴표
- IDLE의 파일 편집기로 프로그램 작성하기
- “Hello, World!” 프로그램 소스코드
- 온라인 Diff 도구로 소스코드 확인하기
- IDLE에서 작성한 프로그램을 나중에 다시 보려면
- “Hello, World!” 프로그램은 어떻게 동작하나
- 요약
- 4장. 뒤집기 암호
- 뒤집기 암호 프로그램 소스코드
- 뒤집기 암호 프로그램의 실행 예제
- 주석과 변수 설정하기
- 문자열 길이 알아내기
- while 루프 개요
- input() 프롬프트로 프로그램 개선하기
- 요약
- 5장. 카이사르 암호
- 카이사르 암호화 프로그램 소스코드
- 카이사르 암호 프로그램 예제 실행
- 모듈 가져오기와 변수 설정
- 상수와 변수
- for 루프 구문
- if 구문
- In과 not in 연산자
- find() 문자열 메소드
- symbol 암호화/복호화
- 화면에 표시하고 translated 복사하기
- 다른 심볼도 암호화해보자
- 요약
- 6장. 무차별 대입법으로 카이사르 암호 해킹하기
- 카이사르 암호 해킹 프로그램의 소스코드
- 카이사르 암호 해킹 프로그램의 실행 예제
- 변수 설정
- range() 함수를 이용한 순환문
- message 복호화
- 문자열 포맷팅을 이용해 key와 복호화된 message 출력하기
- 요약
- 7장. 전치 암호
- 전치 암호의 동작 원리
- 전치 암호 프로그램 소스코드
- 전치 암호 프로그램 예제 실행
- def문으로 자신만의 함수 만들기
- 아규먼트로 키와 메시지 전달하기
- 리스트 데이터 유형
- 전치 암호 알고리즘
- 대입 연산자의 확장
- message를 currentIndex로 돌아다니기
- join() 문자열 메소드
- 리턴 값과 return 구문
- 변수 name
- 요약
- 8장. 전치암호 복호화
- 전치 암호를 종이로 해독하는 방법
- 전치 암호 복호화 프로그램 소스코드
- 전치 암호 복호화 프로그램의 실행 예제
- 모듈 가져오기와 main() 함수 설정하기
- message를 key로 복호화하기
- main() 함수 호출
- 요약
- 9장. 테스트 프로그램 작성법
- 전치 암호 테스트 프로그램의 소스코드
- 전치 암호 테스트 프로그램 실행 예제
- 모듈 가져오기
- 의사 난수 생성하기
- 무작위 문자열 만들기
- 다양한 message 테스트하기
- 암호화가 제대로 동작했는지 확인하고 프로그램 끝내기
- main() 함수 호출
- 테스트 프로그램 테스트하기
- 요약
- 10장. 파일 암호화 및 복호화
- 평문 파일
- 전치 파일 암호 프로그램의 소스코드
- 전치 파일 암호 프로그램 실행 예제
- 파일 작업하기
- main() 함수 지정
- 파일이 존재하는지 알아보기
- 문자열 메소드로 더욱 유연한 사용자 입력 만들기
- 입력 파일 읽기
- 암호화/복호화에 걸린 소요 시간 측정
- 출력 파일 쓰기
- main() 함수 호출
- 요약
- 11장. 영어 문장 감지 프로그램
- 어떻게 컴퓨터로 영어를 이해할 수 있을까?
- detectEnglish 모듈의 소스코드
- detectEnglish를 사용한 예제
- 코드 도입부와 상수 설정
- 딕셔너리 데이터 유형
- 사전 파일 구현
- message에 들어 있는 영어 단어 수 세기
- 영문자가 아닌 글자 제거하기
- 영어 단어 판정
- 요약
- 12장. 전치 암호 해킹
- 전치 암호 해킹 프로그램의 소스코드
- 전치 암호 해킹 프로그램의 실행 예제
- 모듈 가져오기
- 삼중 따옴표로 여러 줄의 문자열 처리하기
- 해킹된 메시지 출력하기
- 해킹된 메시지 얻기
- main() 함수 호출
- 요약
- 13장. 아핀 암호를 구현하기 위한 모듈러 연산 모듈
- 나머지 연산
- 나머지 연산자
- 최대공약수를 계산하기 위한 인수 찾기
- 복수 할당문
- GCD를 찾는 유클리드 알고리즘
- 곱셈 암호와 아핀 암호의 동작 원리 이해하기
- Cryptomath 모듈 소스코드
- 요약
- 14장. 아핀 암호 프로그래밍
- 아핀 암호 프로그램의 소스코드
- 아핀 암호 프로그램 실행 예제
- 모듈, 상수, main() 함수 설정
- 키 계산과 유효성 검증
- 암호화 함수 작성
- 복호화 함수 작성
- 임의의 키 생성하기
- main() 함수 호출
- 요약
- 15장. 아핀 암호 해킹
- 아핀 암호 해킹 프로그램의 소스코드
- 아핀 암호 해킹 프로그램의 실행 예제
- 모듈, 상수, main() 함수 설정
- 아핀 암호 해킹 함수
- main() 함수 호출
- 요약
- 16장. 단순 치환 암호 프로그래밍
- 치환 암호의 동작 원리
- 단순 치환 암호 프로그램 소스코드
- 단순 치환 암호의 실행 예제
- 모듈, 상수, main() 함수 설정
- sort() 리스트 메소드
- 래퍼(wrapper) 함수
- The translateMessage() Function
- 임의의 키 생성하기
- main() 함수 호출
- 요약
- 17장. 단순 치환 암호 해킹
- 단어 패턴에 의한 복호화
- 해킹 과정 미리보기
- 단어 패턴 모듈
- 단순 치환 암호 해킹 프로그램의 소스코드
- 단순 치환 암호 해킹 프로그램의 실행 예제
- 모듈과 상수 설정
- 정규표현식으로 글자 찾기
- main() 함수 설정
- 사용자에게 해킹 결과 표시하기
- 암호 글자 매핑 생성하기
- hackSimpleSub() 함수
- main() 함수 호출
- 요약
- 18장. 비즈네르 암호 프로그래밍
- 비즈네르 암호의 다중 글자 키 사용
- 비즈네르 암호 프로그램의 소스코드
- 비즈네르 암호 프로그램의 실행 예제
- 모듈, 상수, main() 함수 설정
- List-Append-Join 처리에 의한 문자열 구축
- 메시지 암호화/복호화
- main() 함수 호출
- 요약
- 19장. 빈도 분석
- 텍스트의 글자 빈도 분석하기
- 글자 빈도 일치시키기
- 글자 빈도 일치 소스코드
- ETAOIN 순서로 글자를 저장하기
- message의 글자 수 세기
- 튜플의 첫 번째 요소 얻기
- message의 글자들을 빈도순으로 정렬하기
- message의 빈도 일치 점수 계산하기
- 요약
- 20장. 비즈네르 암호 해킹
- 무차별 대입 사전 공격을 이용한 비즈네르 암호 해킹
- 비즈네르 사전 공격 프로그램의 소스코드
- 비즈네르 사전 해킹 프로그램 실행 예제
- 비즈네르 사전 해킹 프로그램 설명
- 카시스키 분석을 통한 키 길이 찾기
- 비즈네르 해킹 프로그램의 소스코드
- 비즈네르 해킹 프로그램의 실행 예제
- 모듈 Import와 main() 함수 설정
- 반복 문자열 찾기
- 간격 값의 약수 구하기
- 가장 가능성이 높은 키 길이 찾기
- 같은 하위 키로 암호화한 글자 찾기
- 후보 키 길이를 이용한 복호화 시도
- 해킹한 메시지 리턴
- main() 함수 호출
- 해킹 프로그램 상수 값 변경하기
- 요약
- 21장. 일회용 암호
- 해킹이 불가능한 일회용 암호
- 요약
- 22장. 소수 찾기 및 생성
- 소수란 무엇인가?
- 소수 모듈의 소스코드
- 소수 찾기 모듈의 실행 예제
- 나눗셈에 의한 소수 판정 알고리즘의 원리
- 나눗셈 알고리즘을 이용한 소수 검사의 구현
- 에라토스테네스의 체
- 에라토스테네스의 체로 소수 만들기
- 라빈 밀러 소수 알고리즘
- 큰 소수 찾기
- 큰 소수 생성하기
- 요약
- 23장. 공개 키 암호를 위한 키 생성
- 공개 키 암호
- 인증 문제
- 디지털 서명
- 공개 키와 개인 키의 생성 과정
- 공개 키 생성 프로그램 소스코드
- 공개 키 생성 프로그램의 실행 예제
- main() 함수 생성
- generateKey() 함수로 키 생성하기
- makeKeyFiles() 함수로 키 파일 생성하기
- main() 함수 호출
- 하이브리드 암호 시스템
- 요약
- 24장. 공개 키 암호 프로그래밍
- 공개 키 암호의 동작 원리
- 공개 키 암호 프로그램의 소스코드
- 공개 키 암호 프로그램의 실행 예제
- 프로그램 기초 설정
- 암호화/복호화 모드 설정
- getBlocksFromText() 로 문자열을 블록으로 변환하기
- 복호화 함수 getTextFromBlocks() 사용하기
- encryptMessage() 함수 작성
- decryptMessage() 함수 작성
- 키 파일에서 공개 키/개인 키 읽기
- 암호화 파일 쓰기
- 파일 복호화
- main() 함수 호출
- 요약
- 부록. 디버깅 파이썬 코드
- 디버거로 디버깅하기
- 요약