당신과 받는 사람들만 읽을 수 있습니다

Cryptico는 웹과 Android, iPhone에서 쓰는 익명 메신저입니다. 전화번호도, 이메일도, 실명도 없습니다. 모든 메시지는 종단 간 암호화되며, 설령 우리가 원하더라도 서버 코드로는 그것을 복호화할 수 없습니다.

가입도, 전화번호도 필요 없습니다. 브라우저에서 바로 열립니다.

넓은 브라우저 창에 열린 웹 클라이언트. 왼쪽에는 대화 목록, 오른쪽에는 열려 있는 그룹 대화.

계정은 사람이 아니라 한 줄의 단어입니다

가입할 때 내야 할 것은 아무것도 없습니다. Cryptico가 무작위 신원과 열두 단어짜리 복구 문구를 만들어 주며, 그 문구 자체가 곧 계정입니다. 당신의 모든 키가 거기서 파생됩니다. 인증할 번호도, 확인할 주소도, 당신에게 되짚어 갈 프로필도 없습니다. 사용자 이름은 선택입니다. 검색되고 싶다면 만들고, 그렇지 않다면 만들지 않으면 됩니다.

01

우리가 실제로 책임질 수 있는 네 가지

  • 01

    서버는 당신의 메시지를 읽을 수 없습니다

    이것은 정책이 아니라 빌드의 성질입니다. 서버 바이너리에는 메시지 본문의 정의 자체가 컴파일되어 있지 않아, 그것을 복호화할 코드 경로가 존재하지 않습니다. 이 사실이 깨지는 순간 빌드를 실패시키는 검사가 파이프라인에 들어 있습니다.

    check-proto-content-boundary.mjs
  • 02

    현실 세계의 식별자는 언제까지나 없습니다

    전화번호도, 이메일 주소도, 실명도 없습니다. 앱에도, 데이터베이스에도, 프로토콜에도 없습니다. 그런 항목을 추가하려는 변경은 자동 검사가 막습니다. 연락처 카드 초안에 전화번호 칸이 한 번 들어온 적이 있는데, 삭제한 뒤 그 자리 자체를 영구히 폐기했습니다.

    check-forbidden-columns.mjs
  • 03

    Signal Protocol과 양자 내성 키 합의

    핸드셰이크는 PQXDH, 메시지는 Double Ratchet, 그룹은 Sender Keys를 씁니다. 모든 세션에서 기존 방식 위에 양자 내성 Kyber-1024 교환을 한 번 더 수행합니다. 선택 항목이 아니라 모든 핸드셰이크에서 하기 때문에, 오늘 기록된 통신이 훗날의 양자 컴퓨터로 읽히지 않습니다. 핸드셰이크 이후는 일반적인 암호이므로, 전체가 양자 내성이라고 말하지 않고 양자 내성 키 합의라고 말합니다.

    libsignal · PQXDH · Kyber-1024
  • 04

    우리 서버조차 들을 수 없는 통화

    일대일 통화는 기기끼리 곧장 연결되며, 어떤 서버도 미디어에 닿지 않습니다. 그룹 통화는 우리 미디어 서버를 거치지만 모든 프레임은 도착하기 전에 암호화되고, 그 키는 서버에 절대 전달되지 않습니다. 빌드 검사가 통화 미디어 키를 서버 코드에서 완전히 차단합니다.

    check-call-media-key-boundary.mjs
02

실제로 할 수 있는 것들

