You are on page 1of 32

【서식 6】작품설명서 표지

출품번호

1433

제69회 전국과학전람회

입체도형 내 삼각형의 특성을 이용한


암호화-복호화 알고리즘의 개발

2023. 8. 18.

출품학생
지도교원
구 분 학생부
출품부문 산업 및 에너지

비고 1) ‘구분’란은 학생부 또는 융합
산업 및 에너지(SW‧IT 교원⋅일반부로
분야 포함), 명기하고, ‘출품부문’란은
지구 및 환경 중 해당하는물리,부문으로
화학, 생물,
명기
2) A4용지 규격 30쪽 이내 좌철 제본용으로,
결론, 전망과학작품대회·지도논문연구대회 작품연구의 동기, 목적,
및 활용성 등을 체계적으로 기술작품설명서 작성요령 참고 연구내용, 연구과정,
3) [작성요령]
- 1 -
- 목 차 -

1. 연구목적 ·
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··1
가. 이전에 수행한 나의 연구 ·
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··1
나. 동기 및 목적 ·
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··2

2. 사전 연구 ·
·
···
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··3
가. 암호화 기법 ·
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··3
나. 삼각형의 특성 ·
·
···
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··3

3. 제작과정 ·
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··6
가. 암호화 ·
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··6
나. 복호화 ·
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··16

4. 프로그램 ·
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··19
가. 개발 환경 ·
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··19
나. 프로그램 리스트 ·
·
···
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··19

5. 프로그래밍 중 어려웠던 점 ·
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··26

6. 전망 및 활용성 ·
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··28

7. 참고자료 ·
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··
··29
1. 연구목적

가. 이전에 수행한 나의 연구

1학년 때 수행했던 창의탐구에서 기하학적인 특성을 이용해서 암호화를 하는 방법을 연구하


고 이 결과를 특허 출원하였다(출원 번호. 10-2022-0159607, 입체도형의 평면의 법선벡터를 이
용한 암호화 및 복호화 장치 및 그 방법) [1]. 기존의 암호체계가 정수론적 암호에 머물러 있었
고, 기하학적 암호는 비대칭키 암호에 제한되어 있었다. 대칭키 암호가 가지고 있는 특징을 살
리면서도 기하학적인 특징을 활용하는 기법을 만들어보고자 시작하게 되었다.
선정된 기하학적 형상은 정육면체였다. 정육면체 중에서도 한 변의 길이가 1인 정육면체를
활용하였다. 2진수로 바꿀 경우 꼭짓점에 대응시키기 편하기 때문이었다.
4자리의 숫자가 암호로 많이 사용되기 때문에 4자리 숫자에 집중하기로 하였다. 암호화할 4
자리의 숫자를 2진수로 변경하고, 0과 1로 만들어진 숫자열을 세 개씩 묶어 (x,y,z) 좌푯값이라
고 생각하면 3차원 공간의 점이 된다. 각 점은 그림 1-1처럼 한 변의 길이가 1인 정육면체의
꼭짓점에 대응되고, 세 개의 점을 얻은 후 연결하면 삼각형이 만들어진다. 이 삼각형의 특성
중 법선벡터를 이용하여 새로운 암호화 방법을 제안하였다.

<그림 1-1. 1×1×1 정육면체 꼭짓점 좌표>

4자리의 비밀번호는 가장 큰 수인 9999이더라도, 2진수로 바꿀 경우 14자리이다. 삼각형을 만


들려면 x, y, z좌표에 해당한 3자리가 3개씩 있어야 한다. 삼각형이 두 개가 되려면 18자리가
있어야 하는데, 자릿수가 부족하였다. 이를 극복하고자, 그림 1-2에서 보이는 것처럼 앞의 9자
리와 뒤의 9자리를 만들어서 삼각형을 만들었다.

<그림 1-2. 4자리 숫자 비밀번호의 삼각형 꼭짓점 그룹화>

- 1 -
만들어진 삼각형에서 법선벡터를 구하여 3개의 숫자를 얻는다. 이 법선벡터에서 각 삼각형이
그림 1-1의 구성되는 점과 그 순서를 알려주는 표에 따라서 4번째와 5번째 자리를 얻는다. 법
선벡터가 같더라도, 삼각형이 틀린 경우가 있기 때문이다. 예를 들어 그림 1-1의 삼각형 ABC,
ABD, BCD, ACD는 같은 법선벡터를 갖는다. 이를 구별하기 위해서 4번째와 5번째 자리를 추가
해야만 했다. 정육면체에서 만들 수 있는 모든 법선벡터에 대해서 만들 수 있는 삼각형을 모두
찾아내고 일일이 표로 미리 만들어 놔야 하는 불편함이 있었다.
그림 1-2처럼 그룹화를 했는데, 서로 같은 그룹이 생기면 꼭짓점이 겹쳐져서 삼각형이 만들
어지지 않으므로, 삼각형이 될 수 있도록 점을 옮기기 위해 임의로 만든 규칙에 따라 그룹 내
의 숫자를 바꾸고, 바꿨다는 것을 기록하는 6번째 자리를 추가하였다.
4자리의 십진수를 암호화하면 총 12자리의 암호화된 문자열로 바뀐다. 예를 들어 숫자 6234
는 이진수로 1100001011010이다. 이를 앞에 설명한 방법으로 암호화하면 010ad5100da1의 12자
리 문자열로 바뀐다. 암호화된 문자열에서는 원래의 4자리 비밀번호를 쉽게 유추할 수 없다.
이 방법은 암호화를 위해서 괜찮은 아이디어를 제공한 것으로 생각되지만, 몇 가지 개선할
점이 보였다. 4진수가 12자리의 문자열로 변경되므로, 자릿수만으로만 생각해도 3배가 늘어나
저장공간이 더 많이 필요하다. 4자리보다 더 큰 자리 수를 암호화할 경우의 확장성에 대해서도
제한이 있다. 게다가, 중간에 설명을 하였지만, 암호화의 4번째와 5번째 자리에 표를 만들어서
처리하는 부분도 임의성이 들어가 있어서, 깔끔하게 수학적으로 설명되지 않는 부분이 있었다.
암호화하는 측면에서는 임의의 표가 더 나을 수도 있기는 하다.

나. 동기 및 목적

1학년 때의 연구를 정리하면서 갑자기 이런 생각이 들었다.


“한 변의 길이가 1인 정육면체를 사용하지 않고, 한 변의 길이가 16인 정육면체를 사용하여
암호화를 할 수 있지 않을까?”
알파벳이나 숫자를 한 개를 저장하는데 8 bit 즉, 256개의 정보가 필요하고, 16진수로 표시를
하면 2자리 수가 되니까 한 변의 길이가 16인 정육면체에 바로 대응시킬 수 있을 것 같았다. 4
자리의 알파벳이나 숫자는 16진수로 8자리이므로, 삼각형이 한 개만 필요하게 되어 암호화의
길이도 짧아질 수 있을 것 같았다. 막상 시작하려고 하니 한 변의 길이가 16인 정육면체를 그
리는 것부터 너무 복잡했다. 확장했을 때 생기는 문제를 발견하고 처리하는 방법을 도출하기
쉽도록 문제를 비교적 간단하게 할 필요가 있었다. 그래서 16이 아닌 한 변의 길이가 2인 정육
면체로 암호화하는 작업을 해보기로 했다.
숫자 9999의 경우 2진수는 10,011,100,001,111로 암호화에 2개의 삼각형이 필요하다. 만약 3진
수를 쓴다고 하면 111,201,100로 자릿수가 2진수보다 작고 삼각형 1개로 암호화가 가능하다. 3
진수를 쓴다면 2진수를 쓴 기존 암호화 방법보다 짧은 암호문이 만들어질 것이다. 이런 가능성
을 현실화하기 위해 입력된 숫자를 2진수가 아닌 3진수로 바꾸어 더 진보된 암호화 및 복호화
방법을 찾아보기로 하였다.
앞에서도 언급하였듯이 기존의 연구에서는 임의의 표를 넣어서 삼각형을 인식하는 부분이 들
어있었다. 삼각형의 특성을 활용한다면 이런 임의성도 삭제시킬 수 있고, 암호화하는 방법도

- 2 -
간단해질 수 있을 것이라는 생각이 들었다.
본 연구를 통해서 3진법으로 변환하여 입체공간에서 삼각형의 특성을 활용한 암호화 방법을
찾아보고 거기에 맞는 복호화 방법을 찾아보려고 한다.

2. 사전 연구

가. 암호화 기법

