mã hóa / giải mã bằng nhiều khóa


110

Có thể mã hóa dữ liệu để nó có thể được giải mã bằng nhiều khóa khác nhau không?

Thí dụ:

Tôi đã mã hóa dữ liệu bằng key1, nhưng tôi muốn có thể giải mã bằng các khóa 2, 3 và 4.

Điều này có khả thi không?

Câu trả lời:


170

GnuPG thực hiện mã hóa đa khóa theo tiêu chuẩn.

Lệnh sau sẽ mã hóa doc.txtbằng khóa công khai cho Alice và khóa công khai cho Bob. Alice có thể giải mã bằng khóa riêng của mình. Bob cũng có thể giải mã bằng khóa riêng của mình.

gpg --encrypt --recipient alice@example.com \
    --recipient bob@example.com doc.txt

Tính năng này được trình bày chi tiết trong phần hướng dẫn sử dụng có tên " Mã hóa và giải mã tài liệu "


Như trên. Thật tuyệt khi biết cách làm điều đó, nhưng tôi không thể tìm thấy trang nào ẩn trên đó.
MarkusQ

@Mitch, tôi đã đăng một câu trả lời rằng có thể có câu trả lời của chúng tôi! (Xin vui lòng kiểm tra và khen thưởng nếu có / không - nhiều đánh giá cao!)
pythonlarry

@MarkusQ, xem liên kết của tôi tới Mitch ở trên. Kiểm tra / cảm ơn nếu bạn có thể! :-)
pythonlarry

Vì vậy, điều này dẫn đến 1 tệp được mã hóa có thể được đọc bằng khóa riêng, không phải 1 tệp cho mỗi khóa?
user8675309

7
@ user8675309, Có. Dữ liệu được mã hóa bằng một khóa đối xứng chung. Chỉ có khóa đối xứng được mã hóa bởi khóa công khai của mỗi người nhận. Nó không mã hóa lại toàn bộ dữ liệu cho từng người nhận.
khôn ngoan

55

Vâng nó có thể

Có thể mã hóa cho nhiều người nhận. Cũng có vẻ hợp lý khi bạn nghĩ rằng bạn có thể muốn đọc những gì bạn đã gửi cho ai đó và để làm như vậy, bạn cần phải có trong danh sách người nhận.

Dòng lệnh

Đây là cách thực hiện thông qua gpgdòng lệnh (như được mô tả trong câu trả lời của David Segonds ):

gpg --encrypt \
  --recipient alice@example.com \
  --recipient bob@example.com \
clear-message.txt

Ứng dụng khách GUI

GUI của bạn phải cung cấp cách mã hóa cho nhiều người

Cơ chế

Có một câu hỏi về Bảo mật thông tin , Kích thước tệp GPG với nhiều người nhận? , giải thích cơ chế mã hóa :

GPG mã hóa tệp một lần bằng khóa đối xứng, sau đó đặt tiêu đề xác định cặp khóa đích và phiên bản mã hóa của khóa đối xứng.

[...] Khi được mã hóa cho nhiều người nhận, tiêu đề này được đặt nhiều lần cung cấp một phiên bản mã hóa duy nhất của cùng một khóa đối xứng cho mỗi người nhận .


4
cảm ơn đặc biệt cho hai câu cuối cùng: họ đã làm cho mọi thứ rõ ràng chính xác bây giờ!
radistao

31

Các máy khách GnuPG và PGP nói chung thường mã hóa dữ liệu thực tế bằng một khóa đối xứng được gọi là "khóa phiên". Khóa phiên sau đó được mã hóa với mỗi "khóa người nhận" (tức là những khóa bạn chỉ định với -r / - người nhận). Điều này đôi khi được gọi là mật mã lai . Ngay bây giờ, tôi tin rằng GnuPG theo mặc định sử dụng khóa phiên 256 bit và AES để mã hóa dữ liệu bản rõ thành khóa phiên AES-256 đó và khóa người nhận là RSA / DSA / ECDSA / v.v. của bạn. khóa assymetric trong trường hợp này.

Một lý do để làm theo cách này là các thuật toán mật mã đối xứng như AES thường nhanh hơn nhiều so với các thuật toán bất đối xứng như RSA. Vì vậy, GnuPG chỉ phải mã hóa ~ 256 bit (khóa phiên) bằng RSA và có thể sử dụng AES để mã hóa dữ liệu (lớn tùy thích!) Với khóa phiên đó. Máy của Intel thậm chí còn có hướng dẫn tích hợp, AES-NI , để thực hiện một số bước của thuật toán trong phần cứng, điều này làm cho GnuPG cực kỳ linh hoạt trong việc mã hóa / giải mã dữ liệu.