시연이 아니라 메신저입니다. 이 목록에 있는 것은 모두 제품에 들어 있고, 의미가 있는 모든 플랫폼에서 동작합니다.

  • 채팅다운 채팅

    멘션, 답장, 편집, 모두에게서 삭제, 반응, 전달, 다중 선택, 개인 북마크를 지원합니다. 전송·읽음 표시, 입력 중 표시, 임시 보관, 한 대화 안에서의 검색과 전체 검색도 있습니다. 글만으로 부족할 때를 위한 투표, 체크리스트, 지도 위치, 연락처 카드까지 갖췄습니다.

  • 최대 128명 그룹

    그룹을 만들고, 사람을 추가하거나 내보내고, 만료 시각과 사용 횟수 제한이 붙은 링크로 초대하고, 한 사람이나 전체를 멘션할 수 있습니다. 서버는 메시지를 뿌려 줄 뿐, 그룹의 이름도 설명도, 무엇을 따서 지은 이름인지도 알지 못합니다.

  • 파일과 사진, 음성

    개당 최대 100 MiB인 여덟 가지 첨부 — 사진, 동영상, 음성 메시지, 영상 메시지, 파일, GIF, 스티커, 오디오 — 를 앨범과 스포일러 가리개와 함께 지원합니다. 모든 파일은 당신의 기기에서 일회용 키로 잠기고, 열기 전에 위·변조 여부를 확인합니다.

  • 메신저 안의 미니 앱

    카탈로그와 한 번의 탭으로 끝나는 설치, 샌드박스 실행 환경에 더해 개발자 콘솔과 익명 신고 버튼이 있습니다. 체크섬이 매니페스트와 맞지 않는 앱은 아예 실행되지 않습니다.

  • 정말로 막아 주는 차단

    개인 대화에서 차단한 상대의 메시지는 당신에게 도달하지 않고, 상대는 도달하지 않았다는 사실조차 알 수 없습니다. 차단은 180일 동안 유지되며, 상대가 보내려 할 때마다 기간이 연장됩니다.

  • 한 계정에 최대 열 대

    복구 문구로 새 기기를 연결하고, 전체 목록을 확인하고, 어느 것이든 연결을 해제할 수 있습니다. 쓸 수 있는 세션이 하나도 남지 않은 상황에서도 해제할 수 있습니다. 연락처, 폴더, 대화 목록, 차단 목록, 설정은 암호화된 채로 따라갑니다. 메시지 보관함은 대부분 따라가지 않으며, 이는 「우리가 약속하지 않는 것」에 적혀 있습니다.

03

일대일 통화와 그룹 통화

음성과 영상, 전면·후면 카메라, 동시에 최대 8개의 영상 타일, 손들기, 화면 공유, 타일마다 표시되는 마이크와 카메라 상태를 지원합니다. 미디어는 기본적으로 릴레이를 거치므로 상대는 당신의 주소를 볼 수 없습니다.

네 명이 참여한 그룹 통화. 그중 한 명이 손을 들고 있다.휴대전화에서 진행 중인 그룹 통화.
04

폴더, 고정, 조용한 대화

규칙으로 나뉘는 폴더, 고정한 대화, 알림을 끈 대화, 공유 미디어 보기, 그리고 연결 상태를 있는 그대로 알려 주는 안내 배너가 있습니다. 알림을 꺼 둔 대화라도 멘션은 전달됩니다. 이건 의도한 동작입니다.

폴더 편집 화면과, 어떤 대화가 그 안에 들어갈지 정하는 필터 규칙.휴대전화의 대화 목록과 새 그룹을 만드는 화면.
05

실제로 어떻게 작동하는가

믿기보다 직접 확인하고 싶은 사람을 위한 짧은 설명입니다.

