Điểm:1

Cách soạn (H)KDF, Mã hóa và (H)MAC

lá cờ mk

Vì các lý do cũ, một trong các hệ thống của tôi không có tùy chọn sử dụng chế độ AEAD, chúng tôi bị hạn chế sử dụng AES ở chế độ CBC hoặc CTR đơn giản cộng với MAC.

Nhiệm vụ điển hình là truyền dữ liệu từ nút này sang nút khác trong khi vẫn đảm bảo tính toàn vẹn và bảo mật. Tôi thấy mình liên tục chỉ định thành phần sau:

  • CSPRNG để tạo bí mật bootstrap
  • KDF để lấy khóa mã hóa và MAC - Tôi sử dụng HKDF
  • CSPRNG một lần nữa nhận được một iv
  • Chế độ CTR để mã hóa dữ liệu
  • MAC over bootstrap secret, iv, cipherspec và ciphertext - Tôi sử dụng HMAC

Vì vậy, tôi đang thực hiện Encrypt-then-MAC và tôi đang xác thực tất cả các đầu vào để tính toán bản mã. Nhưng tôi đã hoàn toàn cho rằng thành phần này là an toàn. Tôi chưa bao giờ thực sự thấy thành phần đầy đủ này bao gồm cả KDF được mô tả là nguyên thủy có thể tái sử dụng.

TLS làm điều gì đó rất giống nhau, nhưng nó không hoàn toàn giống nhau (ví dụ: nó sử dụng HKDF theo cách khác).

Các lược đồ IES như ECIES và DLIES trông giống nhau về mặt khái niệm, nhưng khác nhau về chi tiết, đặc biệt là cách các đầu vào của KDF được lấy.

Vì vậy, câu hỏi của tôi là: vấn đề này có đủ tổng quát để đảm bảo một giải pháp sách dạy nấu ăn không? Hoặc có thể một cái gì đó đã tồn tại mà tôi đã bỏ qua? Nếu không, làm thế nào tôi có thể tin tưởng vào giải pháp? (Khi nói đến tiền điện tử, tôi luôn thận trọng).

Trong trường hợp các chi tiết hữu ích, quy trình là:

Nút gửi thực hiện như sau:

  1. Lấy 256 bit bí mật hạt giống từ CSPRNG
  2. mã hóa hạt giống cho nút khác sử dụng khóa công khai của nó như mã hóa_seed
  3. Tách ra hạt giống thành 128 bit Muối và 128 bit khóa_vật liệu
  4. Lấy 384 bit bí mật bằng cách gọi HKDF-HMAC-SHA-256(length=384b, ikm=key_material, salt=salt, info=<id nút nguồn || id nút đích>)
  5. Chia thành 128 bit mã hóa_key, 256 bit HMAC_key

Đối với mỗi tin nhắn được gửi:

  1. Lấy 128 bit từ CSPRNG dưới dạng mã hóa_iv
  2. Mã hóa bản rõ bằng cách sử dụng AES-128-CTR(iv=encryption_iv, key=encryption_key)
  3. Tính toán thẻ như HMAC-SHA-256(key=HMAC_key, data=encrypted_seed ||crypto_iv || cipherspec=AES-128-CTR || ciphertext)
  4. Gửi đến nút khác: được mã hóa || mã hóa_iv || mật mã || bản mã || nhãn

Nút nhận thực hiện như sau:

  1. Phân tích tin nhắn nhận được thành các thành phần của nó mã hóa_seed vân vân.
  2. giải mã mã hóa_seed sử dụng khóa riêng của nút nhận, lấy hạt giống
  3. Tách ra hạt giống thành 128 bit Muối và 128 bit khóa_vật liệu
  4. Lấy 384 bit bí mật bằng cách gọi HKDF-HMAC-SHA-256(length=384b, ikm=key_material, salt=salt, info=<id nút nguồn || id nút đích>)
  5. Chia thành 128 bit mã hóa_key, 256 bit HMAC_key
  6. Tính toán thẻ như HMAC-SHA-256(key=HMAC_key, data=<thông báo nhận được từ nút gửi không có thẻ>)
  7. Giao phó tag_valid := true nếu thẻ khớp với thẻ trên tin nhắn đã nhận, sai nếu không thì
  8. Giao phó k := mã hóa_key nếu tag_valid, nếu không thì gán k := <một số hằng số ngẫu nhiên>
  9. Giải mã bản mã dưới dạng [cipherspec](iv=encryption_iv, key=k)
  10. Xuất một bộ (tag_valid, bản rõ) - người gọi có trách nhiệm kiểm tra tag_valid trước khi sử dụng bản rõ

Vì vậy, những gì có thể đi sai? Vâng, đối với một hạt giống giá trị được sử dụng trước khi thẻ MAC được kiểm tra. Tôi có thể ký nó bằng khóa riêng của nút gửi, nhưng điều đó không thực sự ràng buộc hạt giống vào thẻ MAC. Ngoài ra, điều này đang bắt đầu trở nên lộn xộn, do đó tôi cảm thấy khó chịu.

kelalaka avatar
lá cờ in
Nếu bạn có một hệ thống khóa chung đáng tin cậy, tại sao bạn không tạo tài liệu khóa ngẫu nhiên thống nhất 512-bit và sử dụng là 256-bit AES-256 và 256-bit cho HMAC và gửi qua cơ chế khóa chung để đơn giản hóa giao thức?
eddydee123 avatar
lá cờ mk
Thật vậy, tôi đã đơn giản hóa tình hình thực tế - trong thực tế, có nhiều khóa hơn cho các mục đích khác cần được gửi. Đó là lý do tại sao tôi gửi một hạt giống KDF thay vì các khóa. Câu hỏi của tôi cố gắng khái quát hóa thành một thành phần chung của KDF+Enc+MAC.
kelalaka avatar
lá cờ in
Trong trường hợp này, bạn có thể cần DRBG để thỏa hiệp ở trạng thái hiện tại không bị rò rỉ ở các giai đoạn trước và sau.
eddydee123 avatar
lá cờ mk
@kelalaka Tôi bối rối - ý bạn là DRBG thay vì HKDF? Tôi không theo lý luận
kelalaka avatar
lá cờ in
Không chính xác, tùy thuộc vào trường hợp sử dụng hạt giống của bạn, bạn có thể cần gọi nó để không thỏa hiệp bất cứ điều gì, ví dụ:. $seed_1 = DRGB(seed_0),HKDF(seed_1), seed_2 = DRGB(seed_1),HKDF(seed_2), ...)$

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.