티스토리 뷰
블록체인을 공부하며 문뜩 든 생각이 있었습니다. 분산컴퓨팅을 활용해 지갑의 주소로부터 privateKey를 얻어올 수 있는가 라는 의문이 들었습니다. 만약 private key를 브루트포싱으로 얻을 수 있다면 몇년간 거래가 없었던(누군가 잃어버린) 주소의 코인을 해변가에서 금속 동전을 찾듯이 회수할 수 있지 않을까 라는 궁금증이 생겼습니다.
지갑 주소의 생성 과정
우선 방법에 대해 알아보기전에 이더리움 주소의 생성 과정에 대해 알아보도록 하겠습니다. 우선 이더리움 주소의 생성과정은 간단하게 privateKey -> public key -> address 순으로 생성됩니다.
privateKey 는 HEX 값으로 구성된 64자리의 랜덤값으로 생성한 뒤에 타원곡선 암호화 알고리즘(ECDSA)으로 privateKey로부터 공개키를 생성합니다. 그리고 마지막으로 공개키를 해싱(Keccak-256) 하여 뒤에서 40자리만 가져온 것이 우리가 사용하는 지갑의 주소입니다.
이처럼 지갑 주소는 private key를 두번 해시하고 일부를 잘라낸 값이므로 공개키로부터 private key를 얻어내기란 불가능에 가깝다고 볼 수 있습니다.
브루트포싱을 통한 지갑 해킹
사실 지갑의 원리는 이미 만들어져 있는 지갑을 가져오는 것이라 볼 수 있습니다. 또한 지갑을 생성할 때 중복을 방지하는 방지책이 없어 정말 운이 안좋다면(?) 누군가 사용하던 지갑이 생성될 수 있습니다. 따라서 랜덤한 private key를 대입해서 지갑을 해킹하는 것은 불가능한 이야기는 아닙니다.
그렇다면 랜덤하게 private key를 대입하여 누군가 사용하고 있는 지갑을 얻어낼 확률은 어느정도 되는지 단순하게 계산해보도록 하겠습니다.
HEX값으로 구성된 private key의 각 글자를 구성할 수 있는 범위는 = 알파벳(A~F) + 숫자(0~9) = 16이며 pirvate key의 길이는 64자리이므로 생성 가능한 privateKey의 개수는 16의 64승이 됩니다. 이를 계산하면 11579209e+70입니다. 숫자가 너무 길어서 Scientific notation을 사용하여 표현하였습니다. 생성 가능한 private key 수는 11579209e+70이라는 어마어마한 숫자 입니다.
이렇게 보면 잘 와닿지 않으니 이 private key를 전부 해독하는대에 시간이 얼마나 소요되는지 알아보겠습니다.
private key를 생성하고 이더리움이 들어있는지 확인하는 봇을 작성하여 돌린다고 가정하면 1초당 약 730만개를 해독할 수 있다고 합니다. 환경과 알고리즘에 따라 많이 달라지겠지만 730만개도 충분히 많은 것 같으니 이렇게 가정하여 계산하도록 하겠습니다.
스크립트를 멈추지 않고 1년동안 꾸준히 돌린다면 730만 x 60 x 60 x 24 x 365 = 2302128e+8개 입니다. 생성가능한 private key를 1년에 해독가능한 private key 수로 나누면 5.029785e+62년이라는 계산이 나오게 됩니다. 즉 모든 private key 값을 탐색하여 지갑에 들어있는 코인들을 얻으려면 5.029785e+62년 이라는 시간이 걸린다는 계산이 나오게 됩니다.
분산 컴퓨팅을 사용한다고 하더라도 5.029785e+62개의 컴퓨터를 1년동안 쉴새없이 돌려야 하는 천문학적인 자원과 시간이 필요합니다. 아마 얻을 수 있는 코인의 가치보다 필요한 자원의 비용이 더 많을 것 같습니다.
결론!
가능은 하지만 천문학적인 비용과 시간이 필요하다! 하지만 양자 컴퓨터가 나온다면 이야기는 달라지겠죠?
'프로그래밍 > 이더리움' 카테고리의 다른 글
이더리움 transaction의 nonce란? (391) | 2019.05.02 |
---|---|
암호화폐의 현실 화폐로써의 문제점 (398) | 2019.03.15 |
이더리움 - 스마트 컨트랙트 간단히 살펴보기 (421) | 2018.06.16 |