# 암호화
정보나 데이터를 알아보기 어려운 형태로 변환하는 과정
## 암호화 방식과 알고리즘

- 대칭 암호화 : 암호화와 복호화에 같은 암호키를 사용하는 방식
- 비대칭 암호화 : 암호화와 복호화에 서로 다른 암호키를 사용하는 방식
- 혼합방식 암호화 : 암호화와 비대칭 암호화를 함께 사용하는 방식
## 대칭 암호화
- 암호화와 복호화에 같은 키를 사용하는 암호화 방식
- 암호화를 수행할 때 사용한 키를 복호화에도 사용하여 데이터를 원래의 평문으로 복원한다.
- 대칭 암호화에서는 키의 비밀성이 중요하다.
- 키를 알지 못하는 사람은 암호화된 데이터를 해독할 수 없기 때문
- 대칭 암호화에서는 안전한 방법으로 키를 교환하고, 키의 보안성을 유지해야 한다
- 대표적인 대칭 암호화 알고리즘 : DES(Data Encryption Standard), 3DES(Triple Data Encryption Standard), AES(Advanced Encryption Standard) 등이 있다.
## 비대칭 암호화
- 암호화와 복호화에 서로 다른 키를 사용하는 암호화 방식
- 키를 안전하게 교환할 수 있으며, 키 관리와 보호 등에 대한 문제점을 해결하기 위한 방법으로 사용된다
- 대칭 암호화 방식보다 계산량이 많아서, 대규모 데이터 처리에는 적합하지 않을 수 있다.
- **대칭 암호화에 비해 느리다**
- 비대칭 암호화에서는 공개키와 개인키를 사용한다.
- 공개키는 누구나 사용할 수 있으며, 개인키는 키 소유자만이 사용할 수 있다.
- 암호화를 수행할 때는 공개키로 암호화하고, 복호화를 수행할 때는 개인키로 복호화한다.
- 대표적인 비대칭 암호화 알고리즘으로는 RSA(Rivest-Shamir-Adleman)가 있다.

> 대칭키 암호화 vs 비대칭키 암호화
>
> 
### 비대칭 암호화는 언제, 어떻게 사용되는가?
- 데이터 무결성
- 암호화된 데이터는 권한이 없는 타인에 의해 수정될 수 없다
- 변조 여부는 해싱으로 확인하지만 암호화는 아예 변조를 못하게 막는 개념
- 데이터 보호
- 암호화된 데이터는 권한이 없는 타인에 의해 읽힐 수 없다
- 인증(Authentication)
- 특정 데이터에 접근이 가능한 사용자인지 확인하는 과정
> 
>
> ---
>
> 
### RSA 암호화
- 비대칭 암호화로 가장 많이 사용되는 암호화
- RSA 암호화는 다음 두가지 특징을 사용해 만들어졌다
1. 소인수분해의 어려움
2. 모듈러 연산의 특징
#### RSA암호화 키 생성 방식
1. 두 개의 소수(p, q)를 선택한다.
2. N = p*q를 계산한다.
3. φ(N) = (p-1)*(q-1)을 계산한다. (φ(N)은 N보다 작은 수 중에서 N과 서로소인 수의 개수를 나타낸다.)
4. φ(N)와 서로소인 e를 선택한다. (보통 e는 65537을 사용한다.)
5. d를 계산한다. d는 e*d ≡ 1 (mod φ(N))을 만족하는 d 값이다. 여기서 ≡ 기호는 모듈러 연산을 의미한다.
6. 공개키는 (e, N)이다. 개인키는 (d, N)이다.
#### RSA 암호화 암/복호화 공식
암호화 : C ≡ M^e (mod N)
복호화 : M' ≡ C^d (mod N)
- 공개키: (e, N)
- 개인키: (d, N)
- 원본 데이터: M
- 암호화된 데이터: C
- 복호화된 데이터: M'

## 혼합방식 암호화
- 대칭 암호화와 비대칭 암호화를 조합하여 안전한 데이터 전송을 보장하는 방식
- 이 방식에서는 먼저 비대칭 암호화 방식을 사용하여 안전한 키 교환을 수행한다. 이후 데이터 전송에 대해서는 대칭 암호화 방식을 사용하여 데이터를 암호화하고 전송한다.
- 혼합방식 암호화는 대칭 암호화 방식의 빠른 암호화/복호화 기능과 비대칭 암호화 방식의 안전한 키 교환을 모두 활용할 수 있어 안전한 데이터 전송을 보장할 수 있다.
- 또한, 대칭 암호화 방식을 사용하기 때문에 대용량 데이터 처리에도 적합한다.
- 전자상거래, 인터넷 보안, 데이터베이스 보안 등 다양한 분야에서 사용되며, 혼합방식 암호화를 사용하면 데이터의 안전성과 무결성을 보장할 수 있다.
## 해시함수를 이용한 암호화
### 해시 함수

- 해시 함수 : 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수
- 입력 데이터가 같으면 출력 데이터도 같다는 특성을 가지고 있다.
- 입력 데이터가 다르면 출력 데이터도 다르다는 특성을 가지고 있다.
- 해시는 예측이 불가능하다.
- 입력 데이터가 조금만 달라져도 출력 데이터가 완전히 달라지는 특성을 가지고 있다.
### 해시함수로 비밀번호를 안전하게 서버에 저장하는 과정

1. 회원가입을 위해 클라이언트가 ID/PW를 전달한다
- 전달 시 PW를 해시화해서 전달한다
2. 서버가 ID와 해시화된 PW를 저장하고 회원가입 결과를 알려준다.
3. 로그인을 위해 클라이언트가 ID/PW를 전달한다
- 전달 시 PW를 해시화애서 전달한다
4. 서버가 ID와 해시화된 PW를 비교하여 일치하는지 확인 후 로그인 결과를 알려준다.
### Rainbow Table

- 함수를 사용하여 비밀번호와 같은 데이터를 빠르게 복호화하기 위한 미리 계산된 테이블
- 레인보우 테이블은 미리 계산된 해시 값과 그에 해당하는 원본 데이터를 저장하고 있어, 해시 값을 쉽게 복호화할 수 있.
- 레인보우 테이블 공격은 해시 값만 알고 있는 상황에서 원래 데이터를 찾아내는 데 쓰인다
### Salt

- Salt는 임의의 데이터로, 비밀번호와 같이 해시화 할 데이터와 함께 사용된다
- Salt는 원본 데이터에 추가되어 새로운 해시 값을 생성하며, 이렇게 함으로써 레인보우 테이블 공격의 효과를 상당히 줄일 수 있다
- 각 사용자마다 고유한 Salt 값을 사용하면, 동일한 비밀번호라도 다른 해시 값이 생성되므로 레인보우 테이블을 사용한 공격에 대한 보안을 강화할 수 있다.
- Salt는 저장되어야 하는 추가 데이터이지만, 그 값어치를 하는 중요한 보안 요소