[밑바닥비트코인] 1. 유한체(Finite field)

2021. 7. 4. 16:24Blockchain

[밑바닥비트코인]이 붙은 게시물은 모두 <밑바닥부터 시작하는 비트코인, 송재준(Jimmy Song), 2019, 한빛미디어>를

 

참조하였음을 밝힙니다. 

 

이번 장에서는 비트코인에서 쓰이는 암호화 기법을 이해하기 위해서 선행되어야하는

 

수학적 기반들에 대해서 살펴보도록 하겠다.

 

 

유한체(Finite field)


유한체의 조건은 다음과 같다. 

1. 집합에서 +, * 연산에 대해서 닫혀있다. 

2. 집합 내에 0으로 표기하는 원소가 존재하여, 집합 내의 원소 a에 대해 a+0 = a 를 만족한다. (+에 대한 항등원)

3. 집합 내에 1으로 표기하는 원소가 존재하여, 집합 내의 원소 a에 대해 a*1 = a 를 만족한다. (*에 대한 항등원)

4. a+b = 0 을 만족시키는 원소 b가 집합 내에 존재하고 이를 -a로 표기한다. (+에 대한 역원 존재)

5. a*b = 1 을 만족시키는 원소 b가 집합 내에 존재하고 이를 a^-1로 표기한다. (*에 대한 역원 존재)

6. 유한체에서 원소의 개수는 유한하다. 

 

유한체는 유한하기 때문에 유한체의 크기를 나타내는 수 p가 존재한다. 이를 위수라고 한다.

 

위수는 반드시 소수여야 하는데, 이 이유는 나중에 설명하겠다. 

 

출처 : https://medium.com/@blockchainabhi/division-and-fermat-9040147a1e7c

 

유한체는 표기하는 예시이다. F 옆에 위수를 , { } 내에 각 원소를 늘어놓는다. 0, 1, 2는 실제 원소의 값이 아니라 

 

각기 다른 원소임을 나타낸 것이다. 0부터 16까지 총 17개의 원소가 존재한다. 

 

유한체를 파이썬 코드로 나타내보자.

class FieldElement:

    def __init__(self, num, prime):
        if num >= prime or num < 0:
            error = 'Num {} not in field range 0 to {}'.format(num, prime-1)
            raise ValueError(error)
        self.num = num
        self.prime = prime

    def __repr__(self):
        return 'FieldElement_{}({})'.format(self.prime, self.num)

    def __eq__(self, other):
        if other is None:
            return False
        return self.num == other.num and self.prime == other.prime

유한체 원소를 나타내는 FieldElement 클래스는 num(원소)과 prime(위수)를 멤버변수로 갖는다. 

 

생성자 함수에서 위수의 범위를 벗어나면 에러를 출력시킨다. 

 

__repr__ 함수에서 위와 같이 위수와 원소를 표시해주고, __ep__ 함수로 == 연산자를 재정의한다. 

 

다른 객체의 원소와 위수 둘다 일치하면 True를 반환한다. 

from FieldElement import FieldElement

if __name__ == '__main__':
    element1 = FieldElement(6, 17)
    element2 = FieldElement(6, 17)

    print(element1)
    print(element2)

    print(element1==element2)
결과값>>>
FieldElement_17(6)
FieldElement_17(6)
True