개인정보 설정. 읽음 표시, PIN, 자동 잠금 시간.휴대전화의 개인정보 설정. 생체 인증 잠금 해제, 자동 잠금, 상대를 확인하는 데 쓰는 안전 번호.
핸드셰이크
PQXDH. Curve25519에 Kyber-1024 사전 키를 더해 예외 없이 모든 세션에서 사용하므로, 첫 메시지부터 키 합의가 양자 내성을 갖습니다.
메시지
Double Ratchet. 메시지를 보낼 때마다 키가 앞으로 나아가므로, 나중에 얻은 키로는 그 이전의 내용을 열 수 없습니다.
그룹
Sender Keys, 최대 128명. 메시지를 뿌려야 하므로 서버는 참여자 목록을 알지만, 그룹의 이름은 알지 못합니다.
그룹 통화
프레임은 우리 미디어 서버에 닿기 전에 암호화됩니다. 키는 통화를 시작한 기기가 만들고 메신저가 직접 나눠 주며, 누군가 들어오거나 나갈 때마다 교체됩니다.
파일과 사진
AES-256-GCM으로 파일마다 새 키를 쓰고, 그 키는 암호화된 봉투 안에 담겨 전달되며, 복호화 전에 SHA-256으로 검증합니다. 스토리지는 해석할 수 없는 바이트만 보관합니다.
당신의 기기에서
로컬 메시지 데이터베이스는 저장 상태에서 암호화됩니다. Android와 iPhone은 SQLCipher, 브라우저는 AES-256-GCM을 씁니다.
복구 문구
열두 단어. 계정의 모든 키가 여기서 파생됩니다. BIP39를 거친 뒤 Argon2id를 쓰는데, 한 번 추측할 때마다 64 MiB와 3회 반복이 필요해 무차별 대입이 수지에 맞지 않습니다. 서버에는 이를 되돌릴 수 있는 것이 아무것도 남지 않습니다.
상대 확인하기
대화마다 60자리 안전 번호가 있고, 통화 중에는 6자리 코드가 떠서 둘 중 한 사람이 읽어 줍니다. 통화 코드는 그 연결만으로 계산되므로 매번 달라집니다.
앱 잠금
네 자리 PIN을 Argon2id와 AES-256-GCM으로 감싸고 시도는 5회까지, 기기가 지원하면 생체 인증도 쓸 수 있으며, 쓰지 않으면 자동으로 잠깁니다. PIN은 기기를 열고, 계정을 가진 것은 문구입니다.
설정과 연락처
복구 문구에서 파생한 키로 암호화된 상태로 동기화합니다. 각 레코드의 이름조차 글자가 아니라 키를 곁들인 해시입니다. 서버가 저장하는 것은 항목이 아니라 알아볼 수 없는 덩어리입니다.
라이브러리
Android와 iPhone은 Signal의 공식 라이브러리를 씁니다. Signal은 브라우저용 빌드를 전혀 배포하지 않기 때문에, 웹 엔진은 Signal의 소스에서 정확한 버전을 고정해 직접 컴파일합니다. 여기서 빌드가 되도록 고친 것은 한 줄뿐이고, 암호 부분은 손대지 않았습니다.
06

우리가 약속하지 않는 것

어느 메신저든 첫 화면에서는 무엇을 지키는지 말합니다. 이 페이지는 지키지 못하는 것도 말합니다. 우리가 고칠 수 없는 부분이야말로 당신이 가장 알아야 할 부분이기 때문입니다.

  • 누가 누구와 이야기하는지는 보입니다

    종단 간 암호화는 무슨 말을 했는지를 가리지, 말을 했다는 사실을 가리지는 않습니다. 메시지를 전하려면 서버는 누가 받는지, 언제 받는지를 알아야 합니다. 그룹 구성도 저장하는데, 그것 없이는 배포가 불가능하기 때문입니다. 우리는 누가 누구와 이야기하는지 모른다고 정직하게 말할 수 없습니다. 말할 수 있는 것은, 내용은 결코 보지 않으며 서버 코드로는 그것을 해석조차 할 수 없다는 사실입니다.

  • 푸시 알림은 시점 정보를 Google과 Apple에 흘립니다

    Android 알림은 Firebase Cloud Messaging을, iPhone 알림은 Apple의 서비스를 거칩니다. 푸시에는 본문도 보낸 사람도 담기지 않지만, 어느 기기가 몇 시에 깨어났는지는 전달자에게 보이며, 그 시각을 맞춰 보는 것만으로 누가 누구와 이야기하는지 재구성할 수 있습니다. 남의 서비스가 기기를 깨우는 통로인 한, 계정의 익명성은 대화가 있었다는 사실과 그 시각까지 덮어 주지 못합니다.

  • 대화 기록은 거의 따라오지 않습니다

    새 기기에서 로그인하면 신원, 프로필, 연락처, 폴더, 대화 목록, 차단 목록과 설정의 일부는 복원되지만 메시지 보관함은 복원되지 않습니다. 대화 상대가 얕은 조각을 다시 보내 줄 뿐이고, 그마저 30일을 넘어가지 않습니다. 서버에 보관된 기록 백업은 설계상 존재하지 않습니다.

  • 문구를 잃으면 아무도 도울 수 없습니다

    고객지원은 당신을 다시 들여보낼 수 없습니다. 우리 쪽에 들여보낼 근거가 하나도 없기 때문입니다. 번호도, 주소도, 비밀번호 힌트도 없습니다. 열두 단어가 계정의 전부입니다. 이 페이지의 나머지를 얻기 위해 치르는 값이며, 가입한 뒤가 아니라 가입하기 전에 알고 계시기를 바랍니다.

  • 로그는 남깁니다. 다만 당신의 것은 아닙니다

    운영용 서비스 로그는 보관하지만 거기에는 메시지 내용도, 암호문 본문도, 키도, 복구 문구도 없습니다. 「로그를 전혀 남기지 않는다」는 말은 거짓이고, 「로그에 내용은 없다」는 말은 참이며, 우리가 하는 약속은 바로 그것입니다.

