평문(plaintext)을 암호문(ciphertext)으로 변환하는 것.
- 암호문도 누군가 훔쳐볼 수 있다. but, 특별한 정보를 아는 사람만 이해할 수 있음.
- 암호문을 다시 평문으로 변환하는 것 = 복호화(decryption)
해시알고리듬과의 차이점
- 해시알고리듬은 원문 복구를 막는게 목표.
- 암호화 알고리듬은 원문 복구를 허용해야 함.
암호화의 역사
- 고대시절부터 사용한 간단한 형태의 암호화가 있음.
- 19~20세기에 특히 군용으로 많이 사용
- 무전으로 보내는 군사정보를 적군이 알면 안됨.
- 2차세계대전 중 독일군이 사용한 애니그마 기계도 글자 교환 방식
- 매일 글자 목록이 바뀜
- 이 규칙을 미리 알고 있지 않으면 24시간마다 규칙을 찾아내야 함
현대사회에서의 암호화
- 온라인을 사용하여 데이터를 주고받는일이 많아짐.
- 온라인에 저장된 정보가 너무 많음(특히 개인정보!!)
- 컴퓨터 성능향상으로 컴퓨터 성능으로 사실상 깰 수 없는 암호화 기법이 필요함.
정수론(number theory)
- 정수의 성질에 대해 연구하는 학문
- 수학을 사랑하는 사람들이 매~우 좋아하는 학문
- 2진수로 표현된 데이터를 암호화하려다보니 갑자기 주목받음.
- 특히 소수에 관련된 정수론적 알고리듬이 많은 주목을 받음
- 암호문의 패턴을 들키지 않으려면 겹치지 않는 수가 필요
- 소수는 자연에서 가장 겹치지 않는 수
암호학에서 사용하는 정수
- 매우 큰 정수
- 32비트보다 더 큰 수를 사용함.
- 32비트 범위안에 있는 소수는 오직 203,280,220개 뿐
- 입력크기 N
- 보통 배열 속의 요소수를 의미
- 암호학에서 사용하는 정수에서는 비트 수를 의미
- 곱셈, 나눗셈, 나머지 연산의 시간 복잡도
- 보통 정수는 O(1)
- 암호학에서 사용하는 정수는 비트수에 비례
현대 암호화 알고리듬 두 종류
- 대칭 키 암호화(symmetric-key encryption)
- 비대칭 키 암호화(asymmetric-key encryption)
- 공개 키 암호화(public-key-encryption)라고도 함
- 암호화와 복호화에 사용하는 키가 다름
대칭 키 암호화
- 암호화/복호화에 동일한 키를 사용
- 이 키는 메시지 송신자, 수신자가 공유하는 비밀
- 수신자가 이미 그 키를 가지고 있어야 복호화 가능
- 송신자가 수신자에게 비밀스럽게 키를 알려줄 방법이 필요
스트림 암호 vs 블록 암호
- 스트림 암호(stream cihper)
- 한번에 1바이트씩 받아 암호화를 진행
- 안전하려면 각 바이트에 적용하는 키가 달라야 함.
- 블록 암호보다 설정이 복잡하나 속도가 빠름
- 블록 암호(block cipher)
- 정해진 블록크기(64비트 이상)만큼의 바이트를 한번에 암호화
- 각 블록에 사용하는 키가 동일함
- 스트림 암호보다 설정이 간단하나 속도가 느림
- 효과는 둘다 좋다고 알려져 있음
대칭키의 예
- Wi-Fi 비밀번호도 일종의 대칭 키
- WPA2-Personal 작동방식
- 스마트폰이 처음 공유기 접속시 교환하는 어떤 값과 비밀번호를 합쳐 키 생성
- 그 키를 이용하여 메세지 암호화 및 복호화
- but, 해커가 둘 사이 모든 트래픽을 캡처한다면 읽기 가능
대칭키 알고리듬 목록
- DES
- IDEA
- Blowfish
- AES
- RC4
- RC5
- RC6
- 등...
AES(Advanced Enctryption Standard)
- NSA에서 일급비밀 용으로 승인한 유일한 공개 암호화 알고리듬
- 현재 가장 널리 사용되는 대칭 키 알고리듬
- 블록 크기: 128비트
- 키 길이: 128, 192 256비트
- 키 길이에 따라 평문을 암호문으로 변환하는 라운드수가 다름
- 128비트: 10라운드
- 192비트: 12라운드
- 256비트: 14라운드
AES의 블록
- AES는 한번에 16바이트씩 읽어서 암호화
- 16바이트를 4X4 행렬로 배치
![](https://velog.velcdn.com/images/seojh5939/post/339df03d-fffb-4a6b-9665-226edcef3c9e/image.png)
- 그뒤 여러 처리과정을 통해 암호화 진행
AES알고리듬의 구성
- 키 확장
- 0라운드
- 9/11/13 라운드
- 바이트 대체
- 행 이동
- 열 섞기
- 라운드 키 더하기
- 최종 라운드(총 라운드 수가 10/12/14가 됨)
AES알고리듬을 파악하기위해 사용할 데이터
- 원문: James is the killer!(아스키, 총 20바이트)
- 첫 블록
![](https://velog.velcdn.com/images/seojh5939/post/c74e964e-c407-43ad-8158-deec63dfe559/image.png)
- 키는 어떤 128비트 정수라 가
1. 키 확장(key expansion)
- 대칭키로부터 각 라운드에 사용할 여러 키를 생성
- 총 라운드 수 + 1개의 라운드 키를 만듦
- 각 라운드마다 다른 키를 사용하여 키를 찾기 어렵게 만듦
2.a) 0라운드- 라운드 키 더하기
- 0 라운드 키를 원문에 더함
- 더한다는 의미는 배타합(xor)
![](https://velog.velcdn.com/images/seojh5939/post/b78a8174-6ba7-4279-887e-1b0ed56fc7a4/image.png)
- 결과
![](https://velog.velcdn.com/images/seojh5939/post/8f2b055d-8519-4aa9-a997-29cfdda58df2/image.png)
- 0라운드의 결과는 1라운드의 입력값으로 사용함.
3.a) 여러 라운드- 바이트 대체
- 각 바이트를 다른바이트로 대체함
- 바꾸고자하는 바이트에 다른 바이트로 대체하는 것. 이것을 테이블로 만들어 관리하고있음. 그것이 룩업테이블이다.
- AES S-Box라는 룩업 테이블을 사용
![](https://velog.velcdn.com/images/seojh5939/post/8c972aaf-7598-4a17-85fa-0a508abd5f2a/image.png)
- 위와 같이 하나씩 테이블에서 찾아 하나씩 다른 바이트로 대체함.
- 선형적인 변환이 아니라 단순 사칙 또는 비트 연산으로 찾을 수 없음.
- 선형적인 변환이라는 것은 일정한 공식 혹은 작업을 통해 결과를 내는 것.
3.b) 여러 라운드 - 행 이동
- 4개의 행을 각각 다르게 왼쪽으로 이동(ShiftRows)
- 1행: 이동없음
- 2행: 1 만큼
- 3행: 2 만큼
- 4행: 3 만큼
![](https://velog.velcdn.com/images/seojh5939/post/10850255-51d7-4d01-86bf-c4c379ad89a5/image.png)
3.c) 여러 라운드 - 열 섞기
- 각 열에 있는 4바이트를 선형적으로 변환(MixColumns)
- 행렬 x 백터 곱을 이용(따라서 결과도 4바이트)
![](https://velog.velcdn.com/images/seojh5939/post/6c12d9d3-846e-4894-aaee-f22a8ffb71b0/image.png)
- 일반적인 행렬 곱셈은: C5 X 2 + 0E X 3 + CD X 1 + 02 X 1
- 위 식에서 덧셈은 XOR연산으로 변경. 곱셈은 특별한 규칙을 적용.
- 곱셈규칙
- 1로 곱할때
- 2로 곱할 때
- 원래 값에 2를 곱함(=왼쪽으로 1만큼 비트시프트)
- 원래 값의 최고비트가 1이었다면 0x1B로 xor
- 3으로 곱할 때
- 일반 산술연산: x3 = x2 + x
- 여기서도 위 규칙을 따름: x3 = x2 xor x
- 방금전 봤던 2로곱하는 규칙을 적용한다.
- 그 결과에 원래 값을 xor한다.
- 행렬 x 벡터 곱을 이용(따라서 결과도 4바이트)
- 일반 곱셈이 아닌 갈루아 필드에서의 곱이라고 함..
3.d) 여러라운드 - 라운드 키 더하기
- 라운드 키를 더함
- 3.a) ~ 3.d) 단계를 여러번 반복
- 대칭키가 128비트면 9라운드
- 대칭키가 192비트면 11라운드
- 대칭키가 256비트면 13라운드
- 다음라운드의 시작점은 이번라운드의 결과값
최종라운드
- 바이드 대체
- 행 이동
- 라운드 키 더하기
비대칭 키 암호화가 필요한 이유
- 대칭키 암호화는 훌륭한 기법이고 쓸 곳도 많음
- 하드디스크에 파일을 암호화하여 저장
- DB에 고객정보 저장
- 사내 서버간 통신의 암호화
- 하지만 암호화/복호화에 동일한 키를 사용하는것이 단점.
- 보안문제없이 쉽게 키를 배포할 수 있는 방법이 필요.
가장 쉽게 키를 배포하는 법
- 복호화에 사용할 키를 공개하면됨.
- 그래도 보안이 유지되는 방법이 필요함.(=비대칭 키 암호화)
비대칭 키 암호화 정의
- 암호화와 복호화에 사용되는 키가 다름
- 두 키 사이에는 특수한 수학적 관계까 있음.
- 공개키와 개인키(비밀키)가 있다.
올바른 메세지 암호화
- 송신자가 수신자의 공개키로 원문 -> 암호문 암호화
- 수신자는 자신의 비밀키로 암호문 -> 원문 변환
- 수신자만 알고 있는 키
- 수신자만 원문을 볼 수 있음.
비대칭 키 암호화의 두가지 주요 용도
- 전송하는 메시지의 암호화
- 전자서명(digital signature)
- 메시지는 누구든 볼 수 있음
- 메시지 송신자가 올바름을 증명
- 암호화폐에서 돈을 옮길때도 이 방법을 사용
비대칭 키 암호화를 사용하는곳
- HTTPS
- 비대칭 키 암호화와 더불어 대칭 키 암호화도 사용
- 매신저 앱의 비밀채팅모드
- 비트코인 등의 암호화폐 프로토콜
- Git커밋의 전자서명
대표적인 비대칭 키 암호화 기법
- 디피-헬만 키 교환
- RSA
- 디지털 서명 알고리듬
- 타원곡선 DSA
RSA
- 현재 데이터 전송용으로 매우 널리 쓰임
- 정수론에 기초함.
- 공개키/ 비밀키 쌍을 만드는게 매우 쉬움
- 이 두 키는 특수한 수학적 관계를 가짐
- 공개 키를 알아도 그로부터 비밀키를 찾기 매우 힘듦
- 거듭제곱과 나머지 연산만으로 암호화 가능
- 암호문을 다시 거듭제곱한 뒤, 나머지 연산을 하면 원문이 돌아옴
소수의 특징
- 소수는 더 이상 인수분해가 안 되는 숫자
- 서로 다른 두 소수 p, q를 곱하면 합성수 n이 나옴
- n의 인수는 p와 q 뿐
RSA가 이용하는 소수의 성질
- 두 소수를 곱하는 것은 누구나 쉽게 할 수 있는 연산
- 두 소수를 곱한 합성수에서 그 소수들을 찾는 것은 훨씬 어려움
- 이렇다할 알고리듬이 없어 모든 조합을 곱해봐야함
- 예: "8,240,089,796를 인수분해 하시오"(10자리 수)
200자리 숫자에서 두 소수 찾기
- 시도해야하는 곱셈 수는 루트(10^200) = 10^100 정도.
- 컴퓨터가 1초에 곱셈을 100만번 할 수 있다면 10^100 / 10^6 = 10^94초가 소요
- 우주의 나이는 10^18 초가 약간 안됨
- 우주의 나이보다 10^94 / 10^18 = 10^76배의 시간이 필요하단 뜻
- 즉, 현재의 컴퓨팅파워로는 불가능한 계산이라는 뜻.
RSA 키 길이와 연산 속도
- NIST에서 권하는 RSA의 키 길이
- 2022년: 1024비트
- 2015년: 2048비트
- RSA-2048은 1024비트 소수를 2개 사용
- 2^1024 = 1.798 X 10^308
- 즉, 308자리 숫자.
- 혹시라도 컴퓨터 속도가 더 빨라지면 비트 수를 늘리면 됨
RSA 공개 키/비밀 키의 기초
- "비밀 키": 아주 큰 소수 p,q
- "공개 키": 합성수 n(n = p x q)
- p,q를 모르면 n으로부터 p,q를 찾기가 매우 힘듦
- 즉, 공개키로부터 비밀키를 찾기가 매우 힘듦!
- 이것이 RSA 공개 키/비밀 키 간의 첫번째 특수한 관계
- 공개 키/비밀 키의 두번째 특수한 관계
- p,q와 특수한, 그리고 서로간에도 특수한 관계인 e와 d를 찾음
- e: 공개 키의 두 번째 요소가 됨
- d: 비밀 키의 두 번째 요소가 됨
- e와 d는 다음의 관계를 만족해야 함
![](https://velog.velcdn.com/images/seojh5939/post/b1db88b5-706c-4e85-9c52-99a6cb74d9c1/image.png)
![](https://velog.velcdn.com/images/seojh5939/post/ee96ee52-ae1f-4a86-ae54-6e8c5e652795/image.png)
RSA 키 생성
- 매우 큰 두 소수 p와 q를 찾는다.
- p와q를 곱해 n을 만든다.
- p,q와 특수한 수학적 관계인 e를 찾는다.
- e와 특수한 수학적 관계인 d를 찾는다.
1. 매우 큰 두 소수 p와 q를 찾는다.
- 매우 큰 랜덤 수를 뽑는다.
- 그 수가 소수인지 판별한다.
- 확률적 알고리듬을 통해 꽤 빠르게 할 수 있음(예: 밀러-라빈 소수 판별법)
- 소수가 아니라고 판별되면 1번 단계로 돌아간다
- 서로 다른 두 소수를 찾을 때까지 이 과정을 반복한다
![](https://velog.velcdn.com/images/seojh5939/post/60627e73-4448-44c0-9d8a-2231ce5fd823/image.png)
2. p와q를 곱해 n을 만든다.
3. p,q와 특수한 수학적 관계인 e를 찾는다.
- n의 카마이클 수를 구한다
![](https://velog.velcdn.com/images/seojh5939/post/940fd29c-2bb0-454f-bfb6-ff2c5e5a998c/image.png)
![](https://velog.velcdn.com/images/seojh5939/post/494f2cae-37eb-4add-ba7a-82e77fa1cd87/image.png)
- 카마이클 수 n은 (p-1, q-1)의 최소공배수와 같다.
![](https://velog.velcdn.com/images/seojh5939/post/14765be7-b6c3-4b69-9a1e-88aaaf24c940/image.png)
- 1 < e < 람다(n)이고 람다(n)과 서로소인 e 값을 찾는다.
- 서로소: 공약수가 1 뿐인 두 정수
- e 값은 위 조건을 만족하면 어떤것이든 상관없음
![](https://velog.velcdn.com/images/seojh5939/post/af29397d-9129-4cf9-82a6-20326d5a559e/image.png)
4. e와 특수한 수학적 관계인 d를 찾는다.
![](https://velog.velcdn.com/images/seojh5939/post/940fd29c-2bb0-454f-bfb6-ff2c5e5a998c/image.png)
- 위 조건을 만족하는 d를 찾음
- 확장 유클리드 호제법을 사용하면 쉽게 찾을 수 있음
- e와 람다(n)이 서로소이면 반드시 위 조건을 만족하는 d가 존재
![](https://velog.velcdn.com/images/seojh5939/post/1b89f227-7828-42b4-a266-02a233de4d58/image.png)
RSA를 이용한 암호화
![](https://velog.velcdn.com/images/seojh5939/post/228b1716-663e-4d71-b99e-8c21497d7994/image.png)
RSA를 이용한 복호화
![](https://velog.velcdn.com/images/seojh5939/post/cfce62dd-309d-4b6c-be81-c35e13dec974/image.png)
이게 왜 되지???
![](https://velog.velcdn.com/images/seojh5939/post/c6adf925-a3bd-44ad-b5f2-b48d6daafd4c/image.png)
증명
- 증명할 관계 찾기
![](https://velog.velcdn.com/images/seojh5939/post/1a225ff4-476a-41f7-a736-c446f3cae836/image.png)
- c < n일때 n으로 모듈러 연산을해도 c의 값은 변하지 않는다.
- 합동식의 성질 중 좌항과 우항에 동일한 값으로 거듭제곱할 경우 양 변은 변함없이 동치이다.
- 이것을 이용해서 암호화 식을 빨간글씨로 바꾼 것.
- 복호화 공식이 m을 돌려줌을 증명하고 싶음
![](https://velog.velcdn.com/images/seojh5939/post/bf512336-b535-4564-afd6-ed97e032a7ca/image.png)
![](https://velog.velcdn.com/images/seojh5939/post/6b292d7c-e83d-4702-aca3-7d25be93fbe2/image.png)
- 합동식의 성질을 이용하여 우리가 증명할 관계를 뽑아낸 것이다.
![](https://velog.velcdn.com/images/seojh5939/post/46512898-2b43-487c-bdf9-2a39f02fd25c/image.png)
![](https://velog.velcdn.com/images/seojh5939/post/42629076-ddc2-4231-b07b-e3dd637dabf2/image.png)
![](https://velog.velcdn.com/images/seojh5939/post/0fe7a77d-8090-4841-9c1e-8198d776da5d/image.png)
![](https://velog.velcdn.com/images/seojh5939/post/31fc38ed-1ae6-43f4-ac9c-d6012e2821d3/image.png)
- 위의 식을 순서대로 따라가면 m의 지수승 ed를 풀어야 한다는것을 알게된다.
- ed의 우항을 풀어보면 위의 맨 마지막 슬라이드와 같이 나온다.
![](https://velog.velcdn.com/images/seojh5939/post/80ad14c6-a8ae-4413-a634-b6e708dad06d/image.png)
- 위 슬라이드와 같이 ed -1 = 최소공배수 (p-1,q-1)의 배수인 어떤 수라는것을 알 수 있다.
- ed -1 은 (p-1)의 배수, (q-1)의 배수이기도 하다.
![](https://velog.velcdn.com/images/seojh5939/post/ec9105ba-e6ca-463d-ae1b-33fc75d4dce3/image.png)
![](https://velog.velcdn.com/images/seojh5939/post/28bcc1e5-5af6-4a61-b062-63e503722f31/image.png)
- 위 두식을 각각 증명하면 우리가 최종적으로 증명하고싶은 식을 증명하게되는 샘.
![](https://velog.velcdn.com/images/seojh5939/post/ff1a45ed-d30a-49da-b554-87f65b118b1f/image.png)
![](https://velog.velcdn.com/images/seojh5939/post/40e4106a-0f78-4f7d-84a3-2f6a04555dd6/image.png)
![](https://velog.velcdn.com/images/seojh5939/post/c8110aef-dc9f-4926-b2f5-6eb8530a4347/image.png)
![](https://velog.velcdn.com/images/seojh5939/post/99ae53d5-15b4-4c26-bf90-29d838d15fd0/image.png)
![](https://velog.velcdn.com/images/seojh5939/post/e25153a9-4e5a-469c-96f0-adb130dfd3fd/image.png)
- 따라서 맨 위의 식과 맨 아래의 식이 동치가 되어버림.
![](https://velog.velcdn.com/images/seojh5939/post/f0c4ff51-aaf5-4238-b181-03fc27e8cc92/image.png)
- 이미 앞에서 증명해버림.
![](https://velog.velcdn.com/images/seojh5939/post/a76708b1-e39e-4827-b4c0-ed5504aabcc7/image.png)
![](https://velog.velcdn.com/images/seojh5939/post/6702c480-4524-4ced-a830-f4c6d292e1ce/image.png)
본 내용은 Udemy의 알고리듬 및 자료구조(Java)강의를 듣고 정리한 내용입니다.