암호화는 컴퓨터 기술의 발전과 함께 빠르게 진화해왔다. 암호화 기법은 대칭키 암호와 비대
칭키 암호 두 가지로 구분할 수 있다.
대칭키 암호는 암호화와 복호화에 같은 함수를 사용하며, 송신자와 수신자가 모두 함수를 알
고 있어야 한다. 1979년에 국가표준암호알고리즘으로 지정되었던 DES와 미국표준기술연구소
에 의해 연방정보처리표준으로 지정된 암호화 방식인 AES가 대표적이다.
비대칭키 암호(혹은 공개키 암호)는 암호화와 복호화에 각각 다른 함수를 사용하며, 암호화하
는 함수인 암호키는 널리 퍼져 있지만 복호화하는 함수인 공개키는 해당 정보를 가지고 있는
단일 기관만이 가지고 있다. 따라서 암호키가 유출되어도 안전하다는 장점이 있다. 그러나 복
호화에 필요한 시간이나 성능이 대칭키 암호보다 높은 단점도 있다 [2].
RSA는 엄청나게 큰 숫자는 소인수분해하기 힘들다는 점을 이용한 공개키 암호로 1973년에
개발되었다. 정수론에 대한 지식을 가지고 쉽게 이해도 가능하고 보안성이 뛰어나서 많이 사용
되고 있다. 우리나라를 포함한 인터넷 뱅킹이 RSA-2048을 사용한다고 한다. 또 다른 공개키
암호로는 소인수분해기반이며 중국인의 나머지정리를 활용한 공개키 암호인 라빈 암호가 있으
며, 이산대수 문제의 어려움을 근거로 해서 만든 엘가말 암호 등이 있다 [3].
비대칭키 암호는 암호화와 복호화에 각각 다른 함수를 사용하기 때문에 암호 체계를 구축하
기가 어렵고, 정수론적인 연산을 이용하기 때문에 컴퓨터 기술이 발전하면서 쉽게 풀릴 가능성
이 있다.
이러한 한계를 극복하기 위해 최근에는 기하학적 특성을 이용한 암호가 개발되고 있다. 대표
적인 예로는 타원곡선암호(ECC)가 있으며, 이는 덧셈 연산을 통해 암호화를 수행하며, 계산하
기는 쉽지만 역으로 연산하는 것이 어렵다. 또한 격자 암호는 기하학적 특성을 이용하여 개발
된 암호로, 양자컴퓨터에서도 활용할 수 있는 강력한 보안성을 가지고 있다 [4].

나. 삼각형의 특성

중학교나 고등학교 때 배우는 것을 종합하면 삼각형을 특정되면, 5개의 점이 자동으로 주어


진다. 이를 각각 내심, 외심, 수심, 무게중심, 방심 [5]이라고 한다.
암호화에 활용하기 위해서는 계산도 간단하지만, 정수화가 용이해야 한다. 수심, 외심, 내심,
방심에 비해서 무게중심의 계산이 매우 간단하므로, 계산과 알고리즘 구현이 쉬운 것을 고려하
여 무게중심을 사용하기로 하였다.

- 3 -
1) 수심

수심은 삼각형의 각 꼭짓점에서 대변에 수선의 발을 내려서 생긴 선분들의 교점이다. 수심에


서의 성질은 꼭짓점까지의 거리와 변까지의 거리의 곱이 일정하다는 것이다. 2차원 좌표계에서
삼각형의 세점이      ,      ,      라고 하면 수심은 다음
의 식으로 구해진다.
수심의 x 좌표
                                             
                         
수심의 y 좌표
                                              
                        

2) 외심

외심은 삼각형의 각 변에서 수직이등분선을 그었을 때 생


기는 교점이다. 특징으로는 외심과 꼭짓점 사이의 거리가
모두 같아서 이 외심에서 세 꼭짓점을 지나는 원을 그릴 수
있고 이를 외접원이라고 한다. 한 사인법칙을 통해 쉽게 구
할 수 있다. 2차원 좌표계에서 외심은 다음의 식으로 구한
다.
외심의 x좌표
                                
                             
외심의 y좌표
                                  
                          

3) 내심

내심은 삼각형의 각 꼭짓점에서 각의 이등분선을 그었


을 때 생기는 교점이다. 특징으로는 내심에서 각 선분으
로 수선을 내리면 거리가 일정해 이 내심에서 원을 그리
면 세 선분에 접하는 원을 그릴 수 있다. 이를 내심원이
라고 한다. 넓이를 통해 쉽게 구할 수 있다. (헤론의 공
식 이용)
2차원 좌표계에서 내심의 좌표는 다음과 같다.
         
 
 



 
  

- 4 -
여기서   
             ,    
           ,    
             이다.

4) 방심

방심은 삼각형의 각 꼭짓점에서 한 각은 내각, 다른 두 각은 외각의 이등분선을 그었을 때


생기는 교점이다. 즉 내각을 무엇으로 할지에 따라서 점 3개가 생성된다. 특징으로는 두 선분
의 연장선과 한 선분에 수선의 발을 내렸을 때 길이가 같아서 방접원이라는 원이 생기게 된다.
방접원도 방심에 따라 결정되기에 3개가 존재한다.
2차원 좌표계에서 세 개의 방심 좌표는 다음과 같다.
           
 
   
  ,

   
   

         
 
  
  ,

  
   

         
 
 


 
   

 
여기서               ,               ,

               이다.

5) 무게중심

무게중심은 각각의 꼭짓점에서 대변의 중점을 이은 선분(이


를 중선이라고 한다)들의 교점이다. 딱히 원이 생성되지는 않
는다. 특징으로는 6개의 넓이가 같은 삼각형으로 나눠진다.
삼각형의 무게중심을 직접적으로 구하는 식이 너무 간단하
다. 세 좌표를 더해서 3으로 나누면 된다.
이외에도 수많은 정리를 가지고 있다(오일러 직선 등) 또한
이 뿐만 아니라 넓이도 헤론의 공식을 사용하면 쉽게 구할
수 있다.
2차원 좌표계에서 무게중심은 다음과 같다.
     
 



    

- 5 -
3. 제작과정

가. 암호화

1) 2×2×2 정육면체에서의 좌표

3차원 좌표에서 한 변의 길이가 2인 2×2×2 정육면체 내에서 정수로만 이뤄진 27개의 좌표


점은 각각 (0,0,0), (0,0,1), (0,0,2), (0,1,0), (0,1,1), (0,1,2), (0,2,0), (0,2,1), (0,2,2), (1,0,0), (1,0,1),
(1,0,2), (1,1,0), (1,1,1), (1,1,2), (1,2,0), (1,2,1), (1,2,2), (2,0,0), (2,0,1), (2,0,2), (2,1,0), (2,1,1),
(2,1,2), (2,2,0), (2,2,1), (2,2,2)이다. 그림 3-1은 2×2×2 정육면체에 각 점을 표시한 것이다.

<그림 3-1. 2×2×2 정육면체와 그 좌표의 예>

2) 3진수 변환을 통한 삼각형 꼭짓점 얻기

입력된 숫자를 3진수로 변환시킨다. 바뀐 3진수를 3자리씩 묶어 그룹을 만든다. 이 그룹은 각


각 순서대로 x좌표, y좌표, z좌표가 되어 2×2×2 정육면체의 한 점을 나타내게 된다. 삼각형을
만들기 위해서는 점이 3개가 있어야 하므로, 그룹 또한 3개가 있어야 한다. 그룹으로 묶다보면
그룹 내의 자리 수가 3개가 안되는 것이 있게 된다. 이 경우에는 부족한 만큼 앞에 0을 채워
넣는다. 예를 들어 1234를 3진법으로 바꾸면 1200201이며, 이를 그룹으로 나누면 (1)(200)(201)
이 된다. 숫자가 부족하므로 앞에 0을 채우면 (001)(200)(201)이 된다.

입력 1234
3진법으로 치환 1200201
3자리씩 묶어 그룹으로 묶기 (1)(200)(201)
3자리가 안되는 그룹에 0을 집어넣기 (001)(200)(201)

- 6 -
그룹의 개수가 3의 배수가 아닌 경우에는 3의 배수가 될 때까지 0을 앞에 채운다. 예를 들어
123456은 3진법으로 20021100110이다. 그룹으로 나누면 (20) (021)(100)(110)이다. 제일 앞 그룹
이 2개의 숫자로만 구성되었으므로 0을 추가하여 (020) (021)(100)(110)로 변환시킨다. 그룹이 4
개로, 두 번째 삼각형을 구성할 수 없으므로, 앞에 0을 6개를 추가하여 그룹을 6개가 되게 한
다. 이런 방법으로 입력된 숫자 123456을 (000)(000)(020) (021)(100)(110)로 바꾼다.

입력 123456
3진법으로 치환 20021100110
3자리씩 묶어 그룹으로 묶기 (20) (021)(100)(110)
3자리가 안되는 그룹에 0을 집어넣기 (020) (021)(100)(110)
그룹 개수를 3의 배수가 되도록 0 추가 (000)(000)(020) (021)(100)(110)

