바벨의 규장각 - 30314이도이

주제: 바벨의 규장각을 통해 본 정보 이론과 암호학의 융합

1. 개요

나는 호르헤 루이스 보르헤스(Jorge Luis Borges)의 단편 소설 <바벨의 도서관>에서 영감받아, 이를 한국어로 구현한 정적 웹사이트 프로젝트 ’바벨의 규장각’을 기획하고 개발했다.

*

’바벨의 도서관’에는 셀 수 없을 만큼 많은 책이 존재하며, 모든 책은 같은 형식으로 이루어져 있다. 각 책에는 410쪽의 페이지가 있고, 한 페이지에는 40행의 글이 있으며, 한 행에는 80개의 글자가 들어간다. 또한 책에 사용되는 문자는 알파벳과 마침표, 쉼표, 공백을 포함한 25종류로 한정되어 있다.

나는 여기에서 한글에 주목했다. 알파벳을 조합하여 표현할 수 있는 경우의 수에 비해, 한글은 한 글자만으로도 훨씬 많은 정보를 표현할 수 있다. 따라서 같은 분량의 글이라도 한글을 사용하면 더 많은 내용을 담을 수 있을 것이라는 생각을 하게 되었다. 이러한 생각을 바탕으로 ’바벨의 도서관’을 한국어로 재해석한 ’바벨의 규장각’을 만들었다.

’바벨의 규장각’에서는 가능한 모든 200글자의 한국어 문장이 각각 하나의 페이지가 되고, 이러한 페이지들이 모여 무한한 도서관을 이루는 것을 상상했다. 어떤 문장이든 그 문장이 존재하는 페이지를 찾아볼 수 있도록 하였으며, 도서관의 모든 페이지에는 방-벽-책장-책-페이지 라는 고유한 위치가 부여된다. 이를 통해 실제로 존재하지 않는 무한한 도서관을 웹상에서 탐색할 수 있도록 구현했다.

2. 진법 변환과 공간의 구조화

2.1. 독립적인 두 가지 문자 체계 (Base System)

이 도서관의 방 이름과 본문 내용을 효율적으로 처리하기 위해, 나는 서로 다른 두 개의 진법 체계를 설계하여 적용했다.

2.2. 좌표계 구조

나는 도서관의 위계적인 구조를 다음과 같은 좌표계로 이루어지도록 구성했다.

부분 값 범위 밑수 (Base)
Room (방) 11,234진수 문자열 11,234
Wall (벽) 1 ~ 8 8
Shelf (선반) 1 ~ 4 4
Book (책) 1 ~ 32 32
Page (쪽) 1 ~ 1000 1000

3. Feistel 암호를 통한 가역적 맵핑

내가 개발한 바벨의 규장각의 핵심 심장부는 utils.js에 직접 구현한 Feistel 암호(Feistel Cipher) 알고리즘이다. 나는 이 암호화 방식을 통해 어떤 본문이든 고유한 좌표로 매핑하고, 반대로 좌표를 통해 원래의 본문으로 정확히 되돌리는 가역적 특성을 보장하도록 시스템을 구축했다.

3.1. Feistel 구조의 작동 방식

3.2. 데이터의 흐름

4. 검색 알고리즘과 확률적 재현

바벨의 도서관에서 “모든 문장이 존재한다”는 논리적 개념을 실현하기 위해, 나는 search.js에 다음과 같은 검색 알고리즘을 구현했다.

5. 제작 도중 겪은 어려움

5.1 Feistel 암호 알고리즘을 선택한 이유

처음에는 책의 주소를 정수로 하고, 그 정수를 단순히 글자로 변환할 생각이었다.
하지만, 그렇게 구현된 도서관은 전혀 흥미롭지 않았다.

가령 첫 번째 책을 보자면,
첫 번째 페이지에는 ” ”
두 번째 페이지에는 “가” 한글자
세 번쨰 페이지에는 “갸” 한글자

이런식으로 그저 한글이 나열된 형태였다.

이것은 책의 배열과 내용이 무작위적이라는 바벨의 도서관의 묘사와는 일치하지 않을 뿐 더러 흥미롭지도, 신기하지도 않다.

