IT/Security
하이브리드 암호화 방식 - 대칭키(랜덤)&비대칭키의 동시 사용
DEAN
2025. 5. 14. 13:50
기본적인 전송 케이스(전송자->수신자)
<전송자 동작>
1. 데이터를 전송할 때마다 랜덤하게 대칭키(Symmetric Key) 생성
(대칭키가 AES 키인 경우)
- 구분자로 구분된 aesKey 및 iv: "x5tg8#k2p9q7|c2s1dt6dd@"
2. 그 대칭키로 사용자 데이터 암호화(AES)
- 사용자 데이터: "내 신용카드 번호는 1234-5678-9012-3456"
- 대칭키로 암호화된 사용자 데이터: "a7f3d8c2e5b1..."
3. 수신자가 제공했던 공개키(RSA Public Key)로 대칭키 암호화(RSA)
- 공개키로 암호화된 대칭키: "9d8c7b6a..."
4. 수신자로 전송
- 공개키로 암호화된 대칭키
- 대칭키로 암호화된 사용자 데이터
=========================================
<수신자 동작>
1. 공개키로 암호화된 대칭키를 자신의 개인키(RSA Private Key)를 이용하여 복호화
- 개인키로 복호화된 대칭키: "x5tg8#k2p9q7"
2. 그 대칭키를 이용하여 사용자 데이터 복호화(AES)
- 대칭키로 복호화된 사용자 데이터: "내 신용카드 번호는 1234-5678-9012-3456"
앱에서 서버로 Request 시나리오
<앱 동작>
1. 데이터를 전송할 때마다, 랜덤하게 대칭키(AES Symmetric Key) 생성
- 구분자로 구분된 aesKey 및 iv: "x5tg8#k2p9q7|c2s1dt6dd@"
2. 그 대칭키로 사용자 데이터 암호화(AES)
- 사용자 데이터: "내 신용카드 번호는 1234-5678-9012-3456"
- 대칭키로 암호화된 사용자 데이터: "a7f3d8c2e5b1..." (암호화된 데이터)
3. 서버가 제공했던 공개키(RSA Public Key)로 대칭키 암호화(RSA)
- 공개키로 암호화된 대칭키: "9d8c7b6a..."
4. 서버로 전송
- 공개키로 암호화된 대칭키
- 대칭키로 암호화된 사용자 데이터
=========================================
<서버 동작>
1. 공개키로 암호화된 대칭키를 자신의 개인키(RSA Private Key)를 이용하여 복호화(RSA)
- 구분자로 구분된 aesKey 및 iv: "x5tg8#k2p9q7|c2s1dt6dd@"
2. 그 대칭키를 이용하여 사용자 데이터 복호화(AES)
- 대칭키로 복호화된 사용자 데이터: "내 신용카드 번호는 1234-5678-9012-3456"
서버에서 앱으로 Response 시나리오
<서버 동작>
1. Response할 때마다, 앱이 요청 시에 보내준 대칭키(AES Symmetric Key)로 사용자 데이터 암호화해서 전송
- 앱이 요청 시에 보내줬던 구분자로 구분된 aesKey 및 iv: "x5tg8#k2p9q7|c2s1dt6dd@"
- 앱이 요청 시에 보내줬던 iv: "c2s1dt6dd@"
- 사용자 데이터: "내 신용카드 번호는 1234-5678-9012-3456"
- 대칭키로 암호화된 사용자 데이터: "a7f3d8c2e5b1..."
2. 앱으로 전송
- 공개키로 암호화된 대칭키
- 대칭키로 암호화된 사용자 데이터
=========================================
<앱 동작>
1. 자신이 서버로 요청했을 때 보냈던 대칭키를 이용하여 복호화(AES)
- 그 대칭키로 복호화된 데이터: "내 신용카드 번호는 1234-5678-9012-3456"
비대칭 암호화에서 개인키로 암호화하고 공개키로 복호화하면 안 되는 이유
- 공개키는 누구나 접근할 수 있기 때문에, 기밀성 보장이라는 암호화의 목적을 달성할 수 없다.
예를 들어, 서버가 자신의 개인키로 데이터(대칭키, 사용자 데이터 등)를 암호화하여 앱에 전송하면, 앱뿐만 아니라 공개키를 가진 모든 사람이 그 데이터를 복호화할 수 있다.
- 비대칭키 암호화에서 기밀성 보장은 수신자의 공개키로 암호화, 수신자의 개인키로 복호화하는 구조에서만 성립한다.
송신자가 자신의 개인키로 암호화하는 방식은 '서명'에 해당하며, 데이터의 무결성이나 송신자 인증에는 사용할 수 있지만, 데이터의 기밀성(비밀성) 보장에는 적합하지 않다.