각 그룹은 0, 1, 2로 이루어져서 각 2×2×2 정육면체의 좌표에 각각 대응시킬 수 있다. 즉


(110)이라는 그룹은 x좌표가 1, y좌표가 1, z좌표가 0이라는 점이 되고, 나머지 2개의 그룹도
같은 형식으로 정육면체 좌표에 점을 찍을 수 있다. 이 점들을 연결하면 3차원 공간 상의 삼각
형이 만들어진다. 가령 앞의 예에서 1234를 (001)(200)(201)로 변환하였는데, 이를 통해 그림
3-2와 같은 삼각형을 얻을 수 있다.

<그림 3-2. 1234로 만든 삼각형>

3) 외접벡터 구하기

가) 외접벡터의 적용 (일반적인 상황)

이 삼각형을 포함하는 평면의 방정식을 찾은 후 그 평면의 방정식의 법선벡터를 구한다. 세


그룹 (a1,a2,a3) (b1,b2,b3) (c1,c2,c3)에 대해 첫 번째와 두 번째 그룹 간의 벡터  = (t1,t2,t3) =
(b1-a1, b2-a2, b3-a3)와 첫 번째와 세 번째 그룹 간의 벡터  = (s1,s2,s3) = (c1-a1, c2-a2,

- 7 -
c3-a3)를 구할 수 있다. 삼각형의 법선벡터는 두 벡터의 외접을 구하고 그 길이로 나누어서 얻
어진다. 외접벡터는  ×  = (t2×s3-t3×s2, t3×s1-t1×s3, t1×s2-t2×s1)가 된다. 그림 3-3은
숫자 520을 변환하여 얻어진 (000)(201)(021)의 그룹으로 만든 삼각형에서 외접벡터를 표시한
예이다.

<그림 3-3. 삼각형의 두 변을 이용한 외접벡터>

삼각형의 법선벡터를 얻기 위해서는 그 삼각형의 면적으로 나눠줘야 한다. 하지만, 암호화를


한다는 측면에서 보면, 얻어진 숫자가 정수가 아닌 수로 표현되면 어려움이 발생한다. 가령 삼
각형의 면적이 외접벡터의 길이이므로, 상기의 그림에서 나온 예시에 의하면 외접벡터의 길이
가 
 이다. 외접벡터는 (-2, -2, 4)인데 반해 법선벡터는 (  
 ,  
 , 
 )이다. 외접벡
터가 정수로 나타내어지므로, 다루기 쉬운 형태이다. 따라서 암호화에는 법선벡터보다는 외접
벡터를 활용하기로 하였다. 추가적으로, (0, 1, 0)과 (0, 2, 0)처럼 외접벡터는 다르지만, 정규화
를 통해 얻어진 법선벡터는 (0, 1, 0)으로 같아지는 경우도 있어 암호화 측면에서는 사용하기
곤란하다. 이를 피하기 위해서 법선벡터를 사용하지 않고 외접벡터를 활용하였다.

나) 외접벡터가 중복되는 경우

이 방법으로 외접벡터를 구하면 외접벡터가 같아지는 경우가 발생한다. 암호화를 위해서는


이런 경우를 피해야 한다. 예를 들면, (0,0,0), (1,0,1), (0,1,1)의 삼각형에서 얻어지는 외접벡터와
(1,1,1), (2,1,2), (1,2,2)의 삼각형에서 위의 방법으로 얻어지는 외접벡터는 모두 (-1,-1,1)로 같다.
두 개의 평면은 그림 3-4와 같다. 즉, 이 두 삼각형은 합동이며 평형이동하면 삼각형이 겹친다.
그림 3-4에서 유추할 수 있는 것처럼 같은 외접벡터를 갖는 삼각형은 8개가 있다.

- 8 -
<그림 3-4. 외접벡터가 겹치는 사례>

다) 외접벡터가 중복을 피하는 방법

합동인 삼각형이 나옴으로 인해서 외접벡터가 중복되는 경우가 발생되었다. 따라서, 암호화를
위해서는 합동인 삼각형이 나오지 않는 방법을 찾아야 한다. 위의 그림에서 합동인 삼각형은
각 변의 길이가 같고, 꼭짓점 만 틀리다는 특징을 가지고 있다.
좌표점이 달라지면 변의 길이가 달라지게 만들면 합동인 삼각형이 없어질 것이다. 가장 쉬운
방법은 삼각형이 위치하는 꼭짓점 간의 간격을 다르게 하는 것이다. 이해가 쉽도록 하기 위해
서 2차원에서 살펴보자. 그림 3-5의 왼쪽은 y=0인 평면에서 합동인 4개의 삼각형을 보여주고
있다. 왼쪽 그림처럼 원래대로 하면 그룹의 첫 번째 값이 0이면 x=0에 위치하고, 1이면 x=1에
위치하고, 2이면 x=2에 위치하여야 한다. 이때 외적을 구하면 4개의 삼각형에서 모두 (0,-1,0)을
얻게 된다. 이렇게 되면 암호화된 결과가 중복이 되어버리므로, 복호화가 불가능해진다.

숫자 3진법(꼭짓점)    × 

6832 (100)(101)(001) (-1,0,1) (0,0,1) (0,-1,0)


13645 (200)(201)(101) (-1,0,1) (0,0,1) (0,-1,0)
14402 (201)(202)(102) (-1,0,1) (0,0,1) (0,-1,0)
7589 (101)(102)(002) (-1,0,1) (0,0,1) (0,-1,0)

만약, 그룹의 첫 번째 값이 2일 경우 x=3에 위치하도록 바꾸고, 그룹의 두 번째 값이 2이면


y=3에 위치하게 하고, 그룹의 세 번째 값이 2이면 z=3에 위치하게 하면 그림 3-5의 오른쪽과
같이 4개의 삼각형이 서로 다른 모양을 갖게 된다. 이렇게 하는 경우 외접벡터가 바뀌게 된다.
자세히 살펴보면 변의 길이가 변경됨에 따라 삼각형의 넓이가 넓어져서 외접벡터의 길이가 변
경된 것이다.

- 9 -
숫자 3진법(꼭짓점) 수정꼭짓점    × 

6832 (100)(101)(001) (100)(101)(001) (-1,0,1) (0,0,1) (0,-1,0)


13645 (200)(201)(101) (300)(301)(101) (-2,0,1) (0,0,1) (0,-2,0)
14402 (201)(202)(102) (301)(303)(103) (-2,0,2) (0,0,2) (0,-4,0)
7589 (101)(102)(002) (101)(103)(003) (-1,0,2) (0,0,2) (0,-2,0)

<그림 3-5. 외접벡터를 바꾸도록 꼭짓점 매칭 수정>

3차원에서 다시 한번 살펴보면 그림 3-4에서 보이는 (0,0,0), (1,0,1), (0,1,1)의 세 그룹에서 얻


어지는 외적은 (-1,-1,1)이 되나, 그림 3-6처럼 (1,1,1), (2,1,2), (1,2,2)의 세 그룹은 (1,1,1),
(3,1,3), (1,3,3)의 점으로 이뤄진 삼각형에서 얻는 외적이 되므로 다른 벡터인 (-4,-4,4)로 변경된
다. 변경 전에는 평형이동할 경우 겹치는 삼각형이 존재할 수 있으나, 각 좌표축의 값을 [0, 1,
2]가 아닌 [0, 1, 3]에 대응하도록 변경함에 따라 삼각형이 겹치지 않게 되었다. 이 방법을 통해
서 삼각형의 두 변으로 만들어지는 외적을 다르게 만들었다.

<그림 3-6. 외접벡터를 바꾸도록 꼭짓점 매칭 수정>

- 10 -
경우에 따라서는 위의 예에서 보이는 13645와 7589처럼 꼭짓점 매칭을 수정하더라도 변의 길
이 변경이 같은 경우에는 외접벡터가 같은 경우가 발생한다. 이 수와 같은 경우를 구별하여 다
른 암호화가 진행되도록 다른 삼각형의 특징을 추가적으로 사용할 필요성이 생긴다.

4) 무게중심 구하기

가) 무게중심 중복

추가적으로 삼각형을 구분할 방법이 요구되었다. 삼각형의 특징을 한 가지 더 이용하기 위해


서 무게중심을 사용하기로 하였다. 무게중심은 각 꼭짓점의 x, y, z 성분을 평균한 값이다. 이
경우에도 같은 무게중심을 공유하는 삼각형들이 존재하게 된다.
그림 3-7처럼 (0,0,1), (2,0,1), (0,0,0)을 꼭짓점으로 하는 삼각형과 (1,0,0), (1,0,2), (0,0,0)을 꼭짓
점으로 하는 삼각형은 무게중심이 (2/3,0,2/3)로 같다. 따라서, 같은 무게중심이 나오지 않는 방
법을 찾아야 하는데, 외접벡터가 겹치는 것을 피할 때와 비슷한 방법을 사용하기로 하였다.