그래서 나는 하나의 수에서 다른 하나의 수로 변환하되, 그 변환이 완전 무작위적이고 또한 가역적인 알고리즘을 찾았다. 그리고 그 결과로 Feistel 암호 알고리즘을 알게 되었다.

하지만 Feistel 알고리즘을 적용하는 것만으로는 부족했다. Feistel 알고리즘에는 입력 수 말고도 그 무작위성을 위한 소수의 배열이 필요한데, 단순히 몇개만 사용해서는 처음에 “가”, “갸”, “거”, … 와 똑같지는 않지만, 여전히 비슷한 내용이 계속 바로 옆 페이지에서 발견되고는 했다.

Feistel 알고리즘의 결과가 완전 무작위적으로 보이게 하려고, 많은 소수를 만들고, 적용하고 테스트한 결과, 지금의 소수 목록을 얻을 수 있었다.

5.2 첫 글자가 거의 항상 !인 문제

제작 도중, 첫 번째 글자가 ! 인 페이지가 대부분이라는 것을 깨달았다.

책의 좌표와 쪽수를 페이지의 내용으로 변환하는 수식을 살펴보았다. 책의 좌표 한곗값과 페이지 내용을 수로 변환한 값의 한계가 불일치했고, 그중 더 큰 쪽이 다른 한쪽을 나누어떨어진 나머지가 1이어서 1에 해당하는 문자인 !가 자주 출력이 됐던 것을 알아낼 수 있었다.

이를 해결하기 위해, 책의 좌표를 수로 변환한 결과(a)가 책 내용을 수로 변환한 최댓값(b)보다 크다면, a를 b보다 작아질 때까지 Feistel 알고리즘을 적용해 첫 글자가 !가 아니면서도, 결과를 균일하게 분포시켜 몇몇 문자가 더 자주 나오는 상황을 방지할 수 있었다.

6. 결론 및 융합적 의의

이번 프로젝트를 통해 문학적인 아이디어를 실제 프로그램으로 구현하는 과정에서 수학과 컴퓨터 과학이 서로 밀접하게 연결되어 있다는 것을 알게 되었다. 특히 문자열을 수로 표현하고 진법 변환과 Feistel 암호를 이용해 좌표로 변환하는 과정을 직접 설계하면서, 단순히 알고리즘을 사용하는 것을 넘어 수학적 구조가 프로그램의 결과에 어떤 영향을 주는지 이해할 수 있었다. 또한 구현 과정에서 예상하지 못한 특정 문자의 편중 문제를 직접 발견하고 원인을 분석하여 해결하면서, 프로그램을 만들 때 결과를 관찰하고 수학적으로 원인을 찾아가는 과정이 중요하다는 것도 배웠다.

프로젝트를 진행하며 새롭게 알게 된 정보와 탐구 과정에서 얻은 지식은 개인적으로 다시 정리하여 글로 작성하고 블로그에 배포하였다. 이를 통해 배운 내용을 단순히 이해하는 데 그치지 않고, 다른 사람이 읽을 수 있는 형태로 정리하고 설명하는 경험을 할 수 있었다. 특히 탐구 과정에서 얻은 개념과 구현 방법을 글로 다시 정리하면서 내가 이해한 내용을 점검하고, 복잡한 내용을 더욱 명확하게 전달하는 능력도 기를 수 있었다.

앞으로는 이번 프로젝트에서 사용한 Feistel 구조를 더 깊이 탐구하여 실제 보안에 사용되는 가역 암호화 알고리즘에 관련된 탐구와, 실제 암호학에서 사용되는 블록 암호와 비교해 보고, 입력 데이터가 얼마나 균일하게 분포하는지 통계적으로 분석하거나 더 효율적인 검색 및 데이터 표현 방법을 적용해 보고 싶다. 이를 통해 이번 프로젝트를 단순한 웹사이트 제작에서 끝내지 않고, 정보의 표현과 변환, 무작위성에 관한 수학적 탐구로 더 발전시키고자 한다.

7. 프로젝트 관련 링크

7.2. References