TL;DR

  • Occulta는 UWB를 이용해 대면 교환한 암호화 키를 연락처로 저장하고, 서버·계정·전화번호 없이 파일을 암호화해 전달하는 앱임.
  • 연락처를 추가할 때 두 기기를 25cm 이내에 두며, Apple UWB 칩으로 근접성을 확인한 뒤 기기 간에 키를 교환하고 단어를 읽어 키 일치를 검증함.
  • 파일은 수신자만 열 수 있는 .occ 번들로 암호화되며, 매 메시지마다 새 키를 사용하고 사용 후 폐기해 과거 메시지의 전방향 보안을 제공함.
  • iOS 26 이상에서는 NIST 표준 양자내성 알고리즘 ML-KEM-1024를 추가 적용하며, Vault 비밀 분산, 최대 32개의 강압 대응 계층, 그룹 메시징 기능을 제공함.
  • 계정·기기 간 동기화·Android를 지원하지 않으며, iPhone을 잃고 Vault 복구를 설정하지 않았다면 키를 잃게 됨.

Occulta

  • Occulta는 대면으로 수집한 암호화 키를 연락처로 저장하는 암호화 주소록임.
  • 두 사람이 휴대전화를 가까이 대면 UWB로 키를 교환하며, 서버·계정·전화번호를 사용하지 않음.
  • 상대방의 키를 확보한 뒤에는 파일을 암호화해 AirDrop, 이메일, iMessage, Signal 등 원하는 경로로 보낼 수 있으며, 파일은 해당 수신자만 열 수 있음.

대상 사용자

  • 민감한 법률 정보가 오가는 의사, 변호사, 회계사, 기자 등 전문가를 대상으로 함. 파일이 메시징 플랫폼을 통과할 때 플랫폼이 통제하는 인프라를 지나지만, Occulta는 연락처 기기에만 저장된 키로 파일을 암호화해 플랫폼이나 압수수색 영장이 접근할 대상을 없앰.
  • 고위험 환경에서 활동하는 여행자와 활동가를 대상으로 함. Occulta의 암호화 신원은 특정 iPhone의 하드웨어 칩에 결속되며, 원격 사칭이나 계정 침해를 통한 신원 탈취가 불가능하다고 설명함.
  • 특정한 적대자를 상정하지 않더라도 개인 파일을 비공개로 유지하려는 모든 사람을 대상으로 함.

기능

키 교환

  • 연락처를 추가하려면 양쪽에서 Occulta를 열고 휴대전화를 25cm 이내로 가져가야 함.
  • 앱은 Apple의 UWB 칩으로 실제 근접 여부를 확인한 뒤 암호화 키를 기기 간에 직접 교환하며, 서버를 거치지 않음.
  • 교환 후 양쪽 사용자가 짧은 단어 목록을 소리 내어 읽어 키가 일치하는지 확인한 뒤 연락처를 저장함.
  • 결과적으로 서버나 사용자 이름이 아니라 물리적 근접성을 바탕으로 신원이 보장되는 연락처가 생성됨.
  • 기술 설명: 키 교환 작동 방식.

무엇이든 암호화

  • 상대방의 키를 확보하면 Occulta에서 이름을 누르고 사진, 문서, 동영상, 음성 메모 등 파일을 첨부할 수 있음.
  • Occulta는 수신자만 열 수 있는 .occ 번들로 파일을 암호화하며, 번들은 원하는 방식으로 공유할 수 있음. 암호화는 전달 경로와 독립적으로 작동함.
  • 각 메시지에는 새 키를 사용하고 사용 후 폐기하므로, 이후 기기가 침해되어도 과거 메시지가 노출되지 않음.
  • 기술 설명: 암호화 작동 방식 및 전방향 보안.

양자내성 보호

  • iOS 26 이상에서 Occulta는 표준 키 교환에 더해 NIST 표준 양자내성 알고리즘 ML-KEM-1024를 사용한 두 번째 암호화 계층을 적용함.
  • 현재 암호화된 트래픽을 기록해 두었다가 양자 컴퓨터가 표준 암호화를 깰 만큼 강력해지는 미래에 복호화하려는 공격으로부터 보호함.
  • 기술 설명: 양자내성 보호 작동 방식.

Vault

  • Vault는 메시지와 같은 방식으로 암호화되는 민감한 메모, 자격 증명, 문서의 보안 저장 공간임.
  • 각 항목은 비밀 분산을 통해 신뢰하는 연락처들에게 나눌 수 있음. 사용자가 임계값을 설정하면, 예를 들어 연락처 3명 중 2명의 분할 조각을 모아야 항목의 암호화 키를 복구하도록 나눔.
  • 기기를 잃었을 때 신탁자들이 분할 조각을 돌려주면 Vault를 복구할 수 있으며, 한 명의 분할 조각 보유자만으로는 데이터를 읽을 수 없음.
  • 기술 설명: Vault 및 비밀 분산 작동 방식.