<그림 3-7. 무게중심의 중복이 생기는 예>

나) 무게중심의 중복 피하기

한 삼각형에서 꼭짓점이 (x1,y1,z1), (x2,y2,z2), (x3,y3,z3)라고 하면, x좌표 [x1,x2,x3]가 가질 수


있는 조합 방법은 순서를 고려하지 않았을 때 [0,0,0], [0,0,1], [0,0,2], [0,1,1], [0,1,2], [0,2,2],
[1,1,1], [1,1,2], [1,2,2], [2,2,2]의 10가지이다. 무게중심을 구하기 위해서 이를 더하면, 0, 1, 2, 2,
3, 4, 3, 4, 5, 6으로 [0,0,2]와 [0,1,1], [0,1,2]와 [1,1,1], [0,2,2]와 [1,1,2]처럼 같은 값을 갖는 조합
이 존재한다. 각 꼭짓점의 y, z 좌표도 마찬가지이다. 이런 이유로 인해 다른 삼각형이라고 할
지라도 같은 무게중심을 갖게 된다. 아래 표에서 보이는 것처럼 1242와 6858은 같은 무게중심
을 갖게 되고, 1288과 7606은 같은 무게중심을 갖게 된다.
외접벡터를 구할 때와 마찬가지로 [0, 1, 2]가 아닌 다른 값에 좌표가 대응되도록 하면 모든
조합에서 서로 다른 값을 갖도록 할 수 있다. 예를 들어 좌푯값 [0, 1, 2]를 각각 좌푯값 [0, 1,

- 11 -
4]에 대응되도록 조정을 하면, 각 조합의 합은 0, 1, 4, 2, 5, 8, 3, 6, 9, 12로 다른 값을 갖게
된다. 이런 식으로 변경되어 구하는 무게중심을 각 좌푯값에 가중치를 두어 계산을 했다는 의
미로 편의상 가중치 무게중심이라고 부르기로 한다.

숫자 3진법(꼭짓점) 무게중심 수정꼭지짐 가중치 무게중심


1242 (001)(201)(000) (2/3,0/3,2/3) (001)(401)(000) (4/3,0/3,2/3)
6858 (100)(102)(000) (2/3,0/3,2/3) (100)(104)(000) (2/3,0/3,4/3)
1288 (001)(202)(201) (4/3,0/3,4/3) (001)(404)(401) (8/3,0/3,6/3)
7606 (101)(102)(201) (4/3,0/3,4/3) (101)(104)(401) (6/3,0/3,6/3)

혹은 0, 1, 2 대신에 1, 2, 5를 사용하면 3, 4, 7, 5, 8, 11, 6, 9, 12, 15를 갖게 된다. 예를 들


어 앞에서 사용한 예인 꼭지점으로 쓰일 (0,0,1), (2,0,1), (0,0,0) 그룹은 (1,1,2), (5,1,2), (1,1,1)의
꼭짓점에 대응하고 이들의 무게중심을 구하면 (7/3,3/3,5/3)이 되며, (1,0,0), (1,0,2), (0,0,0) 그룹
은 (2,1,1), (2,1,5), (1,1,1)의 꼭짓점에 대응하고, 이들의 무게중심을 구하면 (5/3,3/3,7/3)이 되어
서로 다른 무게중심을 갖게 된다.

숫자 3진법(꼭짓점) 무게중심 수정꼭지짐 가중치 무게중심


1242 (001)(201)(000) (2/3,0/3,2/3) (112)(512)(111) (7/3,3/3,5/3)
6858 (100)(102)(000) (2/3,0/3,2/3) (211)(215)(111) (5/3,3/3,7/3)
1288 (001)(202)(201) (4/3,0/3,4/3) (112)(515)(512) (11/3,3/3,9/3)
7606 (101)(102)(201) (4/3,0/3,4/3) (212)(215)(512) (9/3,3/3,9/3)

향후에 대응되는 값의 조합 즉, [0, 1, 4]나 [1, 2, 5]를 암호키로 사용할 수도 있다. 무게중심
을 구하려면 3으로 나누어야 하나 편의상 3으로 나누지는 않고 합을 그대로 사용했다. 본 연구
에서는 [1, 2, 5]를 이용하여 사용하였다.

다) 외적 벡터가 같은 경우 무게중심 비교

외적 벡터의 경우 꼭짓점의 좌표 매칭을 변경하더라도 외적 벡터가 같은 경우가 있었다. 이


경우에 무게중심을 사용하면 다른 무게중심을 갖기 때문에 외적벡터와 가중치 무게중심을 같
이 사용하면 삼각형이 구별이 된다.

수정꼭짓점  × 


가중치
숫자 3진법(꼭짓점) 무게중심
(외적 벡터) 무게중심
13645 (200)(201)(101) (300)(301)(101) (0,-2,0) (5/3,0/3,2/3) (9/3,0/3,2/3)
7589 (101)(102)(002) (101)(103)(003) (0,-2,0) (2/3,0/3,5/3) (2/3,0/3,9/3)

- 12 -
라) 무게중심이 같은 경우 외적 벡터 비교

위와 같이 수정을 하더라도 가중치 무게중심이 같은 경우가 존재한다. 가중치 무게중심이 같


은 경우를 찾아서 외적벡터를 비교해 보았다. 가중치 무게중심이 같은 경우는 세 꼭짓점의 x,
y, z 좌표의 합은 같지만, 각 꼭짓점의 좌표 조합이 달라지는 경우이다. (a1,a2,a3), (b1,b2,b3),
(c1,c2,c3)는 첫 번째 꼭짓점과 두 번째 꼭짓점의 y좌표가 서로 바뀐 (a1,b2,a3), (b1,a2,b3),
(c1,c2,c3)과 비교하더라도 좌표의 합은 (a1+b1+c1, a2+b2+c2, a3+b3+c3)로 같다. 예를 들면 숫자
13645와 14113은 가중치 무게중심을 구하더라도 같은 무게중심이지만, 외적벡터가 서로 달라
구별이 된다.

수정꼭짓점 가중치  × 


숫자 3진법(꼭짓점) 무게중심
(무게중심) 무게중심
13645 (200)(201)(101) (400)(401)(101) (5/3,0/3,2/3) (9/3,0/3,2/3) (0,-2,0)
14113 (201)(100)(201) (401)(100)(401) (5/3,0/3,2/3) (9/3,0/3,2/3) (0,0,0)

3진수로 얻어진 숫자를 3차원 공간상의 꼭짓점으로 매치시키는 방법을 바꾼다고 하더라도 유
일한 외적벡터를 얻을 수 없는 경우가 있고, 유일한 가중치 무게중심을 얻을 수 없는 경우가
있다. 다만, 같은 외적벡터라고 해도 가중치 무게중심 좌표가 틀리게 되고, 같은 가중치 무게중
심 좌표이더라도 다른 외적벡터를 얻게 된다. 외적벡터와 가중치 무게중심 좌표가 같게 되는
경우는 없다.

5) 순서 구하기

한 삼각형이라고 할지라도 꼭짓점의 순서에 따라 6가지의 숫자가 가능해진다. 예를 들어


(0,0,0)(1,0,0)(1,1,2)는 그 조합에 따라 (000)(100)(112), (000)(112)(100), (100)(112)(000),
(100)(000)(112), (112)(000)(100), (112)(100)(000)이 가능하고, 이들은 각각 257, 387, 6939, 6575,
10215, 10449이다.
세 꼭짓점을 a, b, c라고 할 때 각 꼭짓점의 순서를 지정하기 위해서 사전적으로 배열을 기준
으로 한다. 세 점의 사전적 배열 결과를 이용하여 a>b>c 일 경우는 1, a>c≥b는 2, b≥a>c는 3,
b>c≥a는 4, c≥a>b는 5, c≥b≥a의 경우는 6을 지정한다.

6) 문자 치환

앞에서 언급한 순서대로 진행하면 3진법의 9자리가 외적벡터 x, y, z값 3개, 가중치 무게중심
좌표(합 좌표) x, y, z값 3개, 순서의 7개 숫자로 바뀐다. 각 자리에 음수나 두 자리 수가 있을
수 있으므로, 이를 한 자리로 바꾸기 위해서 다음의 방법을 사용했다. 먼저 두 자리 수는 영문
자의 대문자로 치환한다. 즉 10, 11, 12, 13은 A, B, C, D로 치환한다. 음수는 소문자로 치환한
다. 즉 –1, -2, -3, -4는 a, b, c, d이다. 이렇게 하면 3진법 9자리가 최종적으로 7개의 문자리스

- 13 -
트로 변환된다.

7) 암호화의 예

