일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 백준 특정한 최단 경로
- java 파티
- 백준 연결요소 자바
- kotiln const
- java 1238
- ipfs bean
- mongodb lookup
- java 백준 1509
- spring mongoTemplate
- nodejs rabbitmq
- 자바 1676
- 백준 1504 java
- Java Call By Refernce
- spring mongodb
- Spring ipfs
- 안정해시
- spring mongoTemplate switch
- ipfs singletone
- 자바 백준 팩토리얼 개수
- 익명 객체 @transactional
- 백준 2252 줄세우기
- javav 1676
- kotiln const val
- go
- kotiln functional interface
- spring mongodb switch
- java 1509
- java 팩토리얼 개수
- 전략 패턴이란
- rabbitmq 싱글톤
- Today
- Total
공부 흔적남기기
비대칭키 예시 (https 통신, Blockchain 예시) 본문
최근 출퇴근길에 심심해서 공부하고 있는 주제 비대칭키
먼저 좀 더 쉬운 대칭키를 떠올려보면 간단하다 . "i want to go home" 이라는 문자열을 "A"로 암호화하면
"abcd"라는 문자열이 나온다고 가정하면 "abcd" 를 "A"로 복호화하면 "i want to go home"이라는 문자열이 나오는 것이다.
즉 "i want to go home"(message) <=> "A"(대칭키) <=> "abcd" 라는 구조로 볼 수 있겠다.
그럼 좀 더 복잡한 공개키 구조 즉 비대칭 키를 알아보면 비대칭키는 암호화하는 key와 복호화하는 key가 다르다고 생각하면 된다. 위 예와 비교해 보면 "i want to go home"이라는 message를 암호화하는데 "A"라는 key를 사용해서 "abcd"라는 값이 나왔고 "abcd"를 복호화 할때에는 "B"를 사용해 하는 것이다.
즉 "i want to go home" => "A"(암호화 키) => "abcd"
"abcd" => "B"(복호화 키) => "i want to go home"
이떄 암호화하는 키가 private key가 되고 복호화 키가 public key가 될 수 도있고
복호화하는 키가 private key가 되고 복호화하는 키가 pulbic key가 될 수 도 있다.
이런 경우가 2가지이기 떄문에 나도 2가지 예시를 드는 것이다.
이때 private key를 통해 public key는 restore 할 수있지만 public key에서는 private를 restore 하지 못한다 -> 당연한 이야기
밑에서 =>는 암호화 및 복호화를 의미합니다.
먼저 https에서는 대칭키와 비대칭 구조를 둘다 사용하는데 글로 쓰자니 복잡하지만 그냥 쓰겠다.
1. handshake를 통해 서로의 public key( 암호화 키를 교환한다.)
2. 그럼 서로의 public key(통신 대상의 암호화 키)로 대칭키(packet을 해독하는 테이블이라고 보면 됨) 를 만들어서 서로에게 보낸 후 각자 가지고 있는 private key(통신 상대에게 보내준 public key에 상응하는 복호화 키)를 통해 복호화 한다음 서로 가진 대칭키로 암호화해서 데이터를 주고 받는다.
이런 구조를 가지게 된 이유는 대칭키가 처음에 도난 당할 수도 있고 비대칭 키를 계속 사용하자니 암호화, 복호화의 cost가 많이 들기때문에 비대칭키를 통해 대칭키를 안전하게 만든 후 좀 더 cost가 낮은 대칭키를 사용하기 위함임
public key => 대칭키 암호화 => 암호화된 대칭키
암호화된 대칭키 => private key => 대칭키
서로 가진 대칭키를 통해 통신
두번째로 blockchain에서도 비대칭키를 사용하는데
A가 B에게 3코인을 보내고 싶다고 가정하자 A의 지갑에는 총 4코인이 존재한다.
A가 B에게 코인을 보내기 위해선 transaction을 만들어야 한다.
A의 코인계좌를 publickey라고 가정하자.
1. A는 자신의 private key(암호화 키)를 이용하여 3코인을 B에게 보낼 것이다라는 메세지를 암호한다.
2. 블록체인 서비스가 암호화된 메세지를 꺼내 A의 코인계좌번호(public key)를 가져와 복호화하여 A가 보낸게 맞는지 확인 하여 거래를 검증할 것이다.
private key => 송금 할때 내가 보낸 것이라는 것을 서명 => signature
signature => public key(계좌번호) => transaction 검증 완료
blockchain에 대한 코드는
https://github.com/rlaalsrl715/nomadcoin/blob/master/wallet/wallet.go
참고하세요.
음 최대한 간단하게 쓰기 위해 block chain과 https의 내용이 약간 틀릴 수 있으나 private key와 public key를 중심적으로 보면 좋을 듯.
간단한 예시라 적어 놓고 설명도 좀 부실하고 복잡하기만 한 것 같지만 화이팅.
'web study > 배경지식' 카테고리의 다른 글
템플릿 메서드 패턴이란 (0) | 2023.05.22 |
---|---|
Sentry 적용시 기본 설정 (0) | 2023.04.14 |
adapter Pattern (Go middleware 사용법) (0) | 2023.02.27 |
CORS와 SOP란? Spring security와 MVC에 적용하는 법 (0) | 2022.02.13 |
SQL과 ORM이란 무엇일까? (0) | 2022.02.06 |