Cơ sở kiến thức: mã hóa kháng lượng tử

Nymchat whitepaper kỹ thuật

Post-Quantum Key Agreement tại Nymchat

Phân phối các khóa công khai ML-KEM-768 trên Nostr mà không có thư mục hoặc sổ đăng ký, và gieo chúng ra khỏi một bí mật mà không có giá trị công khai nào phơi bày.

Phiên bản 1.0 Tháng Tám 2026 Ứng dụng của Nymchat 3.74+

Thêm một trao đổi phím hậu lượng tử vào một tin nhắn hầu hết không phải là một vấn đề mã hóa. các nguyên thủy được chuẩn hóa và các thư viện tồn tại. thứ hai Bài báo này mô tả cách Nymchat trả lời rằng - nơi khóa thứ hai đến từ đâu, làm thế nào nó tiếp cận những người cần nó, và giao diện được phép yêu cầu gì về kết quả - và, trong phần cuối cùng, kết quả đó không bảo vệ gì.

1Vấn đề

Thông điệp riêng tư của chúng tôi được mã hóa với NIP-44, có hai nửa có thể tách rời. một nửa mà scrambles văn bản đơn giản — ChaCha20 với một thẻ HMAC-SHA256, khóa thông qua HKDF (RFC 5869 Đánh giá- không bị đe dọa một cách có ý nghĩa bởi một máy tính lượng tử; thuật toán của Grover tốn một tốc độ rễ vuông so với một phím đối xứng, và 256 bit hấp thụ điều đó. đồng ý trên chìa khóa là đường cong elip Diffie-Hellman qua Đánh giá 256k1, và thuật toán của Shor giải quyết logarithm phân biệt hoàn toàn. khôi phục một khóa riêng tư từ đối tác công khai của nó retroactively exposes every shared secret that key ever produced.

Mối đe dọa này tạo ra không bị trì hoãn cho đến khi một máy như vậy tồn tại. Một đối thủ có lưu trữ có thể ghi lại văn bản mã hóa ngày hôm nay và giải mã nó bất cứ khi nào khả năng đến. Bất cứ điều gì được gửi bây giờ mà vẫn còn quan trọng sau đó đã bị đe dọa. Đây là cuộc tấn công cụ thể một trao đổi phím hậu lượng tử đánh bại, và đó là lý do tại sao công việc không thể chờ máy được xây dựng.

1.1 Câu hỏi bài viết này trả lời

Cụm từ này có nghĩa là người dùng có thể sử dụng máy tính xách tay để chuyển đổi dữ liệu từ máy tính xách tay sang máy tính xách tay để chuyển sang máy tính xách tay. (Đánh giá FIPS 203Điều này lập tức đặt ra một vấn đề phân phối:

Câu hỏi

Để nhắn tin cho Alice hôm nay, bạn cần một điều: npub của cô ấy.Thêm một trao đổi sau lượng tử và bạn cần một thứ hai - khóa công cộng ML-KEM của cô ấy.Nhà chìa khóa đó sống ở đâu, và làm thế nào bạn có thể nhận được nó trước khi bạn có thể gửi cho cô ấy bất cứ điều gì?

Bạn có thể viết nó trên giấy, đọc nó to, hoặc quét nó từ màn hình, và đó là tất cả mọi người cần mã hóa cho bạn. một ML-KEM-768 khóa công cộng là 1,184 byte. Nó không thể được đọc to, nó sẽ không phù hợp với một tên người dùng, và nó không thuộc về một mã QR bên cạnh một danh tính chỉ là 32 byte.

Phần khó hơn là một phím thứ hai mang lại ba vấn đề riêng biệt, và phần còn lại của bài báo này phần lớn là một câu trả lời cho chúng:

2Thiết kế hạn chế

Bốn hạn chế đã định hình câu trả lời, và chúng loại trừ hầu hết các thiết kế rõ ràng trước khi bất kỳ mã nào được viết.

  1. Bí mật càng ít càng tốt. Người dùng của chúng tôi đã mang theo chính xác một bí mật, nsec. Mỗi bí mật bổ sung là một cách khác để mất lịch sử của bạn, và ai đó biết sao lưu một nsec sẽ không biết sao lưu bất cứ điều gì khác. Phần 3.1 cho thấy điều này không thể được đáp ứng trực tiếp - một phím hậu lượng tử có nguồn gốc từ nsec không cung cấp bảo vệ hậu lượng tử ở tất cả - vì vậy thiết kế dành chính xác một bí mật và không nhiều hơn: một mảnh duy nhất của vật liệu khóa, được tạo ra một lần cho mỗi danh tính, được trình bày trong cùng một hình dạng như nsec và ở cùng một nơi, vì vậy bất cứ ai biết cách giữ một biết cách giữ cho người khác.
  2. Không có thẩm quyền Không có máy chủ nào có thể được tin tưởng để nói khóa nào thuộc về ai.Mỗi máy chủ như vậy trở thành điểm mà tin nhắn có thể được chuyển hướng.
  3. Nhiều thiết bị, một danh tính Bất cứ tài liệu quan trọng nào tồn tại đều phải kết thúc giống hệt nhau trên tất cả chúng, và các con đường mang nó đến đó không thể đọc được bởi đối thủ mà tính năng đang bảo vệ chống lại.
  4. Không đàm phán Bất kỳ sự trao đổi trong băng tần của “các chữ số nào bạn hỗ trợ?” là một bề mặt mà một kẻ tấn công có thể cắt để ép các tùy chọn yếu hơn.

3Bí mật rễ độc lập

Quyết định mang tính gánh nặng là khóa giải nén ML-KEM được gieo từ vật liệu quan trọng mà không có giá trị công khai phơi bày.

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)

Root được trình bày cho người dùng theo cách một nsec là: Đồ chơi Bech32 Với con người đọc tiền tố nympqVì vậy, nó đọc như nympq1…, hiển thị bên cạnh nsec trong màn hình nhận dạng đằng sau tương tác tiết lộ tương tự, sao chép với cùng một điều khiển, không bao giờ đăng nhập và không bao giờ gửi bất cứ nơi nào trong rõ ràng.

Muối được tách biệt theo mục đích, vì vậy không có bí mật nào khác có thể rút ra cùng một cặp phím. epoch Động cơ chống xoay (Phần 9).

3.1 Tại sao chìa khóa không thể được lấy từ chìa khóa nhận dạng

Thiết kế rõ ràng là gieo phím từ bí mật mà người dùng đã có:

seed = HKDF(salt = "…", IKM = nsec)          // do not do this

Nó hấp dẫn vì bốn lý do, tất cả đều có thật: không có gì mới để sao lưu, bởi vì nsec đã được sao lưu; mỗi thiết bị đồng ý bằng cách xây dựng, không có giao thức đồng bộ hóa để đi sai; một thông báo có thể thay thế cho mỗi danh tính rõ ràng là đúng, bởi vì các thiết bị không thể không đồng ý về khóa; và khóa hiện có trước khi nó được phát hành, vì vậy một khách hàng có thể đóng dấu một cái gì đó cho chính mình trong lần đầu tiên.

Tất cả bốn lợi ích đều vô giá trị, vì một lý do. thuật toán của Shor chạy chống lại một npub được xuất bản mang lại nsec. Việc dẫn xuất hạt giống là một thuật toán công khai trên nsec. Vì vậy, đối thủ phá vỡ nửa cổ điển tái tạo lại nửa hậu lượng tử bằng cách chạy cùng một HKDF mà mọi người khác chạy. chống lại thu hoạch bây giờ giải mã sau đó - mối đe dọa duy nhất mà tính năng tồn tại để dừng lại - một phím dẫn xuất theo cách này không thêm bất cứ điều gì.

Quy tắc tất cả mọi thứ phát sinh từ

Khóa giải nén ML-KEM phải đến từ entropy không thể dẫn xuất từ nsec và không bao giờ được truyền dưới mã hóa cổ điển-chỉ.

Một bí mật được tạo độc lập sau đó được đồng bộ hóa giữa các thiết bị của người dùng bên trong một thông điệp NIP-44 thông thường là cùng một thất bại với các bước bổ sung: một đối thủ ghi lại thông điệp đó hôm nay và phục hồi khóa cổ điển của nó sau đó, và rễ rơi ra.

3.2 Đưa rễ vào các thiết bị khác của người dùng

Hạn chế 3 của Phần 2 - một danh tính, nhiều thiết bị - không thể được thỏa mãn bằng số học ở đây, bởi vì toàn bộ điểm là chìa khóa không phải là một chức năng của bất cứ điều gì các thiết bị đã chia sẻ. nympq1… Bản thân code

Rễ được hiển thị như nympq1… bên cạnh nsec, và một thiết bị thứ hai chấp nhận nó dán vào cùng một bảng điều khiển. đó là toàn bộ cơ chế.

Quy tắc trong Phần 3.1 nói rằng gốc có thể không bao giờ di chuyển dưới mã hóa cổ điển-chỉ, và bất kỳ cơ chế nào làm cho điều này tự động - đồng bộ hóa nó thông qua một relay, bao bọc nó vào khóa nhận dạng - vi phạm chính xác điều đó.

Định dạng này để lại không gian cho một con đường đóng gói: một bản ghi có thể chứa một danh sách bao bọc, mỗi một AEAD blob dưới một phím mà người dùng có thể sao chép trên một thiết bị khác - một đầu ra PRF passkey, ví dụ. nympq1… code là cách duy nhất vượt qua. phần 10.1 cho biết chi phí đó là bao nhiêu.

Bản thân bản ghi sống trong thể loại cài đặt riêng của nó, nymchat-pq-rootNgay cả khi không có bao bì nó làm việc cần thiết: sự hiện diện của nó là làm thế nào một thiết bị thứ hai biết rằng danh tính này đã có một gốc, đó là những gì ngăn chặn nó tạo ra một đối thủ (Phần 3.3).

Ghi chú thiết kế: một thể loại không thể sử dụng khóa mới

Các nymchat-pq-root Thể loại Must không hàng đó mang theo bản sao duy nhất của rễ, vì vậy niêm phong nó dưới một khóa bắt nguồn từ rễ là một khóa có khóa nằm bên trong hộp: không có thiết bị nào có thể mở nó, bao gồm cả người viết nó. nó được niêm phong theo cách cổ điển - NIP-44 cho chính nó - hoặc không có ở tất cả. Đây là một nơi mà thiết kế chấp nhận bảo vệ cổ điển-chỉ, và nó có thể đủ khả năng: hàng này không có rễ ngày nay, chỉ có thực tế là một tồn tại.

Mỗi thể loại cài đặt khác có thể và nên sử dụng khóa gốc.Đây là ngoại lệ duy nhất, và nó là một ngoại lệ về tính tròn chứ không phải về sức mạnh.

3.3 Thế hệ và nhận con nuôi

Trên boot, giữ một danh tính lâu dài, một client hoạt động theo thứ tự này:

  1. Tìm kiếm một hiện có nymchat-pq-root kỷ lục
  2. Bản ghi được tìm thấy, và thiết bị này có thể mở - Chấp nhận nó và tuyên bố danh tính này là khả năng hậu lượng tử.
  3. Bản ghi được tìm thấy, và thiết bị này không thể mở - không tạo ra một root mới, và không xuất bản bất kỳ thông báo nào. Đưa người dùng liên kết thiết bị này bằng cách nhập nympq1… mã từ một thiết bị đã có nó.
  4. Không kỷ lục - tạo ra một gốc, xuất bản bản ghi, thông báo và hiển thị nympq1… mã cho người dùng một lần để họ có thể lưu nó.

Bước 3 là bước dễ mắc sai lầm, và đó là lý do tại sao thứ tự được viết xuống thay vì để lại cho mỗi thực hiện. Hai thiết bị mà mỗi thiết bị quyết định tạo ra một gốc tạo ra hai gốc độc lập dưới một danh tính, và đó là sự thất bại của thứ tự này tồn tại để ngăn chặn.

4Khả năng thông báo

Một nửa công cộng của các keypair dẫn xuất được xuất bản như một addressable Đồ chơi Nip-01 Sự kiện - kind 30078, tagged 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 có nghĩa là chuyển tiếp giữ một sự kiện mỗi (kind, pubkey, d-tag), vì vậy một republish thay thế thông báo trước đó tại chỗ. mỗi danh tính do đó có chính xác một bản ghi hiện tại, đó là những gì làm cho &ldquo;look up Alice's key&rdquo; một thu thập duy nhất không rõ ràng hơn là một danh sách để hòa giải.

chữ ký là ràng buộc. Sự kiện được ký bằng phím nhận dạng, vì vậy tuyên bố &ldquo;chìa khóa ML-KEM này thuộc về npub này&rdquo; là chính xác mạnh mẽ như npub chính nó. Thay thế một phím kết nối khác đòi hỏi phải tạo ra một chữ ký secp256k1. Một kẻ tấn công có thể làm điều đó không cần phải làm phiền với KEM.

Thông báo hết hạn 7 ngày NIP-40 hết hạn, được tái xuất bản mỗi 24 giờ, giữ hồ sơ một tuyên bố về một khách hàng vẫn đang chạy thay vì một khách hàng đã từng.

Một thông báo bị bỏ lỡ được đọc chính xác giống như một thông báo không bao giờ mang một chìa khóa: các đồng nghiệp gửi thông thường NIP-44, mà mỗi đăng nhập có thể đọc, và khách hàng tiếp tục trao đổi hậu lượng tử trên kết nối tiếp theo của nó, khi nó tái xuất bản. Vì vậy, yên tĩnh hơn một tuần chi phí bảo vệ cho các thông điệp được gửi trong khoảng cách - chúng được mã hóa cổ điển hơn là kháng lượng tử - và chi phí không có gì khác. giao hàng không bị ảnh hưởng, không có gì đã nhận được trở nên không thể đọc được, và không có hành động cần thiết khi trả lại.

Không có một, một bản ghi vượt qua chìa khóa mà nó đặt tên: một thiết bị bị xóa, đặt lại, hoặc có gốc của nó được thay thế để lại một hướng dẫn đứng để đóng gói vào một chìa khóa không ai giữ nữa, và các thông điệp gửi dưới nó bị mất mà không có lỗi trên cả hai bên. bảy ngày giới hạn cửa sổ đó, và cho phép các đại lý để lại bản ghi của chính họ thay vì dựa vào khách hàng để nhận thấy.

Khóa trường tên định dạng của nó. lĩnh vực là pk2, và chữ số là một phần của hợp đồng chứ không phải là trang trí: nó đặt tên cho định dạng tải trọng có thể được sử dụng với khóa. Một người đọc không nhận ra lĩnh vực kết thúc &ldquo;Nymchat khách hàng, không có phím hậu lượng tử&rdquo; và gửi NIP-44 thông thường, mà mỗi đăng nhập có thể đọc. Đó là hướng thất bại chính xác, và nó đáng nói là một quy tắc số định dạng tồn tại để thực thi: một yêu cầu khả năng không được công nhận phải chi phí bảo vệ, không bao giờ giao hàng. Một phím mà một đồng nghiệp không thể sử dụng là tồi tệ hơn không có phím ở tất cả, bởi vì thông điệp mà nó tạo ra bị mất mà không có lỗi trên cả hai bên.

4.1 Sự vắng mặt là có ý nghĩa, và được đánh giá ba

Một chi tiết tinh tế nhưng quan trọng: thông báo được công bố bởi mọi khách hàng Nymchat, không chỉ những khách hàng có khả năng sau lượng tử, và lĩnh vực khóa là tùy chọn.

quan sátCó nghĩaGửi hành vi
Thông báo với một key Nymchat, khả năng hậu lượng tử Hybrid
Thông báo, không có chìa khóa Nymchat, cổ điển chỉ - post-quantum off, hoặc một thiết bị chưa được liên kết với gốc của danh tính Thông số kỹ thuật NIP-17
Không thông báo Khách hàng chưa biết. có thể là bất kỳ người dùng Nostr hoặc Bitchat nào Classic, cộng với Compatibility Wrap

Một thông báo không chìa khóa là một tuyên bố được ký rằng người gửi chạy Nymchat, cho phép đường dẫn gửi bỏ qua một gói giao thức chéo đầu cơ mà nó sẽ phải bao gồm cho bất cứ ai mà nó không thể xác định.

4.2 Một thiết bị không thể mở rễ vẫn im lặng

Thông báo có thể thay thế: một sự kiện cho mỗi danh tính, ghi cuối cùng chiến thắng.Đó là những gì làm cho thiết kế bản ghi duy nhất hoạt động, và đó cũng là những gì làm cho một thiết bị không liên kết nguy hiểm nếu nó xuất bản.Một thiết bị đã công bố một khóa mà nó đã tự tạo ra sẽ chà đạp bản ghi thực sự và gửi mỗi đồng nghiệp để mã hóa dưới một khóa mà các thiết bị khác không thể mở.

Vì vậy, một thiết bị biết một gốc tồn tại nhưng không thể mở nó không xuất bản bất kỳ thông báo nào. Nó không bị phá vỡ và không bị khóa ra khỏi ứng dụng: nó vẫn đọc mọi thông điệp mà nó có các khóa và vẫn gửi theo cách cổ điển, đồng thời thúc giục người dùng liên kết nó. im lặng là hành vi đúng đắn cho một thiết bị không thể nói cho danh tính.

5Khám phá và quyết định gửi

Khách hàng học các phím của đồng nghiệp theo hai cách. đăng ký đứng bao gồm những người mà người dùng thực sự tương ứng với - các cuộc trò chuyện mở và các thành viên nhóm - vì vậy thông báo của họ đến như các sự kiện bình thường. Đối với một đồng nghiệp gặp lần đầu tiên, một truy vấn một lần chạy tại thời gian gửi, giới hạn ở 2,5 giây; nếu nó không giải quyết, thông điệp trở nên cổ điển, đó là hành vi tồn tại trước khi post-quantum được thêm vào thay vì một chế độ thất bại mới.

Một người dùng kết nối một thiết bị mới, hoặc người di chuyển từ đăng nhập phần mở rộng trình duyệt sang khóa địa phương, trở thành có khả năng sau lượng tử giữa cuộc trò chuyện, và một bộ nhớ cache vĩnh viễn sẽ giữ chúng trên mã hóa cổ điển trong suốt cuộc đời của thông báo.

5.1 Tại sao không có cuộc tấn công hạ cấp

Quyết định định tuyến đường giảm xuống một câu hỏi duy nhất:

pq = (we hold a signed, unexpired ML-KEM key for this recipient)

Không có đàm phán khả năng, không có danh sách các thuật toán được hỗ trợ, và không có lĩnh vực nào mà kẻ tấn công có thể làm rõ để ép buộc một con đường yếu hơn. Chế độ thất bại của một thông báo bị loại bỏ hoặc giữ lại là thông điệp trở nên cổ điển - hiện trạng trước tính năng này - thay vì một thông điệp lai được hạ cấp xuống một cái gì đó có thể giả mạo.

Converse cũng giữ và quan trọng hơn: một khách hàng gửi hybrid Chỉ khi nó giữ một chìa khóa, và giữ chìa khóa là bằng chứng người nhận có thể giải nén. Không có trạng thái nào trong đó một thông điệp được gửi sau lượng tử cho một người không thể đọc nó.

6Xây dựng hybrid

Nymchat không thay thế NIP-44. nó bao bọc nó. một văn bản mã hóa NIP-44 không sửa đổi là lớp bên trong, và ML-KEM khóa một AEAD bên ngoài xung quanh nó:

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)