예를 들어 1234를 암호화해보면 다음과 같다. 먼저 3진법으로 바꾸고 세 그룹을 만들면


(0,0,1), (2,0,0), (2,0,1)이 된다. 여기에서 외적을 구하려면 (0,0,1), (3,0,0), (3,0,1)의 삼각형의 외
적을 구하는 것으로 바뀌어서 (0,-3,0)으로 변환된다. 가중치 무게중심 즉 좌표합을 구하려면
꼭짓점 좌표가 (1,1,2), (5,1,1), (5,1,2)로 바뀌고 얻어진 좌표합은 (11,3,5)이 된다. 세 번째, 두 번
째, 첫 번째의 순서대로 나열되므로, 6이 지정된다. 이렇게 해서 얻어진 7개의 숫자는 (0, –3,
0), (11, 3, 5), 6이다. 이를 문자로 치환하면 0c0B356으로 암호화가 된다.

8) 삼각형이 이뤄지지 않는 경우의 암호화

이제까지 다뤄지지 않았지만, 삼각형이 만들어지지 않는 경우가 많다. 삼각형이 이뤄지지 않


는 경우는 3진법을 그룹으로 묶을 때 같은 그룹이 존재하는 경우이다. 이 때 외적 벡터를 계산
하면 (0,0,0)이 된다. 외적 벡터의 특성상 삼각형의 면적이 그 크기를 나타내는데, 꼭짓점이 겹
치는 경우에는 삼각형이 이뤄지지 않고, 점이나 선이 되므로 면적이 0이 된다. 따라서 외적 벡
터는 (0,0,0)으로 밖에 나올 수 없다.
그러면, 좌표합으로 구별될 수 밖에 없다. 4)의 ‘나) 무게중심의 중복 피하기’를 통해서 3
차원 좌표에서 x, y, z 좌표가 1, 2, 5로 한정된 격자에서 만들어지는 모든 선분의 무게중심은
모두 틀리다. x 좌표에 대해서만 예를 들면 다음의 표와 같다. 참고로 꼭짓점의 순서만 틀린
경우는 중복이므로 아래 표에 넣지 않았다.

꼭짓점 1의 x 좌표 꼭짓점 2의 x 좌표 꼭짓점 3의 x 좌표 좌표합


0 -> 1 0 -> 1 0 -> 1 3
0 -> 1 0 -> 1 1 -> 2 4
0 -> 1 0 -> 1 2 -> 5 7
0 -> 1 1 -> 2 1 -> 2 5
0 -> 1 1 -> 2 2 -> 5 8
0 -> 1 2 -> 5 2 -> 5 11
1 -> 2 1 -> 2 1 -> 2 6
1 -> 2 1 -> 2 2 -> 5 9
1 -> 2 2 -> 5 2 -> 5 12
2 -> 5 2 -> 5 2 -> 5 15

(0,0,1), (1,2,0), (1,2,0)의 그룹과 (0,0,1), (0,0,1), (1,2,0)의 그룹은 3차원 공간 상에서는 같은 선
분으로 나타날 뿐이지만 가중치 무게중심(좌표합)을 구하면 (5,11,4)와 (4,7,5)로 서로 다른 값어

- 14 -
서로 구별이 된다.
예를 들어 1149을 암호화 해보자. 이 숫자는 3진법으로 1120120이며, (0,0,1),(1,2,0),(1,2,0)의
그룹이 만들어진다. 외적을 구하려면 (0,0,1), (1,3,0), (1,3,0)으로 바뀌며 (0,0,0)으로 변환된다. 좌
표합를 구하기 위해 위에서 설명한 좌표 매칭에 따라 (1,1,2), (2,5,1), (2,5,1)로 바뀐 뒤 (5,11,4)
로 변환된다. 세 번째와 두 번째가 같고 첫 번째가 가장 작으므로, 6이 지정된다. 얻어진 숫자
는 0, 0, 0, 7, 11, 4, 6이고, 문자로 치환하면 0005B46으로 암호화가 된다.

9) 암호화 결과의 비교

1×1×1 정육면체 꼭짓점을 활용하는 방법에서는 삼각형의 법선 벡터와 삼각형의 꼭짓점과


그 순서를 미리 정해놓은 표에 의해 암호화가 진행되었다. 9999의 경우에는 12자리의 암호문이
만들어졌다. 당시에는 4자리의 숫자로 제한을 두었기 때문에 그 이상의 숫자로 확장을 하려면
그림 1-2의 그룹을 가지고 삼각형을 구성하는 방법부터 수정을 해야한다.
이에 반해서 3진법을 이용한 본 방법에서는 꼭짓점과 그 순서를 알아내기 위해서 임의의 표
를 만들지 않는다. 꼭짓점을 유추할 수 있도록 외적벡터와 무게중심 좌표를 활용하였다. 겹치
는 삼각형이 많이 생성되므로, 이를 피하기 위한 약간의 조정이 필요하기는 했지만, 임의성이
많이 사라졌다고 볼 수 있다. 이 조정과정이서 2×2×2 정육면체의 정수 좌표점이 아닌 다른
크기의 정육면체(3×3×3과 5×5×
5) 좌표점 중 일부 정수좌표점을 사용하는 것으로 변동되는 상황이 발생한다.
길이의 측면에서 보면 이전의 방법은 4자리의 숫자를 암호화하면 12자리의 암호문이 생성되
었음에 반해, 본 연구의 결과물에서는 4자리의 숫자 중 최대값인 9999가 111201100이라는 9자
리 3진수가 되어 한 개의 삼각형으로 처리될 수 있다. 결과물로 나오는 암호문은 7자리로 12자
리에 비해 짧은 암호문이 된다. 7자리의 암호문으로는 최대 10진수 19682(=3^9-1)까지 암호가
가능하고, 14자리의 암호문을 쓴다고 하면 3^18-1인 십진수 387420488까지 암호가 가능하다.
문자열로는 2자리가 늘었을 뿐인데, 38000배 이상의 숫자를 처리할 수 있게 된다.

10) 암호화의 알고리즘

앞에서 설명한 것을 알고리즘화하면 다음의 그림과 같다.

- 15 -
<그림 3-8. 암호화 알고리즘>

나. 복호화

1) 암호화 문자의 처리

먼저 7자리의 문자씩 나눠서 처리한다. 첫 3자리는 외적벡터, 다음 3자리는 좌표합, 마지막은


순서로 저장한다. 문자는 숫자로 바꾼다. 예를 들어 0c0B356은 0, -3, 0, 11, 3, 5, 6으로 변환되
고, 외적벡터는 (0,-3,0), 좌표합은 (11,3,5), 세 번째, 두 번째, 첫 번째의 순으로 사전배열됨을
알 수 있다.

2) 각 좌표의 구성 얻기

- 16 -
좌표합으로 나타난 수를 보면 암호화에서 언급한 좌표값들이 [0,0,0], [0,0,1], [0,0,2], [0,1,1],
[0,1,2], [0,2,2], [1,1,1], [1,1,2], [1,2,2], [2,2,2]의 구성 중 어느 것에 해당하는지 알 수 있다. 각
구성에 따라 다른 숫자가 나오도록 조정을 하였기 때문이다. 위의 예에서 좌표합은 (11,3,5)이
다. 11은 세 점의 x좌표가 순서는 모르지만 [0, 2, 2]임을 의미하며 3은 세 꼭짓점의 y좌표가
[0, 0, 0]이며, 5는 세 점의 z좌표가 [0, 1, 1]임을 의미한다.

3) 모든 조합에 대해 외적 벡터 구하고 암호문과 같은 것 찾기

좌표합에서 얻어진 x1, x2, x3, y1, y2, y3, z1, z2, z3를 가지고 만들 수 있는 삼각형의 조합은
모두 6^3개 즉 216개이다. x좌표로만 보면 가능한 순서가 [x1,x2,x3], [x1,x3,x2], [x2,x1,x3],
[x2,x3,x1], [x3,x1,x2], [x3,x2,x1]으로 6개이다. 이를 모두 나열하면 다음과 같은 형태이다.

[(x1,y1,z1), (x2,y2,z2), (x3,y3,z3)], [(x1,y1,z1), (x2,y2,z3), (x3,y3,z2)],


[(x1,y1,z2), (x2,y2,z1), (x3,y3,z3)], [(x1,y1,z2), (x2,y2,z3), (x3,y3,z1)],
[(x1,y1,z3), (x2,y2,z1), (x3,y3,z2)], [(x1,y1,z3), (x2,y2,z2), (x3,y3,z1)],
...
[(x3,y3,z1), (x2,y2,z2), (x1,y1,z3)], [(x3,y3,z1), (x2,y2,z3), (x1,y1,z2)],
[(x3,y3,z2), (x2,y2,z1), (x1,y1,z3)], [(x3,y3,z2), (x2,y2,z3), (x1,y1,z1)],
[(x3,y3,z3), (x2,y2,z1), (x1,y1,z2)], [(x3,y3,z3), (x2,y2,z2), (x1,y1,z1)]

