Nymchat Technical Whitepaper에 대한 리뷰 보기
Post-Quantum Key Agreement 에서 Nymchat
ML-KEM-768 공공 키를 디렉토리나 레지스트리 없이 Nostr에 배포하고, 공공 가치가 밝혀지지 않는 비밀에서 그들을 뿌리는 것이다.
메신저에 포스트 양자 키 교환을 추가하는 것은 대부분 암호화 문제가 아닙니다 원시가 표준화되고 도서관이 존재합니다. 두번째 이 논문은 Nymchat이 어떻게 대답하는지 - 두 번째 키가 어디에서 왔는지, 그것이 필요로하는 사람들에게 어떻게 도달하는지, 인터페이스가 결과에 대해 무엇을 주장할 수 있는지 - 그리고 마지막 섹션에서 그 결과가 보호하지 않는 것이 무엇인지 설명합니다.
이 페이지는 편의를 위해 기계 번역되었습니다. 영문 원본이 적용되는 버전입니다.
1문제는
우리의 개인 메시지는 암호화됩니다 with NIP-44두 개의 분리할 수 있는 반쪽이 있는 단순한 텍스트를 흐리게 하는 반쪽 - HMAC-SHA256 태그가 있는 ChaCha20 HKDF (RFC 5869( ) - 양자 컴퓨터에 의해 의미있게 위협받지 않는다; 그로버의 알고리즘은 대칭 키에 대하여 사각형 뿌리 속도를 높이고, 256 비트는 그것을 흡수한다. 동의하는 엘리프틱 곡선 Diffie-Hellman over 스페인어256k1, 그리고 Shor의 알고리즘은 분리된 로고리즘을 완전히 해결합니다.공공 대리점에서 하나의 개인 키를 복구하면 키가 생성한 모든 공유 비밀이 반전적으로 노출됩니다.
이로 인한 위협은 그러한 기계가 존재할 때까지 지연되지 않습니다. 저장소를 가진 적은 오늘 암호화 텍스트를 기록하고 기능이 도착할 때마다 암호화 할 수 있습니다. 지금 여전히 중요하게 여겨지는 모든 것이 이미 위협되었습니다.이것은 사후 양자 키 교환이 패배하는 특정 공격이며, 이것이 작업이 기계를 구축하기 위해 기다릴 수없는 이유입니다.
1.1 이 논문이 대답하는 질문
(FIPS 203즉시 배포 문제를 제기합니다 :
오늘 앨리스에게 메시지를 보내려면, 당신은 한 가지가 필요합니다: 그녀의 npub. post-quantum 교환을 추가하고, 당신은 두 번째가 필요합니다 - 그녀의 ML-KEM 공공 키.
NPUB는 스스로 포함되어 있습니다. 당신은 종이에 그것을 쓸 수 있습니다, 그것을 크게 읽을 수 있습니다, 또는 화면에서 그것을 스캔, 그것은 당신을 위해 암호화 할 필요가있는 모든 것입니다. ML-KEM-768 공공 키는 1,184 바이트입니다. 그것은 크게 읽을 수 없습니다, 그것은 사용자 이름에 적합하지 않습니다, 그것은 32 바이트 만있는 정체성 외에 QR 코드에 속하지 않습니다.
더 어려운 부분은 두 번째 키가 세 가지 다른 문제를 가져옵니다.이 논문의 나머지는 그들에 대한 대답입니다.
- 그것은 대체 될 수 있습니다. 아무도 한눈에 읽을 수없는 열쇠는 공격자가 자신을 위해 교환하는 정확한 종류입니다. 섹션 4는이를 완전히 정의하는 서명으로 정체성에 결합합니다.
- 그것은 사용자의 장치에서 동의해야합니다. 휴대폰과 노트북의 동일한 계정은 동일한 키를 제시해야 하거나, 하나에 봉인된 메시지는 다른 하나에서 열 수 없습니다.
- 잃어버릴 수 있다. 공개 키는 비밀에서 재공개되므로 실제로 살아남아야 할 것은 그 비밀입니다 - 건설에 의해 다른 아무것도 그것을 재구성하지 않습니다.
2디자인 제한
네 가지 제약이 대답을 형성했으며, 그들은 코드가 작성되기 전에 대부분의 명백한 디자인을 배제합니다.
- 최대한 비밀이 적습니다. 우리의 사용자는 이미 정확히 하나의 비밀, nsec을 가지고 있습니다. 각 추가 비밀은 당신의 역사를 잃을 수있는 또 다른 방법이며, nsec을 백업하는 방법을 알고있는 사람은 다른 것을 백업하는 방법을 알지 못할 것입니다. 3.1 섹션은 이것을 완전히 충족 할 수 없음을 보여줍니다 - nsec에서 유래 한 후 양자 키는 전혀 후 양자 보호를 제공하지 않습니다 - 그래서 디자인은 정확히 하나의 비밀을 지출하지 않습니다. 10.1 섹션은 여전히 비용이 얼마나되는지에 대해 정직합니다.
- 권한이 없다 어느 키가 누구에게 속하는지 말할 수 있는 신뢰할 수 있는 서버가 없습니다.이러한 서버는 메시지를 리디렉션할 수 있는 지점이 됩니다.
- 여러 장치, 하나의 정체성 Nostr ID는 일반적으로 여러 클라이언트에서 한 번에 사용됩니다.중요한 자료가 존재하더라도 모든 클라이언트에서 동일하게 끝나야하며, 그것을 가져다주는 경로는 기능이 방어하는 적에 의해 읽을 수 없어야합니다.
- 협상하지 않음 “당신은 어떤 암호를 지원합니까?”의 밴드 내 교환은 공격자가 약한 옵션을 강요하기 위해 스트립 할 수있는 표면입니다.
3독립적 뿌리 비밀
부담스러운 결정은 ML-KEM 캡슐화 키가 공공 가치가 노출되지 않는 핵심 재료로 씨앗을 뿌린다는 것입니다.
pqRoot = 32 bytes from a CSPRNG, generated ONCE per identity
seed = HKDF-Expand(
HKDF-Extract(salt = "nym-pq-root-v2", IKM = pqRoot),
info = "mlkem768/epoch/" || epoch,
64 bytes)
(ek, dk) = ML-KEM-768.KeyGen(seed)
뿌리는 nsec의 방식으로 사용자에게 제시됩니다: 베이비32 인간이 읽을 수 있는 프레젠테이션
nympq그러므로 그것은 마치 nympq1…동일한 공개 상호 작용 뒤의 정체성 화면에서 nsec 옆에 표시, 동일한 컨트롤로 복사, 결코 로그인하지 않으며 명확한 곳에 절대 보낸 적이 없습니다.이것은 암호가 아니며 로그인이 아닙니다.
소금은 의도적으로 도메인 분리되어 있으므로 다른 비밀은 결코 동일한 키 쌍을 추출할 수 없습니다. epoch 회로를 움직이기위한 컨트롤 드라이브 (Section 9).
3.1 왜 열쇠가 정체성 열쇠에서 파생될 수 없는가
명백한 디자인은 사용자가 이미 가지고있는 비밀에서 키파이어를 뿌리는 것입니다 :
seed = HKDF(salt = "…", IKM = nsec) // do not do this
그것은 네 가지 이유로 매력적이며, 그들 모두는 현실적입니다 : nsec이 이미 백업이기 때문에 백업 할 수있는 새로운 것이 없음; 건설에 의해 동의하는 모든 장치, 동기화 프로토콜이 잘못되지는 않음; ID 당 교체 가능한 광고가 분명히 올바르기 때문에 장치가 키에 대해 동의하지 않을 수 있기 때문에; 그리고 클라이언트가 처음에 자신에게 무언가를 봉인 할 수 있도록 공개되기 전에 존재하는 키.
모든 네 가지 혜택은 한 가지 이유로 쓸모가 없습니다. Shor의 알고리즘은 출판 된 npub가 nsec를 제공합니다. 씨앗 파생은 nsec에 대한 공공 알고리즘입니다. 그래서 고전적인 절반을 깨는 적은 모든 사람들이 실행하는 동일한 HKDF를 실행함으로써 포스트 양자 절반을 재구성합니다.
ML-KEM 캡슐화 키는 nsec에서 유래할 수 없는 엔트로피에서 나와야 하며, 클래식만의 암호화로 전송되지 않는다.
그 규칙의 두 번째 조항은 첫 번째와 동일하게 작동합니다.일반적인 NIP-44 메시지 내에서 사용자의 장치 사이에 동기화 된 독립적으로 생성 된 비밀은 추가 단계로 동일한 실패입니다 : 상대방은 오늘 그 메시지를 기록하고 나중에 고전적인 키를 복구하고 뿌리가 떨어집니다.
3.2 사용자의 다른 장치에 뿌리를 가져 가기
섹션 2의 제한 3 - 하나의 정체성, 여러 장치 -는 여기서 계수학에 의해 만족 될 수 없습니다, 왜냐하면 핵심은 열쇠가 이미 장치가 공유하는 어떤 것의 기능이 아니기 때문입니다. nympq1… 코드 자체가
The root is displayed as nympq1… nsec 옆에, 그리고 두 번째 장치가 그것을 동일한 패널에 붙여져 받아들입니다.그것은 전체 메커니즘입니다.코드를 주지 않은 장치는 섹션 4.2에 설명되는 참여할 수 없습니다.
3.1항의 규칙은 루트가 클래식만의 암호화하에 절대 여행하지 않을 수 있다고 말하며, 이를 자동화시킬 수 있는 모든 메커니즘(레레이를 통해 동기화하고 ID 키로 포장함)은 정확히 그걸 위반한다.
형식은 포장 된 경로를위한 공간을 남겨줍니다 : 레코드는 포장 목록을 가져올 수 있으며, 각각 AEAD 블로브는 사용자가 다른 장치에서 재생할 수있는 키 아래에 있습니다 - 예를 들어 passkey PRF 출력.Nothing ships one today, and until something does, the nympq1… 코드가 통과하는 유일한 방법입니다. 섹션 10.1은 비용이 얼마인지 설명합니다.
레코드 자체는 자체 설정 범주에서 살고 있습니다.The record itself lives in its own setting category. nymchat-pq-root다른 카테고리와 같은 방식으로, 그리고 동기화합니다.조차도 포장을 가지고 있지 않아도 필요한 작업을 수행합니다 : 그것의 존재는 두 번째 장치가 이미이 정체성을 뿌리를 가지고 있다는 것을 배우는 방법입니다.
이 nymchat-pq-root 분류 must ~ 아니다 그 행은 뿌리의 유일한 복사본을 들고 있으므로, 뿌리에서 유래한 키 아래에 봉인하는 것은 열쇠가 상자 안에 있는 잠금입니다 : 그것을 쓴 사람을 포함한 어떤 장치도 그것을 열 수 없습니다. 그것은 고전적으로 봉인됩니다 - NIP-44 자체 - 또는 전혀 없습니다.이것은 디자인이 고전적인 보호만을 받아들이는 한 곳입니다.
모든 다른 설정 카테고리는 루트 파생 키를 사용할 수 있고 사용해야 합니다.This is the single exception, and it is an exception about circularity rather than about strength.
3.3 출생 및 입양
부팅에서, 지속적인 정체성을 보유하고, 클라이언트는 다음과 같은 순서로 작동합니다.On boot, holding a durable identity, a client works in this order:
- 존재하는 하나를 찾으라
nymchat-pq-root레코드 - 레코드가 발견되었으며, 이 장치는 그것을 해제할 수 있습니다. - 그것을 채택하고 이 정체성을 포스트 양자 능력으로 선언한다.
- 레코드가 발견되었으며, 이 장치는 그것을 해제할 수 없습니다. - 새로운 루트를 생성하지 말고, 전혀 광고를 게시하지 마십시오.
nympq1…이미 가지고 있는 장치의 코드. - 기록이 없음 뿌리를 생성하고, 레코드를 게시하고, 발표하고,
nympq1…한 번 사용자에게 코드를 전달하여 저장할 수 있습니다.
단계 3는 잘못되기 쉬운 단계이며, 각 구현에 남아있는 대신에 순서가 기록되는 이유입니다. 각각 루트를 생성하기로 결정하는 두 개의 장치는 하나의 정체성 아래 두 개의 독립적 인 뿌리를 생성하며, 이것은이 순서가 방지하기 위해 존재하는 실패입니다.
4능력 발표
파생 키파일의 공공 절반은 주소가 가능한 키파일로 게시됩니다.The public half of the derived keypair is published as an addressable key.
니트-01
이벤트 - 종류 30078, 태그 nym-pq:
{
"kind": 30078,
"tags": [
["d", "nym-pq"],
["t", "nym-pq"],
["expiration", "<unix seconds>"]
],
"content": {
"v": 2,
"alg": "mlkem768",
"nym": 1,
"epoch": 0,
"pk2": "<base64url ML-KEM-768 encapsulation key>",
"exp": <unix seconds>,
"devices": [ ... ]
}
}
Addressable는 릴레이가 각각 하나의 이벤트(kind, pubkey, d-tag)를 유지한다는 것을 의미하며, 따라서 공화국은 이전 발표를 대체합니다. 각각의 정체성은 정확히 하나의 현재 기록을 가지고 있으므로 “Alice's key”는 합의해야 할 목록이 아닌 단일 명확한 픽치입니다.
서명은 의무입니다.The signature is the binding. 이 이벤트는 ID 키에 의해 서명되므로 “이 ML-KEM 키가이 npub&rdquo에 속한다는 주장은 npub 자체만큼이나 강력합니다. 다른 캡슐화 키를 대체하는 것은 secp256k1 서명을 만들어야합니다.
발표가 종료됩니다. 일곱째 날 NIP-40 expiration은 24시간마다 재판매되며, 이전에 있었던 클라이언트보다는 여전히 실행 중인 클라이언트에 대한 진술을 기록합니다.The root itself never expires; only the claim about it does.
잃어버린 발표는 열쇠를 전송하지 않은 것과 마찬가지로 읽을 수 있습니다 : 동료는 모든 로그인이 읽을 수있는 일반 NIP-44를 보냅니다, 클라이언트는 다음 연결에서 포스트 양자 교환을 재판매 할 때 다시 읽습니다. 그래서 일주일 이상 조용히 지내는 것은 격차 중에 보낸 메시지에 대한 보호 비용을 지불합니다 - 그들은 클래식 암호화가 아닌 양자 저항 - 다른 비용이 없습니다.
그 비대칭은 그것의 사고가 아닌 만료의 원인입니다.이없는 경우, 레코드가 그 이름의 키를 초과합니다 : 지워진, 재설정 또는 뿌리를 대체 한 장치는 아무도 더 이상 보유하지 않는 키에 캡슐링 할 수있는 서있는 지시를 남기고, 그 아래로 보낸 메시지는 오류없이 손실됩니다.7 일은 그 창을 경계하고 리레일러가 클라이언트에 의존하지 않고 레코드를 떨어 뜨릴 수 있습니다.
키 필드는 그 형식을 이름합니다.The key field names its format. 이 필드는 pk2, 그리고 숫자는 장식 대신 계약의 일부입니다 : 그것은 키가 사용할 수있는 유용 부하 형식을 이름합니다. 필드를 인식하지 않는 독자는 “Nymchat 클라이언트, 포스트 양자 키 없음”를 마무리하고 모든 로그인이 읽을 수있는 일반적인 NIP-44를 보냅니다. 그것은 올바른 실패 방향이며, 규칙으로 형식 번호가 실행되어야한다고 말할 가치가 있습니다 : 인식되지 않은 기능 주장은 보호 비용을 지불해야합니다.
4.1 부재는 의미 있고 세 가지로 평가됩니다.
미묘하지만 중요한 세부 사항 : 발표는 모든 Nymchat 클라이언트에 의해 게시되며, 포스트 양자 능력있는 클라이언트뿐만 아니라 키 필드는 선택 사항입니다.
| 관찰 | 수단 | 행동 보내기 |
|---|---|---|
| 열쇠를 가진 광고 | Nymchat, 포스트 양자 능력 | 하이브리드 |
| 광고, 열쇠가 전혀 없음 | Nymchat, 클래식 만 - 포스트 양자 끄기, 또는 아직 정체성의 뿌리와 연결되지 않은 장치 | 클래식 NIP-17 |
| 발표하지 않음 | 알려지지 않은 클라이언트.Nostr 또는 Bitchat 사용자가 될 수 있습니다. | 클래식, plus a compatibility wrap |
열쇠없는 발표는 발신자가 Nymchat을 실행한다는 서명된 진술이며, 이는 발신 경로가 다른 경우 식별할 수없는 사람을 위해 포함해야 할 추측적 교차 프로토콜 포장을 건너 뛰게합니다.
4.2 뿌리를 열 수 없는 장치는 침묵합니다.
발표는 교체할 수 있습니다 : 정체성 당 하나의 이벤트, 마지막 기록이 승리합니다.이것은 단일 레코드 디자인을 작동시키는 것이고, 그것은 또한 공개하면 연결되지 않은 장치를 위험하게 만드는 것입니다.자신을 위해 만들어진 키를 발표 한 장치는 실제 레코드를 흔들어 다른 장치가 열 수없는 키로 모든 동료를 암호화하도록 보냅니다.
따라서 루트를 아는 장치는 존재하지만 열 수는 없으며 전혀 광고를 게시하지 않습니다. 그것은 깨지지 않으며 응용 프로그램에서 잠겨 있지 않습니다 : 그것은 여전히 키가있는 모든 메시지를 읽고 여전히 고전적으로 보냅니다.
5Discovery and the Send 결정
클라이언트는 동료 키를 두 가지 방법으로 배웁니다.직장 구독은 사용자가 실제로 대화하는 사람들 - 개방 대화 및 그룹 회원 - 그래서 그들의 발표는 평범한 이벤트로 도착합니다.Peer 만난 경우 처음으로 한 번 쿼리가 보내는 시간에 실행되며 2.5 초로 제한됩니다.
부정적인 결과는 영원히 대신 10 분 동안 캐시됩니다.새로운 장치를 연결하거나 브라우저 확장자 로그인에서 로컬 키로 이동하는 사용자는 대화 중간에 포스트 양자 능력이되며 영구적으로 캐시 된 “no”는 광고의 평생 동안 고전적인 암호화로 유지됩니다.
5.1 왜 다운그레이드 공격이 없는지
라우팅 결정은 하나의 질문으로 줄어듭니다 :
pq = (we hold a signed, unexpired ML-KEM key for this recipient)
기능 협상도 없고, 지원되는 알고리즘 목록도 없으며, 공격자가 약한 경로를 강요할 수 있는 필드도 없습니다. ~이다 제거되거나 차단 된 광고의 실패 모드는 메시지가 고전적 인 것 -이 기능 이전의 상태 - 대신 하이브리드 메시지가 거짓말 할 수있는 무언가로 낮춰집니다.
그 반대도 유지하고 더 중요합니다 : 클라이언트가 하이브리드를 보냅니다. 오직 열쇠를 보유하고 있는 경우, 열쇠를 보유하는 것은 수신자가 캡슐을 해제할 수 있는 증거이며, 메시지가 읽을 수 없는 누군가에게 양자 후에 전송되는 상태는 없다.
6하이브리드 건설
Nymchat은 NIP-44를 대체하지 않습니다.그것은 그것을 포장합니다.Ummodified NIP-44 ciphertext is the inner layer, and ML-KEM keys an external AEAD around it:
inner = nip44_encrypt(plaintext, conversation_key(sender, recipient))
info = "nymchat-pq2" || sender_secp_pk || recip_secp_pk || kem_ct || recip_kem_pk
prk = HKDF-Extract(salt = "nymchat-pq2-v1", IKM = kem_ss)
key = HKDF-Expand(prk, info || "key", 32)
nonce = HKDF-Expand(prk, info || "nonce", 12)
outer = ChaCha20-Poly1305(key, nonce, plaintext = inner, aad = info)
payload = "pq2." || base64url(kem_ct) || "." || base64url(outer)
두 비밀은 여전히 메시지를 읽기 위해 복구해야합니다 : 외부 층은 NIP-44 암호화 텍스트 만 생성하고, 그 개방은 고전적인 ECDH가 필요합니다. secp256k1을 깨는 양자 적은 내부 키를 얻고 여전히 ML-KEM에 직면합니다.
kem_ss이 파생물의 아무것도 원료 ECDH 출력에 닿지 않으며, 이는 섹션 6.1에서 발생하는 것입니다.kem_ct,recip_kem_pk그리고 두 개의 정체성 키는 연관된 데이터로 묶여 있으므로 외부 계층은 그것을 생성한 정확한 번호에 묶여 있습니다.Splicing a encryption text onto another sender's identity fails authentication rather than decrypting.
수신자의 ML-KEM 키는 오래 지속되지만 각 메시지는 독립적 인 암호 텍스트를 가지고 있으므로 독립적 인 암호 텍스트를 가지고 있습니다.
kem_ss그것은 그것을 무작위화하는 대신 nonce를 추출하는 것이 소리가되는 이유입니다 :
카카아20-폴리1305
열쇠 (key, nonce) 쌍을 재사용함으로써 파손되며 여기서 열쇠 자체는 모든 메시지에 대해 새로워지므로 어떤 쌍도 반복할 수 없습니다.
6.1 왜 계층이 분리되어 있습니까
대안은 두 비밀을 하나의 대화 키로 혼합하고 NIP-44에 전달하는 것입니다.
ck = HKDF-Extract(salt = "…",
IKM = ecdh_x || kem_ss || …) // do not do this
그 건설은 암호화처럼 들립니다.그것은 하나의 구조적 문제를 가지고 있습니다 : 그것은 필요합니다.
ecdh_x, ECDH 출력의 원시 x 좌표, 핵심 자료 - 브라우저 확장 (NIP-07) 또는 원격 서명자 (NIP-46그것은 호출자의 이름으로 NIP-44를 수행하고 암호화 텍스트를 반환합니다, 이는 응용 프로그램이 도달할 수없는 곳에 키를 보관하는 전체 포인트입니다.
따라서 비밀을 혼합하면 서명자, 즉 가장 신중한 사용자를 포함하는 모든 로그인이 제외되며, 키 파생에 대한 작업의 양은 그것을 바꿀 수 없습니다. 레이어링은 의존성을 제거합니다 : NIP-44는 전체로 남아 있으며 ID 키를 보유하고있는 모든 것에 의해 생성되며, 서명자는 포함되며, KEM 절반은 클라이언트가 직접 보유하는 복구 코드에서 계산됩니다.
비용은 대역폭이며, 작은 것은 아닙니다. ML-KEM 암호 텍스트는 1,088 바이트이며 모든 메시지, base64url-코딩 1,451 문자로 운전; 외부 AEAD는 16 바이트 Poly1305 태그를 추가하고 NIP-44 유용 부하를 세 번째로 확장합니다. 50 문자 메시지는 176 바이트에서 1,712로 성장하고 2,000 문자 1는 2,820에서 5,238로 증가합니다. 메시지가 얼마나 짧은지에 관계없이 메시지 당 바닥은 대략 1.5 KB입니다.
6.2 스스로 묘사하는 payloads
이 pq2. 프리페이스는 배포를 점진적으로 만듭니다 : 그것은 자기 설명이므로 클라이언트는 페이로드를 신뢰하거나 피어가 지원하는 것을 기억하는 대신 페이로드를 검사함으로써 디코딩 경로를 선택합니다.A reader that does not recognize a prefix fails to open that payload rather than mis-reading it, and messages sealed before either side could do post-quantum stay readable as ordinary NIP-44 with no migration.
ML-KEM decapsulation은 결코 실패하지 않도록 설계되었습니다: 잘못 형성된 암호 텍스트를 바탕으로 Fujisaki-Okamoto 변환은 실수보다는 결정적인 pseudo-random 비밀을 반환합니다. 따라서 잘못된 키는 KEM 계층에서 전혀 나타나지 않습니다 - 그것은 NIP-44 내부의 HMAC 실패로 나타납니다. 이는 잘못된 고전적인 키 표면과 동일한 방식입니다. 호출자는 둘 다 동일하게 취급하므로 실패는 구별 신호를 전달하지 않습니다. 그것은 또한 섹션 9.1의 후보 목록을 작동 할 수 있게 만드는 것입니다 : 클라이언트는 각 키를 차례로 시도하고 NIP-44가 어느 것이 옳았는지 말할 수 있습니다.
6.3 선물 봉투의 두 층
A NIP-17 개인 메시지는 A NIP-59 선물 포장: 서명되지 않은 소문, 발신자의 정체성 키(13 유형) 아래에 봉인된 다음, 메시지 당 생성된 던져질 키(1059 유형) 아래에 봉인됩니다.
서명자 로그인은 외부 층만을 얻습니다. 서명자는 일반 NIP-44로 밀봉을 생성합니다 - 응용 프로그램은 그것을 만드는 키를 결코 볼 수 없습니다 - 그래서 그것은 장소에서 하이브리드화 될 수 없습니다.이 공격에 대해 아무것도 비용이 없습니다 : 밀봉은 포장을 통해서만 도달 할 수 있으며 밀봉은 레코더가 저장하는 것입니다. 기록 된 트래픽을 보유하는 적은 밀봉이 공격하기 전에 ML-KEM을 깨뜨려야합니다.
7그룹 메시지 및 부분 커버
그룹 메시지는 단일 암호 텍스트가 아닙니다.그것은 모든 멤버에게 배포된 동일한 단일 텍스트이며, 각 복사본은 그 멤버의 자신의 ML-KEM 키로 캡슐화됩니다.키를 게시한 멤버는 하이브리드 웨이프를 받습니다.
이것은 순진한 구현이 잘못된 회계 문제를 만듭니다.10명의 회원 중 8명이 하이브리드 복사본을 받으면 메시지가 ~ 아니다 상대방은 10개 모두에서 동일한 간단한 텍스트의 하나의 클래식 사본을 필요로 하므로 메시지가 보호되는 것은 모든 Copy 입니다
따라서 Nymchat은 팬 아웃 중에 메시지 당 커버링을 추적합니다 - 웨이프가 구축되는 동안에만 계산이 알 수 있습니다 - 그리고 배지 보고서 “quantum-resistant to 8 of 10 members” instead of claiming the message is protected.Where no count is available, which is the normal case for a user. 받는 그룹 메시지 (오직 발신자만이 팬을 계산), 인터페이스는 전체 보안 대신 부분 보안을 보고한다.
7.1 방패가 보고하는 것
방패는 진실을 말한다 메시지, 그것을 보낸 소프트웨어에 관한 것이 아닙니다 :
- 완전한 보호: 이 간단한 텍스트의 모든 복사본은 하이브리드로 나왔습니다.
- 부분적: 그룹 메시지의 일부 복사본은 클래식으로 나왔습니다.Drawed degraded rather than full, because one classical copy of a plaintext identical in all of them is all an opponent needs.
- 클래식은 보이지 않는 표시로 표시되기보다는 솔직하게 표시됩니다, 왜냐하면 “unprotected”, “broken”와 “This build lacks the feature” 사이에 부재한 지표가 불분명하기 때문입니다.
판결은 메시지가 새롭게 광고된 것보다는 봉인되었을 때 기록됩니다.이미 존재하는 키퍼텍스트는 이전보다 더 잘 보호 될 수 없으며, 새로운 광고의 힘에 대해 오래된 메시지를 재구성하는 인터페이스는 리레일에 대한 바이트에 대해 거짓을 주장 할 것입니다.
위의 그룹 규칙은 그룹 메시지를 대체하는 대신 그 위에 스택합니다: 그룹 메시지는 모든 회원의 복사본이 있을 때만 완전히 보호되며, 커버링 계산이없는 수신 그룹 메시지는 부분적으로 표시됩니다.
8자신을 향한 복사본
클라이언트가 저장하는 몇 가지 것들은 사용자의 자신의 정체성으로 암호화됩니다: 동기화된 설정, 대화 목록, 그룹 키, 메시지 아카이브.이것들은 대부분의 단일 메시지보다 사용자에 대해 더 많이 전달하므로 클래식으로 남겨두면 메시지 자체가 얼마나 신중하게 봉인되었는지에 관계없이 저장된 가장 약한 유물이 될 것입니다. nymchat-pq-root 단지 그가 생산할 수 있는 열쇠 아래서 봉인될 수 없는 그 자체의 범주이다.
설정 블로브 또는 아카이브 행은 수년 동안 한 곳에 앉아 있으며, 이는 수확 - 지금 - 디코딩 - 나중에 적이 수집하는 것의 모양입니다 - 사용자의 마음에 적어도 단일 메시지보다 훨씬 더.
한 가지 제한은 키가 아닌 여기서 형식을 지배합니다.A self-addressed copy must be readable by 모든 계정에 장치, 그래서 각 장치는 그것이 열 수있는 것에 광고를 그 광고를 수행하고 계정은 그들 모두가 읽을 수있는 것만을 쓸 수 있습니다.다른 것을 쓰면 자신의 설정에서 장치를 잠글 것입니다 - 동일한 조용한 실패 섹션 3.2는 다른 방향으로, 다른 방향에서 도착을 피합니다.
정체성을 보유하고 있지만 뿌리를 보유하지 않는 장치는 자신의 설정을 포함하여 뿌리 파생 키에 봉인된 것을 열 수 없습니다.이것은 의도적 인 결과이며 감독이 아닙니다.이것은 섹션 3.3에서 신선한 뿌리를 핀 대신에 링크를위한 이러한 장치 인스턴트를 제공하는 이유입니다 : 두 번째 뿌리는 블로브를 읽을 수 없을 것이고, 정체성의 핵심 자료를 두 개로 나누어 줄 것입니다.
브라우저 확장기 또는 원격 서명기(NIP-46)를 실행하는 장치는 원래의 nsec를 보유하지 않지만, 복구 코드를 보유하고 있으며, 섹션 6.1의 계층화 된 구조 아래는 모든 포스트 양자 반이 필요합니다 : 서명자는 항상 가지고있는 NIP-44 계층을 생성하고 클라이언트는 외부 계층 자체를 키합니다.
9로테이션
이 epoch 추출의 카운터는 새로운 키 자료 없이 회전을 가능하게 하는 것입니다.그것을 증가하면 동일한 뿌리에서 신선한 키 쌍과 재판매 된 광고가 생성됩니다; 동료는 교체 가능한 레코드에서 새 키를 가져옵니다.회전은 따라서 사용자에게 두 번째로 아무것도 쓰지 않도록 요청하지 않습니다 : 루트는 ID 당 한 번 생성되고 시대는 회전을합니다.
9.1 오래된 시대는 보존되며 아무것도 다시 암호화되지 않습니다.
클라이언트는 현재 시대의 디코딩 후보자를 epoch − 3로 내려 놓으므로 회전 직전에 봉인된 메시지는 여전히 전송되었을 때 현재였던 키 쌍에 대해 열립니다.
그 창은 회전을 전혀 안전하게 만드는 것입니다 : 그것이 없으면 모든 회전이 비행 중에 무엇이든지 망가질 것입니다. 이미 봉인 된 것은 이미 열 수없는 사용자가 열 수없는 메시지가 후속적으로 보호 할 수없는 사람보다 엄격히 나쁘기 때문에 정체성의 평생 동안 읽을 수 있습니다 (Section 10.5).
10이것은 무엇을 보호하지 않는가
디자인이 달성하는 것만을 나열하는 논문은 시스템을 설명하지 않으며 인터페이스에서 보안 속성을 과대 평가하는 것은 그것을 제외하는 것보다 더 나쁘다.
10.1 뿌리는 두 번째 비밀이며, 잃어버리는 것은 회복할 수 없다.
이것은 디자인의 실제 가격입니다. 사용자가 정확히 한 가지를 유지해야한다는 섹션 2의 제한은 충족 될 수 없습니다 : nsec만으로는 포스트 양자 키를 재구성하지 않습니다, 왜냐하면 전체적인 점은 공공 가치와 다른 비밀이 그것을 노출하지 않는다는 것입니다. 장치가 뿌리를 보유하지 않고 섹션 3.2의 포장 중 하나가 열릴 수 없다면, 뿌리 파생 키로 봉인 된 물질은 복구 할 수 없습니다.
유일한 경로를 수동으로 전송하면 처음 읽을 수 있는 것보다 더 뚜렷합니다.A user who never copies the nympq1… 코드는 어느 곳에서나 정확히 하나의 복사본을 하나의 장치에 가지고 있으며, 그 장치를 잃으면 모든 포스트 양자 메시지, 설정 blob 및 아카이브 행이 그것에 봉인됩니다.
nsec 그것은 도움이되지 않습니다; 그것은 전체 디자인이 기초하는 재산입니다.
공격자는 사용할 수있는 가장 저렴한 경로를 공격하므로 계획은 가장 약한 복구 경로 가치가있는 가치가 있습니다 - 예를 들어, 기억에 남는 패스프라즈는 패스프라즈 가치가 무엇이든 전체를 넣을 것이며, 패스프라즈가 가치있는 가치가있는 패스프라즈는 수확 - 지금 - 디스크립트 - 나중에 적이 수집하고 자유롭게 오프라인으로 밀어 넣는 유물입니다.
10.2 신뢰성과 구별되는 인증
Nostr의 모든 서명은 secp256k1보다 Schnorr이며, 여기에 변함이 없습니다. 양자 컴퓨터를 사용한 상대는 서명을 조작하고 실시간으로 사용자를 묘사 할 수 있습니다. 하이브리드 키 교환이 패배하는 것은 수확 - 지금 - 디크립트 - 나중에 : 오늘날 트래픽을 기록하는 공격자가 나중에 읽을 수 없습니다. 그것은 이미 기계를 가지고있는 상대에 대한 메시지를 잊을 수없는 메시지를 만들지 않습니다.이 구별은 애플리케이션에 의도적으로 가져옵니다 - padlock 지표는 인증을보고, 방패는 기밀을보고하며, 메시지가 서로 없을 수 있기 때문에 별도의 글리프입니다.
그것은 또한 섹션 4의 발표가 약속 할 수있는 것을 제한합니다. npub와 ML-KEM 키 사이의 결합은 secp256k1 서명입니다, 그래서 그들을 가짜 할 수있는 상대가 자신의 열쇠를 대체 할 수 있습니다.
10.3 메타데이터
선물 포장은 송신자를 숨기고, 수신자는 단일 p 태그, 종류, 그리고 내부 메시지의 타임스탬프. 그것은 이벤트가 존재한다는 것을 숨기지 않으며, 그 크기, 또는 릴레이가 그것을 받았을 때. 트래픽 분석은이 디자인의 어떤 부분도 다루지 않습니다.
10.4 오프라인 메쉬
Nymchat의 블루투스 메시 전송은 자신의 손잡이와 별도의 프로토콜이며,이 작품에 의해 다루어지지 않습니다.
10.5 이미 보낸 메시지
사이퍼텍스트가 기록되었을 때 양쪽이 여전히 고전적인 클래식 영구적으로 남아 있습니다. 이미 존재하고 다시 봉인할 수 없습니다. 보호는 양쪽이 포스트 양자 키를 보관한 메시지에서 시작되며, 기능이 켜진 순간이 아닙니다.
11고려된 대안
| 접근 | 왜 안 |
|---|---|
| 정체성 키에서 포스트 양자 키를 추출 | 이 추출은 nsec에 대한 공공 알고리즘이며, 양자 적은 출판 된 npub에서 nsec을 복구하여, 그와 함께 포스트 양자 절반에 대한 고전적인 절반을 니다. |
| NIP-44를 통해 사용자의 다른 장치로 루트를 전송합니다. | 동일한 이유로 다른 옷을 입고 거부됩니다.전통적인 암호화만으로 전송된 뿌리는 그 메시지를 녹음하고 나중에 열쇠를 깨는 모든 사람이 복구할 수 있습니다. |
| 각 장치에 별도로 생성된 ML-KEM 키파일 | 디바이스는 다른 캡슐화 키를 보유할 것이고, 각 ID당 하나의 교체 가능한 광고는 모든 키를 보유할 수 없습니다.Peers는 마지막으로 게시된 키를 암호화할 것이며, 다른 모든 디바이스는 결과를 읽을 수 없습니다.One root per identity, Section 3.2의 경로에 의해 움직이는 것은 그걸 피하는 것입니다. |
| 뿌리를 PIN 밑에 묶는다. | 거부되었습니다. 4자리 PIN은 포장된 행을 보유하는 오프라인 공격자에 대해 약 13비트입니다.두 개의 256-비트 경로 옆에 제공하면 가장 약한 포장 가치가 무엇인지 잘못 나타납니다. |
| NPUB를 확장하여 두 개의 키를 옮기기 | 1,184 바이트는 공유 가능한 식별자가 아니며, 32 바이트로 정의된 주소의 모든 기존 Nostr 클라이언트의 파싱을 깨뜨릴 것입니다. |
| Key Directory 서비스 | 검색에 응답하는 사람은 메시지를 읽을 수 있는 사람을 결정합니다.Reintroduces the authority the network exists to avoid. |
| 각 메시지에 열쇠를 첨부 | 아무것도 해결하지 않는다 : 송신자가 필요로 하는 수신자 첫 번째 메시지 이전에 열쇠, 즉 그것을 운반하기 위해 이전 메시지가없는 경우입니다. |
| 밴드 내 협상 능력 | 능력 깃발을 빼앗을 수 있는 공격자는 고전적인 경로를 강요합니다. |
| 정 피곤와 관련검색인터넷정확하게수 있습다운로드 Post-quantum only, no classical leg ,가필니다. | 훨씬 젊은 원시를 대신하여 secp256k1에 대한 수십 년간의 분석을 배제합니다. 둘 다 실패 |
12Parity 구현
Nymchat은이 구축의 두 개의 독립적 인 구현을 제공합니다 - 웹 응용 프로그램을위한 JavaScript에서 하나, 모바일 응용 프로그램을위한 Dart에서 하나, ML-KEM-768 포트를 포함.
Dart ML-KEM 구현은 공식에 대해 검증되었습니다.
NIST ACVP
(ML-KEM-*-FIPS203) — 25 키 생성, 25 encapsulation 및 10 decapsulation 케이스, 그들 자신의 스위트로 실행. 이것들은 NIST가 구현을 검증하기 위해 게시하는 벡터, 그래서 그들을 통과하는 것은 포트가 정확한 증거, 두 클라이언트가 서로 동의하는 증거가 아닙니다. 그 위에, 테스트 벡터의 공유 고정 - 씨앗 파생, encapsulation, 사용량 형식과 완전한 선물 포장 -는 JavaScript 참조에서 생성되고 두 테스트 스위트에 의해 검사됩니다. 뿌리 비밀은 그것을 대체하는 대신에 그 고정기를 확장합니다 : 뿌리에서 씨앗으로, 뿌리에서 키 쌍으로, 뿌리의 공공 지문, 그리고 외부 레이어의 파생 키, nonce 및 관련 데이터는
nympq1… 어느 구현에서든 차이가 다른 클라이언트가 열 수 없는 메시지를 생성하는 대신 빌드가 실패합니다.A divergence in either implementation fails the build rather than producing a message the other client cannot open.
손가락 지문은 이들 중에서 명명할 가치가 있습니다.이 장치 “이것은 “에서 내가 보유하고있는 뿌리입니다.이것은 다른 뿌리입니다.이것은 다른 뿌리입니다.이것은 다른 클라이언트의 손가락 지문을 복제 할 수없는 클라이언트는 전혀 기록이없는 것처럼 완벽하게 좋은 기록을 읽을 것입니다.그리고 섹션 3.3을 따르고 두 번째 뿌리를 채취하고 정체성을 분할 것입니다.이것은 바로 그 이유로 벡터입니다.
Nymchat 는 오픈소스 AGPL-3.0. 여기서 설명된 암호화 코어는
js/nym-crypto.js 그리고 js/modules/pq.js WEB 클라이언트, 그리고
lib/core/crypto/ 와 lib/features/identity/pq_registry.dart 모바일 클라이언트에서
더 짧고 기술적이지 않은 설명을 보려면, Quantum-resistant encryption에 대한 지식베이스 페이지.