Một lý do khác để làm theo cách này là nó cho phép các tài liệu được mã hóa bằng PGP được mã hóa cho nhiều bên mà không cần phải tăng gấp đôi kích thước của tài liệu. Lưu ý rằng khi bạn chỉ định nhiều người nhận cho một tài liệu được mã hóa (ví dụ:gpg -ea -r Alice -r Bob -o ciphertext.asc ), tài liệu được mã hóa được lưu trữ (ciphertext.asc) không lớn gấp 2 lần như thể bạn vừa mã hóa nó cho Alice.

Xem thêm --show-session-keythông số trong trang người dùng gpg để có thể chỉ giải mã khóa phiên, chẳng hạn như để cho phép bên thứ ba giải mã tài liệu đã được mã hóa cho bạn mà không cần phải chuyển cho họ khóa cá nhân hoặc dữ liệu bản rõ.


1
Cảm ơn vì lời giải thích trên tài liệu được mã hóa không lớn hơn n lần trong đó n là số người ký.
theartofbeing

4

Vâng nó có thể. Google "mã hóa nhiều bên" để bắt đầu.

AFAIK, không có thả chúng vào và sử dụng các gói cho nó.

- MarkusQ

Tái bút: Để có bản phác thảo về cách nó có thể được thực hiện, hãy xem xét điều này. Thông điệp được mã hóa bao gồm:

  • trọng tải, được mã hóa bằng bảng một lần
  • bảng thời gian một lần, được mã hóa bằng key1
  • bảng thời gian một lần, được mã hóa bằng key2
  • ...
  • bảng thời gian một lần, được mã hóa bằng keyN

Người nhận giữ chìa khóa, tôi chỉ cần giải mã bản sao của pad bằng chìa khóa của họ, sau đó giải mã tải trọng.

Tuy nhiên, đây chỉ là một bằng chứng cho thấy nó có thể được thực hiện và sẽ hút như một thực hiện thực tế. Nếu có thể, bạn nên tránh sử dụng mã hóa của riêng mình. Nếu bạn không hiểu tại sao, bạn chắc chắn nên tránh sử dụng mã hóa của riêng mình.

-----Biên tập ------------

Nếu tôi sai và các công cụ Gnu làm được điều đó, hãy sử dụng chúng. Nhưng tôi dường như không thể tìm thấy bất kỳ thông tin nào về cách làm điều đó.


1
Điều có thể hấp dẫn về điều này là một khi bạn biết bảng thời gian, bạn sẽ có một văn bản thuần túy đã biết, cùng với các giá trị được mã hóa cho các khóa khác. Sử dụng thông tin này, bạn có thể dễ dàng tìm ra các khóa khác là gì.
Kibbee

2
"Mã hóa đa bên" của Google không xuất hiện nhiều. Bạn có thể sẽ gặp may mắn hơn với "mã hóa phát sóng" cũng bao gồm trường hợp này.
staktrace 17/10/10

1
@Kibbee: Các khóa không phải là bí mật, chúng là công khai. Vì vậy, làm cho nó dễ dàng hơn để tìm ra chúng là gì không quan trọng. (Những đề án chỉ được sử dụng với các phím mà chỉ có thể được sử dụng để mã hóa, giải mã không.)
David Schwartz

5
Tôi khá chắc chắn rằng các triển khai thực tế không sử dụng một bảng chia sẻ một lần (cần phải lớn bằng văn bản thuần túy và văn bản được mã hóa, do đó tăng gấp đôi kích thước thư), nhưng thực sự sử dụng khóa mã hóa đối xứng được chia sẻ (thường nhỏ hơn nhiều so với thông báo).
Joachim Sauer

-16

Nhiều (hơn hai) RSA khóa có thể giống như thế này - tôi không phải là nhà toán học, vì vậy thuật toán này không nhất thiết phải an toàn, tôi chỉ muốn đưa ra ý tưởng về nó.

m = p * q * r; p, q, r là các số nguyên tố lớn

fi (m) = (p-1) (q-1) (r-1)

d == (e1 * e2 * e3 * ... * ei) ^ (- 1) (mod fi (m)); e1 ... ei là các số tùy ý, d được tính để hoàn thành phương trình

y1 == x ^ e1 (mod m)

y2 == y1 ^ e2 (mod m)

y3 == y2 ^ e3 (mod m)

...

x == yi ^ d (mod m)

Ví dụ, thuật toán này có thể được sử dụng để tăng tốc độ của Bộ định tuyến Onion.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.