이 좌표들로 만들 수 있는 점의 조합을 모두 돌려가면서 외적 벡터와 같은 쌍을 찾아낸다.

4) 순서가 맞는지 확인

위의 216개의 가능성에서 암호문 7번째 자리가 의미하는 조건을 만족하는 것을 찾아낸다.


0c0B356의 경우에는 6이 마지막 숫자이므로 세 번째, 두 번째, 첫 번째의 순의 사전적 배열이
되는 것에 해당한다.
찾아낸 쌍에서 외적을 구해서 암호에서 얻어낸 외적과 같으면 그것이 찾고자하는 쌍이다.

5) 복호화의 알고리즘

앞에서 설명한 것을 알고리즘화하면 다음의 그림과 같다.

- 17 -
<그림 3-9. 복호화 알고리즘>

- 18 -
4. 프로그램

가. 개발 환경

프로그램을 개발하기 위해서 개발환경으로 마이크로소프트사에서 만든 Visual Studio Code를


사용하였다. 프로그램 언어로는 python을 사용하였다. python은 인터프리터 형식의 프로그래밍
언어로 비교적 쉽고 간편하게 사용할 수 있다. 특히, 데이터 분석 분야에서 많이 사용되고 있
다.

python은 list, tuple, set, dictionary같은 기본 자료형이 사용하기 편리하고 여러가지 내장함수
를 제공하여 많은 동작을 할 수 있고, 이 덕분에 좌표를 쉽게 하나의 리스트로 묶어서 구현할
수 있을 것 같았다. 또한 함수지향적 프로그래밍과 객체지향적 프로그래밍을 동시에 사용할 수
있다. 이를 이용하면 코드를 단순화시켜서 간단하게 구현을 할 수 있어서 사용하게 되었다. 실
제로 전 선행연구는 C++로 코딩을 하여4자릿수만 사용 가능했으며 복호화 600줄, 암호화 500
줄에 이르는 반면, 파이썬을 사용하여 어떤 정수든지 입력받아서 200줄 이네에 암호화, 복호화
가 동시에 진행되도록 함수를 만들수 있고, 함수에 그냥 넣으면 암호화, 복호화가 진행되도록
코딩할 수 있었다.

본 프로그램을 개발하기 위해서 사용된 python은 3.10.3 버전이다.

나. 프로그램 리스트

이 절에서는 작성된 프로그램을 이해할 수 있도록 각 함수에 대해서 코드를 묶고 그 이후에


간단한 설명을 추가하였다. 상자 안에 코드를 넣고, 설명은 앞 장을 참조하여 간단히 설명하였
다.

import sys

def convert_num_to_string(num: int) -> str:


if 0 <= num <= 9: # 0~9
return str(num)
elif 10 <= num <= 19: # 10~19
return chr(ord('A') + num - 10)
elif -10 <= num <= -1: # -1~-10
return chr(ord('a') - num - 1)

convert_num_to_string 함수는 ‘6) 문자 치환’에 언급된 것처럼 입력된 숫자인 num을 한


자리의 문자로 만들기 위해서 10~19사이의 숫자는 대문자 알파벳으로, 음수는 소문자 알파벳으
로 수정한다. 암호화를 수행하는 encrypt 함수의 마지막에 사용된다.

- 19 -
def convert_char_to_int(char: str) -> int:
if 'a' <= char <= 'j': # 'a'~'c'
return ord('a') - ord(char) - 1
elif 'A' <= char <= 'J': # 'A'~'C'
return ord(char) - ord('A') + 10
elif '0' <= char <= '9': # '0'~'9'
return int(char)
else:
return None # 입력값이 올바르지 않은 경우 None 을 반환

convert_char_to_int 함수는 convert_num_to_string 함수를 역으로 수행한다. 복호화를 수


행하는 decrypt 함수의 시작에서 사용하여 입력된 암호문을 전처리한다.

def convert_num(num):
# 10 진법 정수를 3 진법 정수로 변환하고, 문자 2 를 문자 3 으로 바꾸기
num_str = ''
quotient = num
while quotient > 0:
quotient, remainder = divmod(quotient, 3)
num_str = str(remainder) + num_str
num_str = num_str.replace('2', '3')

# 3 개씩 묶어서 리스트 만들기


groups = []
num_str = num_str.zfill((len(num_str) // 3 + 1) * 3)
# 0 으로 채워서 문자열 길이를 3 의 배수로 만듦
for i in range(0, len(num_str), 3):
group = [int(n) for n in num_str[i:i+3]]
groups.append(group)

# 리스트 개수가 3 의 배수가 아닌 경우 앞에 [0, 0, 0]을 추가


if len(groups) % 3 != 0:
groups = [[0, 0, 0] for i in range(3 - len(groups) % 3)] + groups

# 결과 리스트 반환
return groups

convert_num 함수는 입력된 숫자인 num으로 ‘가) 암호화’중‘2) 3진수 변환을 통한 삼각형
꼭짓점 얻기’를 수행한다. ‘3) 외접벡터 구하기’중‘다) 외접벡터가 중복을 피하는 방법’
에서 설명한 것처럼 외접벡터의 중복을 피하기 위해서 3진법의 숫자가 2이면 3으로 변경을 한
다. 최종적으로는 입력된 num을 3숫자로 구성된 리스트를 3의 배수인 갯수로 포함한 groups으
로 변환하여 반환한다.

def convert_list_to_decimal(lst):
# 모든 리스트를 하나의 리스트로 합치기
flattened = [elem for sublst in lst for elem in sublst]

- 20 -
# 모든 원소의 3 을 2 로 변경
replaced = [2 if elem == 3 else elem for elem in flattened]

# 합친 리스트를 문자열로 변환
str_repr = ''.join(str(elem) for elem in replaced)

# 3 진법 문자열을 10 진법 정수형으로 변환
decimal = int(str_repr, 3)

return decimal

convert_list_to_decimal은 입력된 리스트 변수인 lst를 3진법의 숫자로 바꾸고 마지막에는


10진법으로 바꾸는 함수이다. 외적 벡터를 계산할 때 숫자 2를 3으로 바꾸었기 때문에 3을 2로
바꾸는 작업을 수행하여 3진법 수로 변경한다.

def encrypt(a,b,c):
s = []
t = []
aa = 1
bb = 2
cc = 5
wmid = [0,0,0]
for k in range(len(a)):
temp = [0,0,0,0]
x = a[k] - b[k]
t.append(x)
y = a[k] - c[k]
s.append(y)
temp[a[k]] += 1
temp[b[k]] += 1
temp[c[k]] += 1
wmid[k] = aa*temp[0]+bb*temp[1]+cc*temp[3]

wmid = tuple(wmid)
vec = (t[1]*s[2]-t[2]*s[1], t[2]*s[0]-t[0]*s[2], t[0]*s[1]-t[1]*s[0])

lexi_order = 0
if a > b:
if b > c:
lexi_order = 1
else:
if a > c:
lexi_order = 2
else:
lexi_order = 5
else:
if a > c:
lexi_order = 3

- 21 -
else:
if b > c:
lexi_order = 4
else:
lexi_order = 6

result = (
convert_num_to_string(vec[0])
+ convert_num_to_string(vec[1])
+ convert_num_to_string(vec[2])
+ convert_num_to_string(wmid[0])
+ convert_num_to_string(wmid[1])
+ convert_num_to_string(wmid[2])
+ convert_num_to_string(lexi_order)
)

return result

encrypt 함수는 입력된 삼각형의 꼭짓점인 a, b, c를 이용하여 ‘가) 암호화’에 설명된 암호


화를 수행한다. 가중치 무게중심인 wmid를 구하고 외적 벡터인 vec를 구한다. 사전적 배열을
통해서 꼭짓점의 순서를 판별하는 lexi_order를 계산한다. 계산된 결과를 모두 묶어서 result
라는 문자열을 만든다.

def cmp(a,b,c):
if a > b:
if b > c:
return [c,b,a]
else:
if a > c:
return [b,c,a]
else:
return [b,a,c]
else:
if a > c:
return [c,a,b]
else:
if b > c:
return [a,c,b]
else:
return [a,b,c]

cmp 함수는 복호화를 수행하는 decrypt 함수에서 사용된다. 세 개의 리스트를 비교하여 크기


가 증가하는 순서대로 나열을 한다.

def decrypt(a):
lexi_order = convert_char_to_int(a[6])
vec = [convert_char_to_int(a[0]), convert_char_to_int(a[1]), \

- 22 -
convert_char_to_int(a[2])]
wmid = [convert_char_to_int(a[3]), convert_char_to_int(a[4]), \
convert_char_to_int(a[5])]

