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:
- Lấy 256 bit bí mật
hạt giống từ CSPRNG
- 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
- Tách ra
hạt giống thành 128 bit Muối và 128 bit khóa_vật liệu
- 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>)
- Chia thành 128 bit
mã hóa_key, 256 bit HMAC_key
Đối với mỗi tin nhắn được gửi:
- Lấy 128 bit từ CSPRNG dưới dạng
mã hóa_iv
- Mã hóa bản rõ bằng cách sử dụng
AES-128-CTR(iv=encryption_iv, key=encryption_key)
- Tính toán thẻ như
HMAC-SHA-256(key=HMAC_key, data=encrypted_seed ||crypto_iv || cipherspec=AES-128-CTR || ciphertext)
- 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:
- 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.
- 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
- Tách ra
hạt giống thành 128 bit Muối và 128 bit khóa_vật liệu
- 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>)
- Chia thành 128 bit
mã hóa_key, 256 bit HMAC_key
- 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ẻ>)
- 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ì
- 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>
- Giải mã bản mã dưới dạng
[cipherspec](iv=encryption_iv, key=k)
- 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.