07

어디서 쓸 수 있나

휴대전화에서 열려 있는 그룹 대화.휴대전화에서 진행 중인 그룹 통화.휴대전화의 초대 화면. QR 코드와 상대에게 전달할 초대 코드가 보인다.
08

사람들이 실제로 묻는 것들

요금은 얼마인가요?

무료입니다. 유료 등급도, 광고도, 추가 판매도 없습니다. 제한은 기술적인 것뿐으로, 파일 하나에 100 MiB, 보관은 30일 같은 것들입니다. 혹시 유료 등급이 생긴다면 생긴 뒤가 아니라 생기기 전에 알려 드립니다.

코드는 공개되어 있나요?

아직 아닙니다. 개발이 자리를 잡으면 공개할 것입니다. 그날이 오기 전까지 우리는 스스로를 open source라고 부르지 않습니다. 확인할 수 없는 주장을 믿어 달라고 부탁할 생각은 없기 때문입니다. 저장소가 공개되면 그 주소가 바로 이 자리에 실립니다.

복구 문구를 잃어버리면 어떻게 되나요?

계정은 사라집니다. 재설정 링크도 없고 고객지원이 다시 들여보낼 방법도 없습니다. 우리가 쥐고 있는 복구 경로는 다른 사람에게도 들어올 길이 되기 때문입니다.

누가 저에게 메시지를 보낼 수 있나요?

상대에게 당신의 사용자 이름이나, 당신이 건넨 초대 링크, 또는 QR 코드가 있어야 합니다. 아예 검색되고 싶지 않다면 사용자 이름을 만들지 마세요. 누구든 차단할 수 있고, 차단한 상대는 더 이상 당신에게 닿지 못합니다.

상대가 맞는 사람인지 확인할 수 있나요?

네, 두 가지 방법이 있습니다. 대화마다 60자리 안전 번호가 있어 양쪽이 한 번 맞춰 볼 수 있고, 통화 중에는 두 화면에 같은 6자리 코드가 떠서 한 사람이 읽고 다른 사람이 확인합니다. 통화 코드는 통화할 때마다 새로 만들어집니다.

기기 여러 대에서 쓸 수 있나요?

네, 최대 열 대까지 됩니다. 각 기기는 복구 문구로 연결되고, 목록에서 언제든 해제할 수 있습니다. 연락처, 폴더, 대화 목록, 설정은 암호화된 채 옮겨 가지만 메시지 보관함은 대부분 옮겨 가지 않습니다.

사용자를 분석하거나 무언가를 팔지는 않나요?

광고도 없고 데이터 판매도 없습니다. 이 페이지에는 분석 도구도 서드파티 스크립트도 전혀 없어서, 다른 사람의 서버로 나가는 요청이 단 하나도 없습니다.

준비되면 알려 주세요

설치할 만한 것이 생기는 날, 딱 한 통만 보냅니다. 뉴스레터도, 연속 발송도, 외부 메일 서비스도 없습니다. 주소는 우리 데이터베이스에만 남고 어디로도 나가지 않습니다.

확인 메일을 보내지 않으므로 오타가 있으면 아무 소식도 오지 않습니다. 보내기 전에 주소를 확인해 주세요.