d = dict()
d[3] = [3,0,0]
d[4] = [2,1,0]
d[7] = [2,0,1]
d[5] = [1,2,0]
d[8] = [1,1,1]
d[11] = [1,0,2]
d[6] = [0,3,0]
d[9] = [0,2,1]
d[12] = [0,1,2]
d[15] = [0,0,3]
order = [[0,1,2],[0,2,1],[1,0,2],[1,2,0],[2,0,1],[2,1,0]]

xpos, ypos, zpos = d[wmid[0]], d[wmid[1]], d[wmid[2]]


xp = [0]*xpos[0] + [1]*xpos[1] + [3]*xpos[2]
yp = [0]*ypos[0] + [1]*ypos[1] + [3]*ypos[2]
zp = [0]*zpos[0] + [1]*zpos[1] + [3]*zpos[2]
for i in order:
for j in order:
for k in order:
a = [xp[i[0]], yp[j[0]], zp[k[0]]]
b = [xp[i[1]], yp[j[1]], zp[k[1]]]
c = [xp[i[2]], yp[j[2]], zp[k[2]]]

if a > b:
if b > c:
p = 1
else:
if a > c:
p = 2
else:
p = 5
else:
if a > c:
p = 3
else:
if b > c:
p = 4
else:
p = 6

if(p != lexi_order):
continue
s = []
t = []

- 23 -
for k in range(len(a)):
x = a[k] - b[k]
t.append(x)
y = a[k] - c[k]
s.append(y)

tvec = tuple([t[1]*s[2]-t[2]*s[1], t[2]*s[0]-t[0]*s[2], \


t[0]*s[1]-t[1]*s[0]])
if vec[0] == tvec[0] and vec[1] == tvec[1] and vec[2] == tvec[2]:
global sent
sent = cmp(a,b,c)
# print(a,b,c,tvec)
break
if lexi_order == 6:
return [sent[0], sent[1], sent[2]]
elif lexi_order == 5:
return [sent[1], sent[0], sent[2]]
elif lexi_order == 4:
return [sent[0], sent[2], sent[1]]
elif lexi_order == 3:
return [sent[1], sent[2], sent[0]]
elif lexi_order == 2:
return [sent[2], sent[0], sent[1]]
elif lexi_order == 1:
return [sent[2], sent[1], sent[0]]

decrypt 함수는 ‘나) 복호화’에서 설명한 것처럼 문자열인 a를 받아 숫자로 바꿔주는 역할


을 한다. 문자열 a를 받아 외적벡터(vec), 가중치 무게중심(wmid), 순서(lexi_order)로 분할한
다. wmid 값을 알면 각 꼭짓점의 x, y, z좌표에 들어간 숫자를 알 수 있으므로, 모든 조합에 대
해서 순서가 lexi_oder와 일치하는지 확인한다. 확인된 조합으로 외적벡터를 구하고, vec과 비
교하여 같은 값이면 원하는 꼭짓점 좌표를 얻은 것이다. 이를 lexi_order를 이용하여 순서를
조정하여 리턴한다.

def encrypt_all(num : int):


lst = convert_num(num)
result = ''
for i in range(0, len(lst)//3):
result += encrypt(lst[i*3], lst[i*3+1], lst[i*3+2]);
return result

encrypt_all 함수는 이 코드를 테스트하기 위해서 정의된 함수이다. 메인 함수에서 온 num을


convert_num을 통해 리스트 변수인 lst로 바꾸고, 이를 encrypt 함수로 세 개의 그룹씩 송부
하여 결과를 얻고, 이 결과를 문자열 변수인 result에 덧붙인다.

def decrypt_all(b : str):


lst = list()

- 24 -
for i in range(0, len(b)//7):
c = b[i*7:i*7+7]
lst += decrypt(c)
return convert_list_to_decimal(lst)

decrypt_all 함수는 이 코드를 테스트하기 위해서 정의된 함수이다. 문자열 변수인 b를 7자


리씩 잘라 decrypt 함수로 보내 복호화를 한 후 리스트 함수인 lst에 덧붙인다. 최종 결과를
convert_list_to_decimal 함수를 이용하여 숫자로 바꾼 이후에 리턴한다.

for test_int in range(0, 100000000000000000000000):


# print(decrypt_all(encrypt_all(test_int)), end=' ')
# print(encrypt_all(test_int), end=' ')
if test_int == decrypt_all(encrypt_all(test_int)):
if test_int % 1000 == 0:
print(test_int)
else:
print('wrong')
print(test_int, decrypt_all(encrypt_all(test_int)), \
encrypt_all(test_int))
sys.exit()

메인 실행 코드이다. 주어진 range의 모든 숫자에 대해서 암호화한 뒤 복호화한 결과가 원래


의 숫자와 일치하는지 확인한다. 만약에 다른 숫자가 나온다고 하면 암호화와 복호화가 잘못된
것이다. 실제 위의 코드에 나와있는 것처럼 다 수행하지는 않았지만, 5,600,000까지 수행했을
때까지도 문제가 없었다. 아래 그림 4-1과 4-2는 실행화면이다.

<그림 4-1. 실행 예>

- 25 -
<그림 4-2. 실행 예2, 1234의 복호화와 암호화>

5. 프로그래밍 중 어려웠던 점

세 개의 좌표를 사전식으로 배열하는 과정에서 원래는 a, b, c가 같은지 다른지 10개의 경우


로 나눠서 구하게 되었고 그 때문에 맨 마지막에 다시 원래 순서로 배열하는 과정이 굉장히
길게 구성되어 있었다.

if isab + isca + isbc == 0:


if lexi_order == 6:
print(sent[0], sent[1], sent[2])
elif lexi_order == 5:
print(sent[0], sent[2], sent[1])
elif lexi_order == 4:
print(sent[0], sent[2], sent[1])
elif lexi_order == 3:
print(sent[1], sent[2], sent[0])
elif lexi_order == 2:
print(sent[2], sent[0], sent[1])
elif lexi_order == 1:
print(sent[2], sent[1], sent[0])
elif isab == 1and isbc+isca == 0:
if lexi_order == 6:
print(sent[0], sent[0], sent[1])

- 26 -
else:
print(sent[1], sent[1], sent[0])
elif isbc == 1and isca+isab == 0:
if lexi_order == 2:
print(sent[1], sent[0], sent[0])
else:
print(sent[0], sent[1], sent[1])
elif isca == 1and isab+isbc == 0:
if lexi_order == 4:
print(sent[0], sent[1], sent[0])
else:
print(sent[1], sent[0], sent[1])
else:
print(sent[0], sent[0], sent[0])

이 경우는 일단 isab, isbc, isca로 각각의 경우를 나누고, 그 다음에 나올 수 있는 lexi_


order를 모두 계산해서 배열시키는 것이 원래 코드였지만 이 과정이 너무 복잡하다고 생각하
였다. 그러다가 lexi_order를 구하는 조건문으로 모든 경우가 나누어질 텐데 굳이 이런 식으
로 복잡하게 해야 될까라는 생각을 하게 되었고 실제로 모든 경우가 분류되어 6개로 나눠질
수 있어서 이를 통해 쉽게 재배열을 할 수 있게 되었다. 이 덕분에 isab, isbc, isca도 필요가
없게 되어 암호 자릿수가 하나 줄어드는 효과를 얻을 수 있었다.

if True:
if lexi_order == 6:
print(sent[0], sent[1], sent[2])
elif lexi_order == 5:
print(sent[1], sent[0], sent[2])
elif lexi_order == 4:
print(sent[0], sent[2], sent[1])
elif lexi_order == 3:
print(sent[1], sent[2], sent[0])
elif lexi_order == 2:
print(sent[2], sent[0], sent[1])
elif lexi_order == 1:
print(sent[2], sent[1], sent[0])

암호화 과정은 어떻게든 대응되는 식을 구성하면 되지만, 복호화 과정은 모든 경우를 계산해
보면서 가능한 경우가 하나 나오게 되는 방식을 사용한다. 그러면 복호화 과정에서 탐색해야
하는 전체 공간을 잘 설정해야 중복이 일어나지 않아 일대일 대응을 시킬 수 있게 된다.
맨 처음에 복호화 코딩을 시작했을 때는 탐색하는 공간이 무게중심만을 조건으로 가졌다. 즉
무게중심이 주어지면 각각의 x좌표 3개, y좌표 3개, z좌표 3개를 구할 수 있기 때문에 27개의

- 27 -
경우의 수를 따져보면서 법선벡터와 같아지는지 판별한 뒤 lexi_order와 isab, isbc, isca로
a, b, c에 올바른 좌표를 배열할 수 있었다. 몇 가지 경우를 해보면서 복호화가 잘 된다는 것
을 알 수 있었다.
그런데 여기에는 큰 문제점이 존재하는데 무게중심에서 나올 수 있는 27개의 경우가 잘못하
면 정확히 반대의 법선벡터를 가지는 경우가 존재할 수 있게 된다. 물론 반대의 경우가 조건문
에 걸려서 문제가 되는 것은 아니다. 문제가 되는 이유는 법선벡터를 구할 때 외적을 사용하는
데, 이 외적은 순서가 바뀌게 되면 값이 음수가 되서 정확히 반대가 나오게 되고, 반대의 반대
가 나와서 나오면 안되는 법선벡터가 나오게 되서 일대일대응이 일어나지 않는다는 것이었다.
예시로는 [0, 1, 3] [0, 0, 1] [0, 3, 0] -> (7, 0, 0)이고, [0, 0, 3] [0, 1, 0] [0, 3, 1] -> (-7, 0,
0)인데 이 순서가 바뀌게 되면 (7, 0, 0)이 나오게 된다.
이를 해결하기 위해서 전체공간을 줄이게 되는데, lexi_order 또한 암호문-평문 관계를 하나
로 결정짓게 만드는 요소라는 것을 생각해서 27개의 경우 중 lexi_order가 맞아야 법선벡터를
구해보고 평문을 구할 수 있게 만들었다.

6. 전망 및 활용성

1×1×1 정육면체를 확장한 2×2×2 정육면체를 활용하여 더 짧은 암호문을 얻을 수 있었다.


기존의 방법에서는 좌표의 중복으로 삼각형이 만들어지지 않았을 경우에 대해서 특정한 처리
를 통하여 암호화를 수행하였으나, 본 방법에서는 삼각형의 무게중심에서 아이디어를 얻은 각
좌표의 합을 활용하여 암호화가 가능하였다. 좌표합 (무게중심)로 변환하는데 있어 특정한 조
합이기는 하나 암호키를 지정할 수 있는 방법도 구현이 가능하다.
동기에서 밝히기는 했지만, 한 변의 길이가 16인 정육면체에 대응해서 개발을 하려고 하였으
나, 확장하는데 발생할 수 있는 문제점을 확인하고 해결 방법을 찾기 쉽도록 한 변의 길이가 2
인 정육면체로만 확장을 하여 알고리즘을 개발하였다. 한 변의 길이가 1인 정육면체를 활용했
을 때는 발생하지 않았거나 가벼웠던 문제들이 암호화를 어렵게 하는 요소가 되었다. 예전 연
구에서는 있을 수 없었던 합동인 삼각형이 존재하여 이에 대한 해결이 필요했다. 같은 법선벡
터를 갖는 삼각형의 꼭짓점을 임의의 표에 넣는 것을 없애기 위해서 추가적으로 활용하겠다는
무게중심을 도입하였더니, 무게중심이 일치하는 삼각형이 존재하였다. 다행히도 숫자와 실제
입체도형의 좌표 간에 적용하는 방법을 바꿈으로 인해서 모든 문제가 해결될 수 있었다. 이렇
게 얻어진 암호화와 복호화 방법은 이전의 특허 [1]를 냈던 것과 마찬가지로 공익변리를 통해
특허 출원 준비 중에 있다.
한 변의 길이가 3, 4, ..., 15로 확장하더라도 본 연구에서 진행했던 방법을 사용한다면 특별
한 문제없이 암호화가 진행될 수 있을 것으로 예상된다. 만약 한 변의 길이가 15인 정육면체를
활용한다면 아래의 순서대로 진행될 것이다.
1) 숫자를 16진법으로 수정한다.
2) 9자리씩 끊어서 삼각형을 만든다.
3) 외적벡터를 계산한다.
4) 무게중심을 계산한다.
5) 꼭짓점의 순서를 표시하는 숫자를 추가한다.

