TL;DR

  • Ezeoke Encryption은 제한된 범위의 ASCII 입력을 암호화하고, 같은 평문에도 매번 다른 암호문을 생성하지만 복호화 결과는 동일하게 유지하는 알고리즘임.
  • 입력 문자 집합 P의 각 문자에 무작위 문자 세 개로 이루어진 값 Q를 대응시키고, 암호문 문자 집합 R의 문자마다 소수를 배정함.
  • 각 문자에 대응하는 세 문자의 소수를 곱해 키를 구성하며, 곱을 이루는 소수 인수 세 개를 산술의 기본 정리에 따라 복원함.
  • 초기 방식은 키를 메시지와 함께 보내므로 알고리즘을 아는 사람이 쉽게 복호화할 수 있는 난독화에 가까움.
  • 개선된 방식은 공유 비밀 키에서 난수 생성기를 초기화하고, 메타데이터와 메시지 인덱스 및 SHA-256을 활용하며, 메시지 30자마다 키 사전을 다시 생성함.

Ezeoke Encryption 개요

  • 7년 전에 만든 특이한 암호화 알고리즘을 소개하는 글이며, 표시된 편집 시점은 2026/09/20 14:32:45임.
  • 아래 문자열은 무작위 문자처럼 보이지만 의미가 있으며, 알고리즘은 “텍스트를 무작위로 암호화하는 방법”이라는 질문에서 출발함.

C0ONeqUl4gjUIMJJMIOakNqe4wxVLzf0myHJNqenKC3QAwNzKnCNqenCKQ3AZwrr7uqeNrwZur7LzVYJlnKCqNeKygeeRqshMe9kqWt3SuaP1ufZMJf5HsqhauP5fHqWkuvtvQckLQkWquPaLk0pS3tXPMZJkQLg3zhqsMe9fu1fRIuPafDacvQXEXVa0GINdGxGINUO09OQl3kGIN1aNJUkLyYGIN12FQO98XJdWFLyY7MhIGN0VaOU0WdFNsSIGNOQ9LyY3lkING0UOq0DZZlOTX06dAerW4cqbKvRBreA60dPUvDrSKbqW4crAex4qPSWd06erASP106d1SgTn3AerEw9BmV

  • 알고리즘에는 사전과 산술의 기본 정리 등의 개념이 포함됨.
  • 입력으로 통신에 유용한 제한된 범위의 ASCII 문자를 받고, 해석할 수 없는 암호화 데이터를 출력함. 출력 역시 100% ASCII임.
  • 알고리즘은 비결정적임. 같은 입력 텍스트가 매번 다른 암호화 데이터를 출력하지만, 해당 암호문은 항상 같은 입력으로 복호화됨.
  • 입력 문자 집합은 대소문자 알파벳, 문장 부호와 유용하거나 흔하다고 판단한 기호로 구성하며, 가능한 입력 집합을 P라고 부름.

알고리즘 구성

  • 먼저 P의 각 요소에 암호학적으로 안전한 난수 생성으로 값을 배정함. 입력 텍스트는 이 값으로 변환됨.
  • 암호문에 사용되는 문자의 집합을 R이라고 정의함. P의 일부 문자 집합 X를 세 문자로 된 값에 대응시키며, 각 세 문자의 요소는 R에 속하고 값의 개수는 X의 크기와 같음. 이 구성을 예시 암호문 집합 Q라고 부름.
  • R의 각 문자에는 소수를 대응시킴. 소수 배정은 a=2, b=3, c=5 순서로 이어지며, 가능한 출력 문자 전체를 소문자 ASCII, 대문자 ASCII, 숫자 순으로 처리함.
  • 알고리즘을 성립시키려면 이처럼 일정한 기준이 필요함.

암호화

  • 알고리즘은 두 개의 사전을 생성함. 하나는 P의 요소를 R에 속하는 무작위 문자 세 개로 대응시키고, 다른 하나는 R의 각 문자를 소수에 대응시킴.
  • P → Q 대응 사전을 따라 각 입력 문자를 세 문자로 바꾼 뒤, 각 문자를 소수 사전에서 찾아 세 소수를 곱함.
  • 각 곱은 키를 구성함. 산술의 기본 정리에 따라 각 곱은 이를 만든 서로 다른 세 소수의 곱으로만 표현되므로, 곱에서 세 문자를 복원할 수 있음.
  • 가능한 입력 문자 P 각각에 대한 순서가 정해진 곱을 모두 모아 키를 만들고, 곱 사이에 구분 문자를 넣어 메시지에 덧붙임.
  • 각 문자를 무작위 문자 세 개로 연결한 대응 관계를 조립하면 암호화된 출력을 평문으로 되돌릴 수 있음.
  • 이 초기 방식은 키를 메시지와 함께 보내므로, 알고리즘을 아는 사람이라면 메시지를 쉽게 복호화할 수 있음. 따라서 암호화보다는 난독화에 가까움.

비밀 키 기반 개선

  • 무작위 문자 세트 Q를 직접 생성하는 대신, 두 통신 당사자가 공유하는 비밀 키를 난수 생성기의 시드로 사용함.
  • 메시지를 보낸 뒤 시드를 증가시켜 다음 교환에서 같은 값이 나오지 않도록 함.
  • 이 과정은 메시지 메타데이터로 조정함. 문자 세 개의 순서는 중요하지 않으므로, 사전식 순열 순위를 이용해 해당 인덱스를 담은 비밀 메시지를 인코딩함.
  • ASCII 문자 세 개 → 순위 값 → 사전식 인코딩 → 6진수
  • 메타 숫자는 공유 시드의 SHA-256 해시를 절단한 값에 메시지 인덱스를 곱해 생성함.
  • 같은 시드를 가진 두 당사자는 시드를 해시하고 메타 숫자를 해시 값으로 나눠 메시지 인덱스를 복구한 뒤, 그 인덱스를 시드에 더해 올바른 Q 집합을 생성함.
  • 이 메타 숫자는 암호문에서 문자 세 개의 순서만으로 유도되므로, 메타 숫자 자체를 복구하는 데 시드가 필요하지 않음.
  • 메시지 30자마다 인덱스를 한 번 더 증가시키고 키 사전을 다시 생성해 빈도 분석 공격에 대한 저항성을 높임.
  • 데모에도 해당 기능이 포함됨.

YkQgjUwrZCKn6F0Nqe7ruA3QwZr06Fur7KnCs24eqNCO0Neq4wxzVLf0mJHyRV1RiR8iTn8ksZEe2fE7QQvGRO2GGL