Cả hai bí mật vẫn phải được khôi phục để đọc thông điệp: lớp bên ngoài chỉ tạo ra một văn bản mã hóa NIP-44, và việc mở đó cần ECDH cổ điển.Một đối thủ lượng tử phá vỡ secp256k1 nhận được khóa bên trong và vẫn đối mặt với ML-KEM; một sự phá vỡ của ML-KEM cắt lớp bên ngoài và để lại NIP-44 đứng.

Khóa ML-KEM của người nhận có tuổi thọ lâu dài, nhưng mỗi thông điệp mang một văn bản mã hóa độc lập và do đó là một khóa mã hóa độc lập. kem_ssĐó là những gì làm cho việc dẫn xuất nonce thay vì ngẫu nhiên nó âm thanh: Đồ họa: ChaCha20-Poly1305 được phá vỡ bằng cách tái sử dụng một cặp (chìa khóa, nonce), và ở đây chính chìa khóa là mới cho mỗi thông điệp, vì vậy không cặp nào có thể lặp lại.

6.1 Tại sao các lớp vẫn tách biệt

Lựa chọn thay thế là trộn cả hai bí mật vào một khóa hội thoại duy nhất và chuyển nó cho NIP-44:

ck = HKDF-Extract(salt = "…",
                  IKM  = ecdh_x || kem_ss || …)          // do not do this