- 28 -
이렇게 하더라도 16^9 - 1 = 68,719,476,735까지도 7자리의 문자열이면 암호화가 가능하다. 앞
에서 언급한 삼각형의 외적벡터의 중복 문제는 각 변의 길이가 다르게 만들어서 해결할 수 있
다. 3진수를 그대로 좌표로 사용할 경우 0, 1, 2는 삼각형 한 변의 x 방향 길이가 0, 1, 2 밖에
없어 겹치는 경우가 있어 외접벡터가 중복이 되었다. 하지만, 대응하는 좌표를 0, 1, 3으로 바
꿀 경우, 삼각형 한 변의 x 방향 길이가 0, 1, 2, 3으로 다양화되어 그 변의 꼭짓점이 있는 위
치가 다르면 변의 길이가 달라졌다. 비슷하게 16진수를 사용하면 0, 1, 2, ..., 15를 그대로 좌표
로 대응시킨다고 하면 중복이 되는 경우가 많이 발생하나, 이를 적절히 간격을 조절하여 배치
하면 다른 변의 길이를 갖게 되어서 외적벡터를 다르게 조작할 수 있다. 무게 중심의 경우도
마찬가지이다. 조금의 연구가 추가된다면 진법에 따라서 좌표계의 대응에 방법도 찾을 수 있을
것으로 생각된다. 이렇게 된다면 어떤 진법을 사용하더라도 대응되는 길이를 갖는 정육면체를
사용하여 암호화를 할 수 있게 될 것이다.
다른 쪽으로 생각해 보면 외적벡터이니 무게중심이니 하는 것은 삼각형의 좌표에 대해서 대
수방정식을 적용하는 것이다. 만약에 삼각형을 만들 수만 있으면 이 좌표를 가지고 임의의 대
수방정식을 제안하고 적용하면 암호화가 가능할 수 도 있다는 이야기가 된다. 삼각형이 아닌
다른 도형을 가지고도 좌표 간의 관계식을 제안할 수 있다면 암호화가 가능할 것이다. 일반화
한다면 다음과 같은 방법으로 암호화가 될 것이다. 괄호 안은 본 연구에서의 방법이다.
1) 숫자를 진법의 수정이나 동등한 방법을 통해서 변경한다. (3진법)
2) 일정한 개수만큼 그룹화한다. (3개씩)
3) 정해진 개수의 그룹을 선택하여 그룹군을 만든다. (3그룹씩)
4) 그룹군 내에 정해진 규칙에 따라서 연산을 한다. (삼각형의 외적벡터, 좌표 합, 좌표순서)
본 연구는 상기의 순서에서 4)를 위해서 입체공간에서 삼각형의 특징을 사용하여 규칙을 만
든 것으로 볼 수 있다. 위의 2)나 3)에서 예를 들어 세 개가 아닌 네 개나 다섯 개를 선택했을
때에도 규칙이 세 개만 필요할 지에 대해서는 좀 더 연구가 필요할 것으로 생각이 든다.
암호화를 하는데 있어서 숫자를 좌표로 변환하는 방법은 기존의 암호화 방법에서 사용하지
않은 방법이다. 3차원 좌표계에서 적용할 수 있는 가장 쉬운 도형인 삼각형을 이용하여 암호화
를 진행하여 방법을 제안하였다. 이 방법을 이용하면 간단하지만 쉽게 유추할 수 없는 암호화
가 가능해지며, 해당 복호화 프로그램을 가지고 있지 않은 사람은 해독하기 어려울 것으로 예
상된다. 시간이 지날수록 개인, 단체, 국가의 정보가 중요해지고 있다. 하지만, 컴퓨터가 인터
넷에 연결되어서 작동되므로, 보안에 취약해지는 상황이다. 중요한 정보의 유출을 막기 위해서
는 암호가 중요한 역할을 할 것이다. 본 연구를 통해서 새로운 형태의 암호화 기법을 제안하고
이를 확장시킬 수 있는 방법을 제안하였다. 이런 과정이 지속된다면 향후 정보 보안에 커다란
기여를 할 수 있을 것으로 기대한다.

7. 참고자료

[1] 김석준, 김진욱, 김주은, 백하빈, 입체도형의 평면의 법선벡터를 이용한 암호화 및 복호화
장치 및 그 방법, 출원번호 10-2022-0159607, 2022.11.
[2] 이상진, 임종인, “현대 수학과 암호”, Telecommunications Review, 제10권 5호, pp.866-
876, 2000.

- 29 -
[3] Holden, J., 수학으로 이해하는 암호의 원리 : 고대 시저 암호부터 현대 디지털 암호까지,
프리렉, 2017.
[4] 김정식 외 3인, “타원곡선암호 및 구현 방법에 대한 연구”, 한국정보과학회 2007 가을
학술발표 논문집, 제34권 제2호(D), pp.46-50, 2007.10.
[5] 삼각형의 오심의 Cartesian 좌표, https://orbi.kr/00055499006/[컬럼]-삼각형의-오심의-Cartesian
-좌표/, 2022.03.

- 30 -

You might also like