KOROMOON

착한 사마리아인이 되고 싶습니다.

1/28/2021

Base58


( 1 ) 설명


Base58 인코딩 체계는 바이너리 데이터를 텍스트 문자열로 변환할 수 있다는 점에서 Base64 인코딩 체계와 유사함.

그러나 정보를 오류없이 시각적으로 확인해야 하는 환경에서 변환 알파벳을 신중하게 선택했다는 점이 Base64 와 다름.



Base64 가 고려하지 않는 여러 사용성 특성을 염두를 두고 설계됨.


첫째, 0(숫자 0), O(알파벳 O), I(알파벳 I), l(알파벳 소문자 L) 과 같이 비슷한 모양의 문자가 생략됨.

이렇게 하면 인간이 유사한 문자를 잘못된 문자로 착각할 가능성이 없음.


둘째, 추가 시스템별 인코딩 체계 없이도 모든 최신 파일 시스템 및 URL 체계에서 Base58 값을 사용할 수 있도록 영문자가 아닌 문자 +(더하기), =(같음) 및 /(슬래시)가 생략됨.


셋째, 영문자 숫자만 사용하여 최신 컴퓨터 인터페이스에서 쉽게 더블 클릭 또는 더블 탭 선택이 가능함.


넷째, 소셜 메시징 시스템은 영숫자 문자열에 줄바꿈이 없으므로 시스템을 디버깅할 때 Base58 값을 전자 메일로 보내거나 메시지를 보내기가 더 쉬움.


다섯째, Base64 와 달리 바이트 패팅이 없으므로 많은 Base58 값이 (평균적으로) 더 작게 만들거나 최대 64 바이트 값의 경우 Base64 값과 크기가 같고 더 큰 값의 경우 2% 미민임.


마지막으로 Base64 에는 다양한 Base64 를 사용할 개발자 사이에 혼란을 야기하는 11가지 인코딩 변형이 있음.

이 사양은 Base58 에 대한 간단한 메커니즘이 하나뿐이므로 구현 및 개발자 상호 작용을 더 간단하게 만듬.


Base58 에는 유용한 유용성 기능이 많이 있지만 인코딩 형식으로는 항상 좋은 선택은 아님.

예를 들어 많은 양의 데이터를 인코딩할 때 Base64 보다 2% 덜 효율적임.

개발자는 대규모 데이터 세트에 대해 2% 효율성 향상이 필요한 경우 Base58 을 피할 수 있음.


이 문서는 접근 방식의 이점, 인코딩 및 디코딩 알고리즘, 대체 알파벳, 보안 고려 사항에 대한 소개를 포함하여 Base58 인코딩 체계를 지정함.




( 2 ) Base58 알파벳


Base58 알파벳은 다음 문자로 구성됨.


123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz


0 ~ 57 까지의 각 바이트 값은 다음과 같은 방식으로 위의 알파벳과 매핑됨.


바이트

문자

바이트

문자

바이트

문자

바이트

문자

0

1

15

G

30

X

45

n

1

2

16

H

31

Y

46

o

2

3

17

J

32

Z

47

p

3

4

18

K

33

a

48

q

4

5

19

L

34

b

49

r

5

6

20

M

35

c

50

s

6

7

21

N

36

d

51

t

7

8

22

P

37

e

52

u

8

9

23

Q

38

f

53

v

9

A

24

R

39

g

54

w

10

B

25

S

40

h

55

x

11

C

26

T

41

i

56

y

12

D

27

U

42

j

57

z

13

E

28

V

43

k

 

 

14

F

29

W

44

m

 

 


Ripple 알파벳 및 Flickr 알파벳과 같은 Base58 에 대한 다른 어플리케이션 별 알파벳이 있음.

이러한 알파벳은 자체 어플리케이션 공간에서 유효하지만 이 사양에 유효한 인코딩 형식이 아니며 사용해서는 안됨.

둘 이상의 Base58 인코딩 알파벳을 지원하면 상호 운용성이 손상됨.




( 3 ) Base58 인코딩 알고리즘


바이트 배열은 Base58 로 인코딩된 값으로 인코딩할려면 다음 알고리즘을 실행함.

모든 수학 연산은 정수 연산을 사용하여 수행해야 함.

'zero_counter' 를 0 (0x0) 으로, 'encoding_flag' 를 0 (0x0) 으로, 'b58_bytes' 배열, 'b58_encoding' 배열, 'carry' 값을 0 (0x0) 으로 초기화하여 시작함.

바이트 배열의 각 바이트에 대해 첫 번째 반복 후 'carry' 는 0 (0x0) 과 같지 않음.


1. 'encoding_flag' 가 설정되어 있지 않고 바이트가 0 (0x0) 이면 'zero_counter' 값을 증가시킴.

값이 0 (0x0) 이 아니면 'encoding_flag' 를 true (0x1) 로 설정함.

2. 'encoding_flag' 가 설정된 경우 현재 바이트 값에 256 을 곱하고 'carry' 에 추가함.

3. 'b58_bytes' 의 해당 바이트 값을 'carry' modulus 58 의 값으로 설정함.

4. 'carry' 를 58 로 나눈 값으로 설정함.


'b58_bytes' 배열이 생성되면 다음 알고리즘을 사용하여 최종 'b58_encoding' 을 생성함.

'b58_encoding' 의 첫 번째 'zero_counter' 바이트를 '1' 로 설정함.

그런 다음 'b58_array' 의 모든 바이트에 대해 이전 섹션의 Base58 알파벳을 사용하여 바이트 값을 'b58_encoding' 의 해당 문자에 매핑함.

입력 된 바이트 배열의 Base58 표현으로 'b58_encoding' 을 반환함.




( 4 ) Base58 디코딩 알고리즘


Base58 로 인코딩 된 바이트 배열을 디코딩 된 바이트 배열로 디코딩하려면 다음 알고리즘을 실행함.

모든 수학 연산은 정수 연산을 사용하여 수행해야 함.

'raw_bytes' 배열을 초기화하고 'carry' 값을 0 (0x0) 으로 초기화함.

입력 바이트 배열의 각 입력 바이트에 대해 : 


1. 입력 바이트 문자와 관련된 바이트 값으로 'carry' 를 설정함.

매핑이 없는 경우 오류 코드를 반환함.

2. 'carry' 는 0 이 아니며 입력 바이트가 남아 있음.

  + 입력 바이트 값에 58 을 곱하고 'carry' 에 더함.

  + 출력 바이트 값을 'carry' modulus 256 으로 설정함.

  + 'carry' 를 256 으로 나눈 값으로 설정함.

3. 'raw_bytes' 의 해당 바이트 값을 'carry' modulus 58 의 값으로 설정함.

4. 'carry' 를 58 로 나눈 값으로 설정함.




( 5 ) 사용예





참고 사이트 : 

https://tools.ietf.org/id/draft-msporny-base58-01.html#encode


댓글 없음:

댓글 쓰기