챕터 4 : 암호학
출판 시점 기준 이더리움 프로토콜의 어떤 부분도 암호화되어있지 않다.
따라서 누구나 내용을 읽고 확인할 수 있다.
향후에는 영 지식 증명이나 동형 암호화 같은 고급 암호화 도구를 사용하여 암호화된 계산을 블록체인에 기록할 수 있을 것이다.
암호화 도구를 제공할 준비는 마쳤으나 아직 배포되지는 않았다.
이 책이 19년도 5월 초판이다. 원본은 18년 12월 23일 발행.
(생각보다 번역본이 빨리 나왔다 신기...)
지금이 21년 5월 10일이니 2년반이 지났는데, 서칭을 해보니 지금도 아직 적용이 안된 것 같다.
다만 이더리움 네트워크 위에서 동형암호를 이용한 서비스들은 가능한 것 같다.
www.dbpia.co.kr/Journal/articleDetail?nodeId=NODE07612298
이 장에서는 이더리움에서 사용하는 암호방식, 즉 개인키와 주소의 형태로 자금의 소유권을 제어하는 데 사용되는 공개키 암호화(Public Key Cryptography,PKC)를 소개한다.
키와 주소
이더리움은 외부 소유 계정(EOA)과 컨트랙트(contract)라는 두 가지 유형의 계정이 있다.
디지털 개인키(private key), 이더리움 주소(Ethereum address), 디지털 서명(digital signature)을 통해 외부 소유 계정의 이더 소유권을 확립한다. 계정 주소는 개인키에서 직접 파생되고, 개인키는 계정(account)라고도 불리는 단일 이더리움 주소를 고유하게 결정한다.
이더리움에서 사용하는 것과 같은 공개키 암호화 기반 시스템에서 키는 개인(비밀)키와 공개키로 구성된 쌍으로 제공한다.
공개키는 은행 계좌 번호와 개인키는 PIN(개인 식별 번호)과 유사하다고 생각해 보자.
개인키 자체는 이더리움 사용자에게 드러나는 경우가 거의 없다. 대부분 암호화된 형태로 특수 파일에 저장하고, 이더리움 지갑 소프트웨어로 관리한다.
이더리움 트랜잭션의 지급 부분에서 지정된 수신자는 이더리움 주소로 표시하며, 이 주소는 은행 송금의 수익자 계좌 세부 정보와 동일한 방식으로 사용한다. 이후에 자세히 볼 수 있듯이 외부 소유 계정의 이더리움 주소는 공개키-개인키 쌍의 공개키 부분에서 생성된다.
그러나 모든 이더리움 주소가 공개키-개인키 쌍을 나타내는 것은 아니다. 개인키로 뒷받침되지 않는 컨트랙트를 표시할 수도 있다.
--> 좀 헷갈릴 수 있는데 정리를 하면 개인키에서 공개키가 파생되고 거기에서 계정(이더리움 주소)가 파생된다.
공개키 암호화와 암호화폐
공개키 암호화는 비대칭 암호화라고도 하며, 두개의 키 쌍(공개키, 개인키)으로 정보를 보호한다.
이에 반해 대칭키 암호화라는게 있는데, 대칭키 암호화는 한개의 키 쌍으로 정보를 보호하는 것이다.
이는 키 쌍이 하나이기 때문에, 키 쌍을 상대에게 전달하는 과정에서 보안상의 문제가 생길 수 있다.(자세한 얘기는 다음에 따로 정리하겠다.) 이가 비대칭키를 쓰는 이유이다.
비대칭키는 계산하기는 쉽지만 그 역을 계산하기 어려운 수학 함수(타원곡선)을 바탕으로 한다.
예를 들어, 2개의 큰 소수를 곱하는 것은 아주 간단하지만, 그 역산은 어렵다.
8018009라는 숫자를 제시하고, 이것이 두 소수의 결과라고 말할 때, 그 두 수를 찾는 것이 두 수를 곱하는 것보다 어렵다.
이런 수학 함수 중 일부는 특정 정보를 알고 있을 때 쉽게 거꾸로 계산할 수 있다. 앞의 예에서 소인수 중 하나가 2003이라고 하면, 간단히 나머지 소인수를 쉽게 찾을 수 있다.(8018009 / 2003 = 4003) 이렇게 특정 정보가 있으면 쉽게 역을 구할 수 있는 함수를 트랩 도어함수라고 하며, 이러한 특정 정보를 트랩 도어라고 한다.
타원 곡선 산술에서 소수로 나눈 나머지를 곱하는 것은 간단하지만, 나눗셈(역함수)은 사실상 불가능하다. 이것을 이산 로그 문제라고 하며, 현재 알려진 트랩 도어는 없다. 타원 곡선 암호화는 최신 컴퓨터 시스템에서 광범위하게 활용되며, 이더리움(및 기타 암호화폐)에서 개인키와 디지털 서명을 사용하는 기초가 된다.
트랜잭션 내용를 개인키로 암호화하는 것을 디지털 서명이라고 한다.
디지털 서명은 우리가 카드를 사용하고 서명하는 것과 마찬가지로 본인을 인증하는 수단이다.
이는 네트워크에 뿌려진 공개키로 개인키의 주인을 특정할 수 있고, 이 디지털 서명으로인해 개인키를 넷상에 노출하지 않고도 계좌의 주인이 본인임을 증명할 수 있게 된다.
참고로
이더리움 프로토콜 자체에서는 암호화가 없기 때문에, 이러한 전송과정에서 개인키가 절대 노출되어서는 안된다.
개인키
개인키는 단순히 무작위로 선택한 숫자다. 개인키의 소유권과 제어는 해당 주소를 승인하는 컨트랙트에 대한 접근뿐만 아니라 해당 이더리움 주소와 관련된 모든 자금에 대한 사용자 제어의 근원이다. 개인키는 트랜잭션에 쓰이는 자금의 소유권을 증명함으로써 이더를 소비하는데 필요한 서명을 만드는 데 사용된다. 개인키는 항상 비밀로 유지해야 한다. 왜냐하면 개인키를 제3자에게 공개하는 행위는 개인키로 확보한 컨트랙트와 이더에 대한 제어 권한을 제3자에게 부여하는 것이나 마찬가지이기 때문이다. 개인키는 반드시 백업하여 우발적인 손실로부터 보호해야 한다. 한번 잃어버리면 되찾을 수 없으며, 해당 키로 확보한 자금도 영원히 잃어버리게 된다.
--> 블록체인 네트워크를 이용하는 사람이라면 꼭 명심해야 할 사항...
난수로 개인키 생성
키를 생성하는 가장 중요한 첫 번째 단계는 엔트로피, 즉 무작위성을 확보하는 것이다.
이더리움 개인키는 1에서 2^256 사이의 숫자로 이뤄져 있다.( 좀 더 정확히 말하면 1158*10^77까지 가능하다)
개인키는 난수생성기를 통해서 생성한다.
암호를 선택하는 것이 아닌 난수로 생성하는 이유는 이더리움의 개인키는 네트워크 통신 없이 생성이 가능하기 때문에, 다른 사람과 같은 번호를 선택할 확률이 높아진다. 그렇게 되면 다른 사람과 같은 개인키를 가지고 있을 확률이 높은 것이고, 내 지갑의 권한이 다른사람에게도 생길 수 있다는 것을 의미한다.
일반적인 OS 난수 생성기는 정말 무작위가 아니라 특정 값(시간, 키보드나 마우스의 움직임 등등)을 기준으로 생성되기 때문에, 충분한 엔트로피 원천의 시드와 함께 암호로 안전한 의사 난수 생성기(CSPRNG)를 사용하는 것이 중요하다.
실제로 안드로이드 난수 생성기에 결함이 있어 문제가 되었던적도 있다.
https://nakedsecurity.sophos.com/2013/08/12/android-random-number-flaw-implicated-in-bitcoin-thefts/
https://www.etnews.com/201308130341?m=1
공개키
이더리움 공개키는 타원 곡선에 있는 점(point)으로 타원 곡선 방정식을 만족하는 x와 y 좌표의 집합을 의미한다.
더 간단한 용어로, 이더리움 공개키는 함께 결합된 2개의 숫자다. 이 숫자는 단방향으로만 계산할 수 있다.
즉, 개인키가 있는 경우 공개키를 계산하기는 쉽지만, 공개키에서 개인키를 계산할 수는 없다.
'공개키는 사실상 비가역적인 타원 곡선 곱셈을 사용하여 개인키로부터 계산된다.'
K = k * G (K 공개키, k 개인키, G 생성자generator point)
난수로 생성한 개인키에 타원곡선 위의 한 점 G(생성자)를 곱하여 공개키를 만든다.
여기서 G는 정해진 한 점이라서, 개인키만 알면 공개키를 바로 만들 수 있게 된다.
여기서 *는 일반적인 곱셈이 아닌 타원 곡선 곱하기 연산자이다.
타원 곡선 곱하기와 일반 곱셈은 성질만 공유할 뿐 다르다.
나눗셈 같은 연산이 존재하지 않고, 역 연산이 어렵다.(책에선 우주가 허용하는 것보다 더 많은 시간이 걸린다고 한다.)
타원 곡선 곱셈의 이러한 단방향적인 성질이, 공개키로부터 개인키를 얻기 힘들게 한다.
타원 곡선 암호화 설명
타원 곡선 암호화는 타원 곡선의 점에 더하기와 곱셈으로 표현되는 이산 대수 문제를 바탕으로 한 비대칭 또는 공개키 암호화 유형이다.
타원 곡선 암호화를 이해하기 위해서 체의 개념을 이해하면 좋지만,
체란 아주 쉽게 설명해서 mod연산(프로그래밍 % 연산)을 한 집합으로 생각하면된다.
이더리움이 사용하는 타원 곡선인 secp256k1을 p = 17인 체로 나타낸다하는 것은
타원곡선의 각각의 점들을 mod17을 해서 나타낸다는 것이다.
실제로 이 곡선에서 p는 2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 -1 이다.
타원 곡선 산술 연산
앞서 타원 곡선에서의 산술이 우리가 아는 산술과 다르다고 했었고,
덧셈을 정의하면, 뺄셈, 곱셈, 나눗셈 모두를 정의할 수 있다.
타원 곡선의 덧셈은 점을 이동시키는 것으로 정의한다.
공개키 생성
앞서 공개키파트에서 말했던 식
K = k * G (K 공개키, k 개인키, G 생성자generator point)을 이용해서 공개키를 만들어본다.
k * g 의 결과가 (x, y)의 형식으로 나오면 그것을 04 + x좌표(32바이트/64(16진수)) + y좌표(32바이트/64(16진수)로 시리얼라이즈 된다.
여기서 04는 SEC에서 SECG가 제안한 표준 시리얼라이제이션 형식에서 채택된 것으로 압축되지 않은 지점을 의미한다.
타원 곡선의 점을 식별하기 위해서 시리얼라이제이션을 하는 것이지 실제 공개키는 04를 제외한 부분이다.
타원 곡선 라이브러리
타원 곡선 라이브러리에는 OpenSSL과 libsecp256k1가 있는데 libsecp256k1은 비트코인 코어에서 사용되며, OpenSSL을 대체하기 위해서 완전히 새로히 작성되었는데 성능과 보안면에서 모두 뛰어나다고 한다.
암호화 해시 함수
해시 함수는 '임의 크기의 데이터를 고정된 크이의 데이터로 매핑하는데 사용할 수 있는 모든 함수'다.
이더리움의 암호화 해시 함수 : Keccak-256
이더리움은 많은 곳에서 Keccak-256 해시 함수를 사용한다.
어떤 해시 함수를 사용하고 있는가?
어떤 해시 함수를 사용했는지 확인하는 가장 간단한 방법은 빈 문자열("")을 넣어보는 것이다.
이더리움에서 종종 SHA-3이라고 불리기는 하지만 Keccak-256을 사용한다.
이더리움 주소
이더리움 주소는 공개키 또는 컨트랙트에서 파생한 고유 식별자다.
공개키를 Keccak-256을 통해서 해싱하고, 마지막 20바이트만 유지한다.
접두어 0x로 표시되어 다음과 같이 16진수로 인코딩된 것을 볼 것이다. (본인 지갑주소 확인해보기)
0x3f41b2829fc2809e8c9070c75c9a782abfbccd5d
이더리움 주소 형식
이더리움 주소는 16진수이며, 공개키 해시의 마지막 20바이트에서 파생된 식별자다.
모든 클라이언트의 사용자 인터페이스에 내장된 체크섬을 포함하여 잘못 입력된 주소를 보호하도록 인코딩된 비트코인 주소와 달리 이더리움 주소는체크섬이 없는 원시 16진수로 표시한다.
이더리움에서는 체크섬을 시스템의 상위 계층에 맡겨두었는데, 인코딩에 여러 방법이 있다.
클라이언트 주소 상호교환 프로토콜
그 여러 방법을 알려준다.
대문자로 16진수 인코딩된 체크섬(EIP-55)
위에서 알려준 방법들의 느린 배포 때문에 EIP에서 표준을 제시했다.
대소문자를 이용하는 방법인데, 이를 이용하면 이 체크섬을 지원하지 않는 지갑도 대문자를 무시하여 쉽게 호환가능하다.
이를 지원하면 99.986%의 정확도로 오류를 감지할 수 있다.
이전 --> 0x3f41b2829fc2809e8c9070c75c9a782abfbccd5d
이후 --> 0x3f41B2829fc2809E8c9070c75c9a782AbfbCCd5d
방법은 다음과 같다.
1. 0x 접두어 없이 소문자 해시 처리
2. 해시의 해당 16진수가 0x8(16진수 8) 이상인 경우 각 해당 알파벳 문자를 대문자로 치환.(해시의 처음 20바이트/40자의 16진수, 0x제외 주소가 40자이므로 그냥 길이 맞춰서 쓰겠다는 의미/만 체크섬으로 사용)
EIP-55로 인코딩된 주소의 오류 감지
대문자를 모두 소문자로 변경하여 해싱하여 입력한 주소와 비교하여 오류를 체크한다.
한 글자만 변경되더라도 해시가 급격하게 변경되기 때문에, 값을 실수하게 되면 대문자의 위치가 달라지게 된다.
결론
이 장에서는 공개키 암호화를 간략하게 살표보고, 이더리움에서의 공개키 및 개인키 사용과 해시 함수 같은 암호화 도구를 사용하여 이더리움 주소를 만들고 검증하는 데 중점을 두었다. 또한 디지털 서명과 개인키를 공개하지 않고 개인키의 소유권을 입증할 수 있는 방법에 대해서도 살펴봤다. 5장에서는 이러한 아이디어를 종합해 지갑을 이용하여 키 수집을 관리하는 방법을 살펴볼 것이다.
1. 동형암호를 쉽고 빠르게 이해할 수 있는 영상
www.youtube.com/watch?v=hyZYef9CJTg
2. 타원 곡선 암호를 쉽게 이해할 수 있는 블로그
3. 참고하기 좋은 글
https://steemit.com/kr/@anpigon/ethereum-1
'블록체인 > 책' 카테고리의 다른 글
트랜잭션 | 마스터링 이더리움 (0) | 2021.08.13 |
---|---|
지갑 | 마스터링 이더리움 (0) | 2021.07.25 |
이더리움 클라이언트 | 마스터링 이더리움 (0) | 2021.04.24 |
이더리움 기초 | 마스터링 이더리움 (0) | 2021.04.16 |
Evolution of Economics | Economics and Math of Token Engineering and DeFi - Fundamentals of Token Economics (0) | 2021.04.16 |