그룹 메시징

  • 여러 연락처를 대상으로 파일이나 메시지를 한 번에 암호화하고 하나의 번들로 공유할 수 있음.
  • 각 수신자는 자신만 열 수 있는 개별 암호화 키 사본을 받으며, 다른 수신자의 키를 알아낼 수 없음.
  • 그룹은 기기에 저장된 이름 있는 연락처 목록임. 서버나 멤버십 알림은 없으며, 개별 메시지와 마찬가지로 원하는 경로로 번들을 전달함.
  • 전방향 보안과 양자내성 보호는 수신자별로 적용됨. 다중 계층 강압 대응 모델은 그룹에도 적용되며, 각 강압 대응 단계마다 독립된 멤버 목록을 표시하고 실제 목록이나 다른 단계의 목록 흔적을 남기지 않음.
  • 그룹 전송 시 메시지와 함께 적격 신탁자에게 Vault 복구용 분할 조각을 배포할 수도 있음.
  • 기술 설명: 그룹 메시징 작동 방식.

보안 모드

  • 보안 모드는 누군가 휴대전화 잠금 해제를 강요하는 상황에 대응함.
  • 실제 PIN과 강압 대응 PIN 두 개를 설정함. 강압 대응 PIN으로 잠금 해제하면 같은 앱과 레이아웃을 유지하면서 민감한 연락처와 Vault 항목을 숨긴 미끼 화면이 표시되며, 강압자는 어느 PIN을 받았는지 구분할 수 없음.
  • 추가 보호 기능은 다음과 같음.
  • ‘PIN 비활성화’ 설정을 켜도 단계별 필터링이 유지되어 숨겨진 연락처가 드러나지 않음.
  • 앱은 보안 모드 사용 여부를 보여주는 포렌식 흔적을 남기지 않으며, 설정 파일은 각 설치에서 최초 실행 시점부터 기록됨.
  • 최대 32개의 중첩된 강압 대응 계층을 지원함.
  • 기술 설명: 보안 모드 작동 방식.

계정 탈취 저항성

  • Occulta에는 계정이 없음. 신원 키는 iPhone의 전용 하드웨어 칩인 Secure Enclave에 저장되며, 키가 칩 밖으로 나가지 않음.
  • 피싱할 비밀번호, SIM 스와핑 대상 전화번호, 침해할 클라우드 계정, 압수수색 영장이 접근할 서버가 없음.
  • Signal 계정이나 iCloud 계정을 탈취해도 Occulta 메시지를 읽거나 Occulta에서 사용자를 사칭할 수 없음.
  • 연락처는 ‘사용자’가 보낸 유효한 번들을 더 이상 받지 못하며, 그 침묵이 신호가 됨.

지원하지 않는 기능과 한계

  • Occulta는 메시징 앱이 아니며 Signal이나 iMessage를 대체하지 않음. 채팅 인터페이스 없이 파일을 암호화하고 신원을 확인하며, 전달은 사용자가 직접 처리함.
  • 기기 간 동기화는 의도적으로 지원하지 않음. 키는 한 기기에 저장되며, Vault 복구를 설정하지 않은 상태로 iPhone을 잃으면 키도 잃게 됨.
  • Android는 지원하지 않음.
  • 전체 위협 모델 및 보안 속성 문서가 제공됨.

기술 문서

  • 암호화 프로토콜
  • 키 교환 흐름
  • 암호화 흐름
  • 전방향 보안
  • 양자내성 보호
  • Vault 및 비밀 분산
  • 보안 모드
  • 위협 모델
  • 보안 속성
  • 아키텍처
  • 그룹 메시징
  • 그룹 메시징 — 기술 설명
  • 보안 분석(PDF)

요구 사항

  • iOS 18.6 이상
  • UWB 키 교환에 필요한 U1 또는 U2 칩 탑재 iPhone
  • 양자내성 하이브리드 키 교환에 필요한 iOS 26 이상

빌드

  • 저장소는 https://github.com/aibo-cora/occulta.git에서 복제한 뒤 Occulta.xcodeproj를 열어 빌드함.
  • 실제 기기에서 빌드하고 실행해야 함. Secure Enclave와 UWB는 시뮬레이터에서 사용할 수 없음.

기여

  • 기여를 받음.
  • 암호화 작업을 다루는 코드를 제출하기 전에 Docs/Audit/CRYPTO_REVIEW_CHECKLIST.md를 읽어야 함. 이 문서에는 암호화 경로 변경 시 답해야 할 항목과 제출해야 하는 검토 블록이 수록됨.

라이선스

  • GNU Affero General Public License v3.0을 적용하며 자세한 내용은 LICENSE에 수록됨.