Việc xây dựng đó nghe có vẻ như mã hóa. nó có một vấn đề cấu trúc: nó cần ecdh_x, tọa độ x thô của đầu ra ECDH, như là tài liệu chính - và một phần mở rộng trình duyệt (NIP-07) hoặc một chữ ký từ xa (NIP-46Nó thực hiện NIP-44 thay mặt cho người gọi và trả lại một văn bản mã hóa, đó là toàn bộ điểm giữ khóa ở đâu đó mà ứng dụng không thể tiếp cận.

Do đó, việc trộn các bí mật loại trừ mọi đăng nhập giữ khóa nhận dạng trong một người ký, tức là người dùng cẩn thận nhất, và không có số lượng công việc về dẫn xuất khóa có thể thay đổi nó. Layering loại bỏ sự phụ thuộc: NIP-44 vẫn còn nguyên vẹn và được sản xuất bởi bất cứ thứ gì giữ khóa nhận dạng, người ký bao gồm, trong khi nửa KEM được tính từ mã khôi phục mà khách hàng nắm giữ trực tiếp.

Chi phí là băng thông, và nó không phải là nhỏ. văn bản mã hóa ML-KEM là 1.088 byte và lái xe trên mỗi thông điệp, base64url-mã hóa đến 1.451 ký tự; AEAD bên ngoài thêm một thẻ 16 byte Poly1305 và mở rộng tải trọng NIP-44 nó bao bọc bằng một phần ba. Một thông điệp 50 ký tự phát triển từ 176 byte đến 1.712, và một 2000 ký tự từ 2.820 đến 5.238.

6.2 Tự mô tả payloads

Các pq2. tiền tố làm cho triển khai tăng dần: nó tự mô tả, vì vậy một khách hàng chọn con đường giải mã bằng cách kiểm tra tải trọng có thể sử dụng thay vì bằng cách tin tưởng một thẻ hoặc ghi nhớ những gì một đồng nghiệp hỗ trợ. Một người đọc không nhận ra một tiền tố không thể mở tải trọng có thể sử dụng đó thay vì đọc sai nó, và tin nhắn được niêm phong trước khi cả hai bên có thể làm cho hậu lượng tử được đọc như NIP-44 thông thường mà không cần di chuyển.

Từ chối ngụ ý

ML-KEM decapsulation được thiết kế để không bao giờ thất bại: với văn bản mã hóa bị biến dạng, chuyển đổi Fujisaki-Okamoto trả về một bí mật giả ngẫu nhiên xác định thay vì lỗi. Do đó, một phím sai không bề mặt trên lớp KEM ở tất cả - nó bề mặt như một sự thất bại của HMAC bên trong NIP-44, giống như một bề mặt phím cổ điển sai. Người gọi xử lý cả hai cùng một cách, vì vậy sự thất bại không mang lại tín hiệu phân biệt. Đó cũng là những gì làm cho danh sách ứng cử viên của Mục 9.1 có thể làm việc: một khách hàng thử từng phím một lần và cho phép NIP-44 nói cái nào là đúng.

6.3 Cả hai lớp của bao bì quà tặng

A NIP-17 Thông điệp cá nhân là a NIP-59 bao bì quà tặng: một tin đồn không ký, được niêm phong dưới khóa nhận dạng của người gửi (loại 13), sau đó được niêm phong dưới một khóa thả được tạo ra mỗi tin nhắn (loại 1059).

A hybrid NIP-59 gift wrap: the rumor sealed under the sender's key, that seal wrapped under a per-message ephemeral key, both layers carrying a NIP-44 ciphertext inside a post-quantum AEAD. kind 1059 — wrap  ·  signed by a per-message ephemeral key content = pq2.<kem_ct>.<aead>   inner = NIP-44(eph, recip)   outer key = ML-KEM(recip) kind 13 — seal  ·  signed by the sender's identity key content = pq2.<kem_ct>.<aead>   inner = NIP-44(sender, recip)   outer key = ML-KEM(recip) rumor — unsigned the message: kind, content, tags, author pubkey unsigned on purpose — a signature would be portable proof
Cả hai lớp mã hóa đều là hybrid, mỗi lớp đều có kết nối ML-KEM độc lập. lớp bên ngoài được khóa vào một bí mật được ném ra, vì vậy bao bì không tiết lộ người gửi.

Một đăng nhập người ký chỉ nhận được lớp bên ngoài. Bìa được sản xuất bởi người ký như NIP-44 thông thường - ứng dụng không bao giờ nhìn thấy khóa tạo ra nó - vì vậy nó không thể được hỗn hợp tại chỗ. Điều này không tốn gì chống lại cuộc tấn công trong câu hỏi: bìa chỉ có thể đạt được thông qua bao bì, và bìa là những gì một máy ghi âm lưu trữ. Một đối thủ giữ lưu lượng truy cập được ghi lại phải phá vỡ ML-KEM trước khi một con dấu thậm chí có thể nhìn thấy để tấn công.

7Nhóm tin nhắn và phần phủ sóng

Một thông điệp nhóm không phải là một văn bản mã hóa. Nó là cùng một văn bản đơn giản được phát ra cho mỗi thành viên, mỗi bản sao được đóng gói vào khóa ML-KEM của thành viên đó. Một thành viên đã xuất bản một khóa nhận được một bao bì lai; một người không nhận được một bao bì cổ điển.

Điều này tạo ra một vấn đề kế toán mà một thực hiện ngây thơ bị sai. nếu tám trong số mười thành viên nhận được một bản sao lai, thông điệp là không Một đối thủ cần một bản sao cổ điển của một văn bản đơn giản là giống hệt nhau trong tất cả mười, vì vậy thông điệp được bảo vệ chỉ nếu mọi Bản sao là

Nymchat do đó theo dõi bảo hiểm mỗi tin nhắn trong quá trình fan-out - con số chỉ có thể biết được trong khi các wraps đang được xây dựng - và badge báo cáo &ldquo;kháng lượng đến 8 trong số 10 thành viên&rdquo; thay vì tuyên bố tin nhắn được bảo vệ. nhận được tin nhắn nhóm (chỉ người gửi đếm fan-out), giao diện báo cáo một phần thay vì bảo vệ đầy đủ.

7.1 Những gì khiên báo cáo

Lá chắn nói lên sự thật về Thông điệp, không phải về phần mềm đã gửi nó:

Bản án được ghi lại khi thông điệp được niêm phong thay vì được tính lại từ những gì một đồng nghiệp quảng cáo sau đó.Chiffertext đã tồn tại không thể được bảo vệ tốt hơn nó là, và một giao diện mà tái tạo tin nhắn cũ về sức mạnh của một thông báo mới sẽ tuyên bố một cái gì đó sai về byte trên một chuyển tiếp.

Các quy tắc nhóm ở trên xếp chồng lên trên này thay vì thay thế nó: một thông điệp nhóm được bảo vệ đầy đủ chỉ khi bản sao của mỗi thành viên là, và một thông điệp nhóm nhận được mà không có số lượng bao phủ hiển thị một phần.

8Bản sao dành cho bản thân

Một số thứ mà một máy khách lưu trữ được mã hóa theo danh tính của người dùng: cài đặt đồng bộ, danh sách hội thoại, phím nhóm và lưu trữ tin nhắn. Những thứ này mang nhiều thông tin về người dùng hơn hầu hết các tin nhắn duy nhất, vì vậy để lại chúng cổ điển sẽ làm cho chúng trở thành hiện vật được lưu trữ yếu nhất bất kể chính tin nhắn đã được niêm phong cẩn thận như thế nào. nymchat-pq-root tự loại, mà không thể được niêm phong dưới một chìa khóa mà chỉ có nó có thể sản xuất.

Một cài đặt blob hoặc một hàng lưu trữ ngồi ở một nơi trong nhiều năm, đó là chính xác hình dạng của một thứ mà một đối thủ thu hoạch - bây giờ giải mã - sau đó thu thập - nhiều hơn bất kỳ thông điệp duy nhất nào, ít nhất là tạm thời trong tâm trí của người dùng.

Một hạn chế quản lý định dạng ở đây thay vì khóa. một bản sao tự địa chỉ phải có thể đọc được bởi mọi thiết bị trên tài khoản, vì vậy mỗi thiết bị quảng cáo những gì nó có thể mở trong danh sách quảng cáo của nó mang, và tài khoản chỉ viết những gì tất cả họ có thể đọc. Viết bất cứ điều gì khác sẽ khóa một thiết bị ra khỏi cài đặt của riêng mình - cùng một sự thất bại thầm lặng Mục 3.2 tránh bằng các phương tiện khác, đến từ một hướng khác.

Một hạn chế đáng nói

Một thiết bị có danh tính nhưng không có gốc không thể mở bất cứ thứ gì được niêm phong với khóa gốc, bao gồm cả cài đặt của nó.Đó là một hậu quả có chủ ý, không phải là một sự giám sát, và đó là lý do tại sao Phần 3.3 có một thiết bị nhắc nhở để liên kết thay vì đúc một gốc mới: một gốc thứ hai sẽ không làm cho blob có thể đọc được, nó sẽ chỉ chia tài liệu khóa của danh tính thành hai.Trong khi người dùng kết nối nó, thiết bị tiếp tục hoạt động - nó đọc những gì nó có các khóa và gửi theo cách cổ điển.

Một thiết bị chạy một phần mở rộng trình duyệt hoặc một chữ ký từ xa (NIP-46) không có nsec để bắt nguồn từ, nhưng nó giữ mã phục hồi, và theo cấu trúc lớp của Phần 6.1 đó là tất cả các nửa hậu lượng tử cần: chữ ký sản xuất lớp NIP-44 như nó luôn luôn có, và khách hàng khóa lớp bên ngoài chính nó.

9Rotation

Các epoch Counter trong dẫn xuất là những gì làm cho quay có thể mà không có vật liệu khóa mới. Tăng nó tạo ra một cặp phím mới từ cùng một gốc và một thông báo tái xuất bản; các đồng nghiệp lấy phím mới từ bản ghi có thể thay thế. Rotation do đó không yêu cầu người dùng viết bất cứ điều gì xuống một lần thứ hai: gốc được tạo ra một lần cho mỗi danh tính và thời đại làm cho sự đảo ngược.

9.1 Các thời đại cũ được giữ lại, và không có gì được mã hóa lại

Một khách hàng xây dựng các ứng cử viên giải mã từ thời đại hiện tại xuống đến thời đại &minus; 3, vì vậy một thông điệp được niêm phong ngay trước khi quay vẫn mở ra chống lại cặp phím hiện tại khi nó được gửi.

Cửa sổ đó là những gì làm cho sự xoay vòng hoàn toàn an toàn: nếu không có nó, mỗi lần xoay sẽ làm hỏng bất cứ điều gì đang bay. Bất cứ điều gì đã được niêm phong vẫn có thể đọc được trong suốt cuộc đời của danh tính, bởi vì một thông điệp mà người dùng không còn có thể mở là nghiêm túc tồi tệ hơn đối với họ so với một thông điệp mà bảo vệ không thể được cải thiện ngược lại (Phần 10.5).

10Điều gì không bảo vệ

Một bài báo chỉ liệt kê những gì một thiết kế đạt được không phải là mô tả một hệ thống, và đánh giá quá cao một thuộc tính bảo mật trong một giao diện là tồi tệ hơn là bỏ qua nó.

10.1 Rễ là một bí mật thứ hai, và mất nó là không thể phục hồi

Đây là giá thực sự của thiết kế. Hạn chế trong Phần 2 rằng một người dùng nên có chính xác một điều để giữ không thể được đáp ứng: nsec một mình không tái tạo khóa hậu lượng tử, bởi vì toàn bộ điểm là không có giá trị công khai và không bí mật nào khác phơi bày nó. Nếu không có thiết bị nào giữ gốc và không có nắp của Phần 3.2 có thể được mở, vật liệu được niêm phong vào khóa gốc không thể phục hồi.

Với chuyển thủ công con đường duy nhất, đây là sắc nét hơn so với nó có thể đọc lần đầu tiên. nympq1… mã bất cứ nơi nào có chính xác một bản sao của nó, trên một thiết bị, và mất thiết bị đó mất mọi thông điệp hậu lượng tử, cài đặt blob và hàng lưu trữ được niêm phong với nó. nsec không giúp ích; đó là tài sản mà toàn bộ thiết kế dựa trên.

Một kẻ tấn công tấn công con đường rẻ nhất có sẵn, vì vậy một kế hoạch có giá trị con đường phục hồi yếu nhất của nó - ví dụ, một khẩu hiệu đáng nhớ sẽ đặt toàn bộ mọi thứ ở bất cứ giá trị nào của khẩu hiệu, và hàng bao bọc chính xác là hiện vật một đối thủ thu thập và nghiền offline trong thời gian rảnh rỗi.

10.2 Xác thực, khác với bảo mật

Mỗi chữ ký trong Nostr là Schnorr trên secp256k1, và điều đó không thay đổi ở đây. Một đối thủ với một máy tính lượng tử có thể giả mạo chữ ký và giả vờ một người dùng trong thời gian thực. Những gì trao đổi phím lai đánh bại là thu hoạch bây giờ giải mã sau: một kẻ tấn công ghi lại lưu lượng truy cập ngày hôm nay không thể đọc nó sau này. Nó không làm cho một thông điệp không thể tha thứ chống lại một đối thủ đã có máy. Sự khác biệt này được đưa vào các ứng dụng một cách có chủ ý - chỉ số padlock báo cáo xác thực, khiên báo cáo bảo mật, và chúng là các glyph riêng biệt bởi vì một thông điệp có thể có một mà không có nhau.

Nó cũng giới hạn những gì thông báo trong Phần 4 có thể hứa hẹn. Liên kết giữa một npub và một khóa ML-KEM là một chữ ký secp256k1, vì vậy một đối thủ có thể giả mạo chúng có thể thay thế một khóa của riêng họ.

3.3 Metadata

Gift wrapping che giấu người gửi, người nhận vượt ra ngoài một p thẻ, loại, và dấu thời gian của thông điệp bên trong. Nó không che giấu rằng một sự kiện tồn tại, kích thước của nó, hoặc khi một chuyển tiếp nhận được nó. phân tích lưu lượng truy cập không được giải quyết bởi bất kỳ phần nào của thiết kế này.

10.4 Mesh Offline

Nymchat's Bluetooth mesh transport là một giao thức riêng biệt với tay cầm riêng của nó, và nó không được bao gồm bởi công việc này.

10.5 Tin nhắn đã được gửi

Ciphertext ghi lại trong khi cả hai bên vẫn là cổ điển cổ điển vĩnh viễn. Nó đã tồn tại và không thể được niêm phong lại. Bảo vệ bắt đầu tại thông điệp nơi cả hai bên giữ các phím hậu lượng tử, không phải tại thời điểm tính năng được bật.

11Các lựa chọn thay thế được xem xét

Cách tiếp cậnTại sao không
Lấy chìa khóa hậu lượng tử từ chìa khóa nhận dạng Từ chối. dẫn xuất là một thuật toán công khai trên nsec, và một đối thủ lượng tử phục hồi nsec từ npub được xuất bản, do đó phá vỡ nửa cổ điển tay trên nửa hậu lượng tử với nó.
Gửi root đến các thiết bị khác của người dùng qua NIP-44 Một gốc được truyền dưới mã hóa cổ điển-chỉ có thể được phục hồi bởi bất cứ ai đã ghi lại thông điệp đó và phá vỡ khóa của nó sau đó, đó là đối thủ gốc tồn tại để ngăn chặn.
Một cặp phím ML-KEM được tạo riêng trên mỗi thiết bị Các thiết bị sẽ giữ các phím giải nén khác nhau, và một quảng cáo có thể thay thế cho mỗi danh tính không thể mang tất cả chúng. Các đồng nghiệp sẽ mã hóa cho bất cứ khóa nào được phát hành lần cuối, và mọi thiết bị khác sẽ không thể đọc kết quả. Một gốc cho mỗi danh tính, được di chuyển bởi các con đường của Phần 3.2, là những gì tránh được điều đó.
Đóng rễ dưới một PIN Một mã PIN bốn chữ số là khoảng 13 bit so với một kẻ tấn công ngoại tuyến giữ hàng được đóng gói. cung cấp nó bên cạnh hai con đường 256 bit sẽ miêu tả sai giá trị của bao bì yếu nhất.
Mở NPUB để mang cả hai phím 1,184 bytes không phải là một định danh có thể chia sẻ, và nó sẽ phá vỡ tất cả các khách hàng Nostr hiện có phân tích một địa chỉ được xác định là 32 byte.
Dịch vụ Key Directory Giới thiệu lại thẩm quyền mà mạng tồn tại để tránh.Ai trả lời tìm kiếm quyết định ai có thể đọc thông điệp.
Thêm chìa khóa vào mỗi thông điệp Không giải quyết gì: Người gửi cần Người nhận chìa khóa trước thông điệp đầu tiên, đó là chính xác trường hợp không có thông điệp trước để mang nó.
In-band khả năng đàm phán Tạo một bề mặt hạ cấp. Một kẻ tấn công có thể loại bỏ một lá cờ khả năng buộc con đường cổ điển.
Post-quantum chỉ, không có chân cổ điển Bỏ qua nhiều thập kỷ phân tích của secp256k1 để đổi lấy một nguyên thủy trẻ hơn nhiều. cả hai Đã Fail

12Parity thực hiện

Nymchat cung cấp hai triển khai độc lập của cấu trúc này – một trong JavaScript cho ứng dụng web, một trong Dart cho các ứng dụng di động, bao gồm cả cổng ML-KEM-768 từ đầu.

Việc thực hiện Dart ML-KEM được xác nhận chống lại chính thức NIST ACVP Đánh giá chất lượng sản phẩm (Xem chi tiết)ML-KEM-*-FIPS203) — 25 key-generation, 25 encapsulation và 10 decapsulation trường hợp, chạy như suite riêng của họ. Đó là các vector NIST xuất bản để xác nhận một triển khai, vì vậy thông qua chúng là bằng chứng cổng là chính xác, không chỉ là bằng chứng rằng hai khách hàng đồng ý với nhau. Hơn nữa, một fixture chung của các vector thử nghiệm - derivation hạt giống, encapsulation, cả hai định dạng payload, và complete gift wraps - được tạo ra từ tham chiếu JavaScript và kiểm tra bởi cả hai bộ thử nghiệm. root secret mở rộng fixture đó thay vì thay thế nó: root để hạt giống, root để keypair, dấu vân tay công cộng của gốc, và các khóa dẫn xuất, nonce và dữ liệu liên quan của lớp bên ngoài là vector của riêng họ, vì vậy hai khách hàng không thể không đồng ý về những gì một nympq1… Code có nghĩa là hoặc về các byte một thông điệp được niêm phong với. Một sự khác biệt trong cả hai thực hiện thất bại xây dựng thay vì sản xuất một thông điệp mà các khách hàng khác không thể mở.

Đó là những gì nói với một thiết bị &ldquo;đây là gốc tôi giữ&rdquo; từ &ldquo;đây là một khác nhau &rdquo;, và một khách hàng không thể sao chép dấu vân tay của một khách hàng khác sẽ đọc một hồ sơ hoàn toàn tốt như không có hồ sơ nào cả - và sau đó, theo Mục 3.3, tạo ra một gốc thứ hai và chia tách danh tính.

Nymchat là Nguồn mở theo AGPL-3.0. lõi mã hóa được mô tả ở đây là js/nym-crypto.jsjs/modules/pq.js trên website của khách hàng, và lib/core/crypto/ Với lib/features/identity/pq_registry.dart trong các khách hàng di động.

Để giải thích ngắn hơn, không kỹ thuật, xem Trang cơ sở kiến thức về mã hóa kháng lượng tử.