( 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
댓글 없음:
댓글 쓰기