Geth - 타원곡선(ECC) 알고리즘과 Address 생성

CHOYEAH·2023년 11월 26일
0

Go ethreume

목록 보기
3/11

1. 타원곡선의 기본 이해

타원곡선은 y^2 = x^3 + ax + b 형태의 방정식으로 표현된다.
이때, a와 b는 곡선의 형태를 결정하는 매개변수다.

2. 타원곡선 상의 점 연산

점 연산은 타원곡선 위의 특정 점들을 연결하는 과정이다.
이 연산은 주로 두 가지 유형으로 나뉜다.

  • 점 덧셈(Point Addition)
  • 스칼라 곱셈(Scalar Multiplication)

2.1 점 덧셈(Point Addition)

  • 점 덧셈은 타원곡선 상의 두 점 ( P )와 ( Q )를 더해 새로운 점 ( R )을 찾는 과정이다. 이때 ( R = P + Q )로 표현된다.

2.2 스칼라 곱셈(Scalar Multiplication)

  • 스칼라 곱셈은 타원곡선 상의 한 점 ( P )를 정수 ( k )만큼 더하는 과정이다. 즉, ( kP )는 ( P )를 ( k )번 더한 것이다.

점 연산의 예시

  1. ( P )와 ( Q )를 연결하는 직선을 그리고, 이 직선이 타원곡선과 만나는 점 ( R )을 찾는다. 이때 ( P + Q + R = 0 )이 되어야 한다.

  2. 시작점은 ( P )와 ( Q )가 중근을 갖는 점을 선택한다. 이때 ( P = Q )이며, 결과적으로 ( R )은 (-2P)가 된다.

  3. (-2P)의 x축 대칭인 ( 2P )를 구한다. (여기까지가 한 사이클)

  4. 이후 점 ( 2P )와 ( P )에 직선을 긋고, 타원곡선에 닿는 ( R )값을 찾는다. 이때 ( R = -3P )가 되며, (-3P)의 x축 대칭인 ( 3P )를 구한다. (두 번째 사이클)

이런 식으로 새로 찾아낸 r의 x축 대칭점에서 첫 P점에 직선을 그어 사이클을 무수히 반복할 수 있고 이 횟수가 (K)이자 기본키의 개념이다.

3. 개인키와 공개키의 관계

  • 개인키( k )는 보통 무작위로 생성된 숫자이다.
  • 개인키 값은 1부터 ( n - 1 )까지이며, 여기서 ( n )은 타원 곡선의 order를 의미한다. SECP256K1의 경우, ( n )의 값은 약 ( 1.157920892373162e77 - 1 )이다.

    1.157920892373162e+77-1을 대략 나열하면 이정도..
    115,792,089,237,316,195,423,570,985,008,687,907,853,269,984,665,640,564,039,457,584,007,913,129,639,936

  • 생성자 점 ( G )또는 ( P )와 개인키 ( k )를 곱한 결과가 공개키( kG )가 된다.
  • 이 과정은 이산 로그 문제에 기반을 두고 있으며, 공개키를 통해 개인키를 유추하기는 현재의 컴퓨터 성능상 불가능하다고 볼 수 있다.

4. 주소 생성

4.1 주소의 형태

주소는 보통 0x로 시작하며, 40자리의 16진수로 구성된다. 예시: 0x4675C7e5BaAFBFFbca748158bEcBA61ef3b0a263.

4.2 주소 생성 과정

컴퓨터 시스템에서 1부터 ( 1.157920892373162e77 - 1 ) 범위에서 개인키 ( K )를 무작위로 선택하고, 이 개인키 ( K )에 생성자 점 ( G )를 곱하여 공개키 ( KG )를 만든다. 이어서, 이 공개키를 Keccak-256 함수로 해시하여 결과의 마지막 20바이트를 주소 값으로 사용한다. 16진수로 표현하고 16진수는 1바이트를 두 자리로 표현하므로 40자리 길이가 되며 가장 앞에 0x를 붙인다.

주소는 엄청난 규모의 범위에 속한 숨겨진 계좌의 좌표라 할 수 있겠다.
좌표를 모르면 계정을 찾는 유일한 방법은 모든 좌표를 하나하나 방문해보는 방법밖에 없다.

4.3 geth 콘솔에서 address 생성

> personal.newAccount("비밀번호")
"0x0415cbb95290905c1373cf2e29bce0321f9d347d"

6. keystore

6.1 keystore란

Geth (Go Ethereum)에서 주소를 생성할 때, 관련된 개인키는 키스토어 파일에 안전하게 저장된다.
이 키스토어 파일은 개인키를 보호하기 위해 중요한 역할을 한다.

키스토어 파일의 정의: 키스토어 파일은 사용자의 개인키를 암호화하여 저장하는 JSON 형식의 파일, 이 파일은 암호화된 개인키를 포함하며, 이를 사용하여 이더리움 네트워크 상에서 트랜잭션에 서명할 수 있다.

암호화 방식: 키스토어 파일은 개인키를 보호하기 위해 강력한 암호화 기법을 사용, 일반적으로 AES 암호화 방식과 함께 키 파생 함수(PBKDF2 또는 Scrypt)를 사용하여 개인키를 암호화한다.

패스워드 보호: 키스토어 파일은 사용자가 설정한 비밀번호로 보호된다. 이 비밀번호는 개인키를 암호화 및 복호화하는 데 사용된다. 키스토어 파일에 접근할 수 없으므로 매우 중요하다.

파일 위치 및 관리: Geth를 사용할 때, 키스토어 파일은 일반적으로 Geth 데이터 디렉터리의 'keystore' 폴더에 위치한다. 파일 관리에 주의를 기울여야 하며, 백업 및 보안을 위한 적절한 조치를 취해야 한다.

복구 및 이전: 키스토어 파일을 다른 컴퓨터나 지갑으로 이전할 수 있다. 이를 통해 사용자는 다른 환경에서도 이더리움 자산에 접근할 수 있다. 다만, 이 과정에서 보안에 주의해야 한다.

6.2 keystore 구조

{
  "address": "0415cbb95290905c1373cf2e29bce0321f9d347d", // address
  "crypto": {
    "cipher": "aes-128-ctr", // 개인키 암호화에 사용한 알고리즘
    "ciphertext": "2d591c99e6b91a11cca74a6671343edc3dbd2a1537f5fd99c5caf2121e6caeaa", // 암호화된 개인키 
    "cipherparams": { "iv": "f97dcc566b1a413a5566e5f35786ea96" }, // 개인키 암호화 알고리즘에 사용한 매개변수 
    "kdf": "scrypt", // 키스토어 패스워드 암호화에 사용한 알고리즘
    "kdfparams": { // 키스토어 패스워드 암호화에 알고리즘의 매개변수 
      "dklen": 32,
      "n": 262144,
      "p": 1,
      "r": 8,
      "salt": "3f76027178f7067181ab689bc450915bdb48be706972dac2635dd5d5ca9418c1"
    },
    // 키스토어 패스워드를 암호화한 값과 개인키를 안호화한 값을 해싱하면 mac 값이된다.
    // 향후 패스워드를 입력해 키스토어를 사용할때 mac 값은 검증 용도로 사용된다.
    "mac": "490d4d07858f9195510fdc578f6626c3c565d02d3058d42837208aeb53baada0"
  },
  "id": "91367386-4bdd-4b2c-b323-122978ac15fb",
  "version": 3
}
profile
Move fast & break things

0개의 댓글