it-swarm-vi.com

Tại sao người ta không nên sử dụng cùng một khóa bất đối xứng để mã hóa như khi họ ký?

Trong một câu trả lời cho câu hỏi về RSA và PGP, PulpSpy lưu ý điều này:

Có thể tạo cặp khóa RSA bằng GPG (cho cả mã hóa và ký - bạn không nên sử dụng cùng một khóa cho cả hai).

Lý do đằng sau này là gì?

Có lẽ sự hiểu biết của tôi về mã hóa khóa công khai là thiếu sót, nhưng tôi nghĩ rằng các hoạt động gần giống như thế này:

  • Khi Bob muốn mã hóa tin nhắn cho Alice, anh ta sử dụng khóa chung của Alice để mã hóa. Alice sau đó sử dụng khóa riêng của mình để giải mã tin nhắn.
  • Khi Alice muốn ký điện tử một tin nhắn cho Bob, cô ấy sử dụng khóa riêng của mình để ký. Sau đó, Bob sử dụng khóa chung của Alice để xác minh chữ ký.

Tại sao điều quan trọng là sử dụng các khóa khác nhau để mã hóa và ký? Điều này cũng không có nghĩa là bạn cần phân phối hai khóa công khai cho mọi người mà bạn muốn liên lạc? Tôi tưởng tượng điều này có thể dễ dàng dẫn đến một số lượng nhầm lẫn và sử dụng sai các phím.

100
Iszi

Chủ yếu là các phương pháp quản lý và khung thời gian khác nhau cho việc sử dụng các khóa ký và mã hóa.

Để không thoái thác, bạn không bao giờ muốn người khác kiểm soát khóa ký của mình vì họ có thể mạo danh bạn. Nhưng nơi làm việc của bạn có thể muốn ký gửi khóa mã hóa của bạn để những người khác cần có thể lấy thông tin bạn đã mã hóa.

Bạn cũng có thể muốn khóa ký có hiệu lực trong một thời gian dài để mọi người trên thế giới có thể kiểm tra chữ ký từ quá khứ, nhưng với khóa mã hóa, bạn thường muốn cuộn lại sớm hơn và có thể thu hồi khóa cũ mà không cần nhiều rắc rối.

69
nealmcb

Đó là có khả năng không an toàn để sử dụng cùng một cặp khóa cho cả ký và mã hóa. Làm như vậy có thể cho phép các cuộc tấn công, tùy thuộc vào lược đồ khóa công khai cụ thể mà bạn sử dụng. Loại sử dụng này không phải là những gì hệ thống được thiết kế, vì vậy sử dụng hệ thống theo cách mà nó không được thiết kế "làm trống bảo hành".

Đừng làm điều đó. Đó là yêu cầu rắc rối.

34
D.W.

Có một số lý do mà chúng ta không nên sử dụng cùng một khóa để mã hóa và ký.

  1. Chúng tôi cần sao lưu khóa bí mật của mình cho dữ liệu được mã hóa. Sau đó, chúng tôi muốn giải mã một số tin nhắn được mã hóa cũ, nhưng chúng tôi không cần sao lưu khóa bí mật của mình để ký. Nếu kẻ tấn công tìm thấy khóa, chúng tôi có thể yêu cầu CA thu hồi nó và lấy khóa bí mật mới để ký mà không cần sao lưu.

  2. Quan trọng hơn : Nếu chúng tôi sử dụng cùng một khóa để mã hóa và ký, kẻ tấn công có thể sử dụng điều này để giải mã tin nhắn được mã hóa của chúng tôi. Đây là những gì anh ấy/cô ấy sẽ làm:

    Kẻ tấn công phải chọn một số ngẫu nhiên r, trong đó

    r phải có GDC(N, r) = 1,
    [.__.] Và N là số được sử dụng để tạo khóa riêng và khóa chung (N = pq)

    Sau đó, kẻ tấn công chọn một tin nhắn mới (m′) Và gửi tin nhắn này để ký cho người gửi:

    m′ = m^e.r^e Hoài (ở đây (e,n) Là khóa chung)

    Khi người gửi ký m′ Chúng tôi nhận được

    m′^d ≡ (m^e.r^e)^d ≡ m.r (mod N)

    Bây giờ kẻ tấn công chỉ cần "chia" nó cho r để lấy m (tin nhắn bí mật).

12
Am1rr3zA

Lý do sử dụng các khóa riêng biệt để ký và mã hóa:

  1. Hữu ích trong tổ chức là khóa mã hóa cần được sao lưu hoặc giữ trong ký quỹ để giải mã dữ liệu khi nhân viên/người dùng của tổ chức không còn khả dụng. Không giống như khóa mã hóa, khóa ký không bao giờ được sử dụng bởi bất kỳ ai khác sau đó là nhân viên/người dùng và không cần và không cần phải giữ trong ký quỹ.
  2. Cho phép có thời gian hết hạn khác nhau để ký khóa mã hóa.
  3. Cho rằng toán học cơ bản là giống nhau để mã hóa và ký, chỉ ngược lại, nếu kẻ tấn công có thể thuyết phục/lừa người giữ khóa để ký một tin nhắn được mã hóa không được định dạng bằng cùng một khóa thì kẻ tấn công sẽ nhận được bản gốc.

Tài liệu tham khảo

  1. https://www.entrust.com/what-is-pki/

  2. https://www.gnupg.org/gph/en/manual/c235.html

  3. http://www.di-mgt.com.au/rsa_ache.html

7
moo

Đối với tôi, những lý do chính liên quan đến quản lý khóa, thay vì bảo mật bằng mật mã.

Đối với tiền điện tử không đối xứng, đặc biệt là khoảng thời gian bạn muốn khóa công khai có hiệu lực có thể phụ thuộc mạnh mẽ vào mục đích sử dụng của khóa đó. Ví dụ, hãy xem xét một hệ thống trong đó một thành phần phải tự xác thực đối với các thành phần khác. Bên cạnh đó, thành phần đó cũng phải thường xuyên tạo chữ ký trên một số dữ liệu. Về lý thuyết, một khóa riêng có thể được sử dụng cho cả hai mục đích. Tuy nhiên, giả sử Cơ quan Chứng nhận PKI vì lý do bảo mật muốn giới hạn khoảng thời gian xác thực thành công có thể diễn ra dựa trên một chứng chỉ duy nhất trong hai năm. Đồng thời, luật lưu giữ dữ liệu có thể yêu cầu dữ liệu được lưu giữ trong năm năm và chữ ký trên dữ liệu đó phải được kiểm chứng trong toàn bộ thời gian đó. Cách duy nhất (âm thanh) để giải quyết vấn đề này là cung cấp cho thành phần hai khóa riêng: một để xác thực và một để ký. Chứng chỉ khóa đầu tiên sẽ hết hạn sau hai năm, chứng chỉ ký sẽ hết hạn sau năm năm.

Những lý do tương tự có thể được áp dụng cho mật mã đối xứng: nếu bạn sử dụng các khóa khác nhau cho các mục đích khác nhau, bạn có thể quyết định dựa trên tất cả các câu hỏi về quản lý khóa (ví dụ: tần suất của khóa chính, thời gian để sao lưu khóa, v.v.) theo yêu cầu của một mục đích duy nhất. Nếu bạn sử dụng một phím (chính) cho nhiều mục đích, bạn có thể kết thúc với các yêu cầu xung đột.

5
David Bakker

Mã hóa RSA dựa trên chức năng Bẫy cửa, nghĩa là một cặp chức năng. Tôi sẽ gọi họ DE. Các hàm được thiết kế sao cho D(E(x)) = xE(D(x)) = x (với mọi x). Nói cách khác, DE là nghịch đảo. Điều làm cho nó trở thành chức năng Bẫy là nếu bạn có khóa chung, bạn chỉ có thể tính E (nói thực tế). Nếu bạn có khóa riêng, bạn có thể tính cả DE.

Cách thức mã hóa hoạt động khá rõ ràng từ mô tả đó. Nếu Bob muốn gửi cho Alice một tin nhắn được mã hóa, anh ta sẽ tính ciphertext := E(plaintext). Sau đó, Bob gửi ciphertext cho Alice. Alice tính D(ciphertext), đó là D(E(plaintext)), chỉ là plaintext.

Bây giờ, hãy nói về cách ký kết hoạt động. Nếu Alice muốn ký message, thì cô ấy tính signature := D(message). Sau đó, cô ấy gửi cả messagesignature cho Bob. Sau đó, Bob tính validation := E(signature). Vì signatureD(message), nên validation = E(D(message)) = message.

Nói cách khác: để ký một tin nhắn, bạn hành động như thể bạn đang giải mã nó và đó là chữ ký của bạn. Để xác minh chữ ký của bạn, mọi người có thể mã hóa chữ ký và đảm bảo họ lấy lại tin nhắn ban đầu của bạn.

Tôi sẽ nói lại rằng: ký là hoạt động tương tự như giải mã.

Đây là mối quan tâm cơ bản về việc tách các khóa chữ ký và mã hóa. Nếu ai đó có thể khiến bạn ký một cái gì đó, thì họ sẽ giúp bạn giải mã nó.

Giả sử bạn đang điều hành một công ty công chứng. Nếu ai đó cung cấp cho bạn 10 đô la và một tin nhắn (ví dụ: lời bài hát), thì bạn sẽ ký vào tin nhắn đó và gửi lại cho bạn. Nếu ai đó sau đó sao chép lời bài hát của bạn, bạn có thể tạo chữ ký từ công ty công chứng đáng tin cậy để chứng minh rằng bạn đã viết những lời bài hát đó.

Bây giờ giả sử rằng Eve đã chặn một tin nhắn được mã hóa đến công ty công chứng của bạn. Làm thế nào cô ấy có thể lật đổ mã hóa? Cô ấy gửi tin nhắn tương tự cho bạn để công chứng! Bây giờ bạn chạy thao tác chữ ký (mà, hãy nhớ, giống như thao tác giải mã) và gửi kết quả lại cho cô ấy. Bây giờ cô ấy có tin nhắn được giải mã.

Trong thực tế, các giao thức có các bước làm cho cuộc tấn công này trở nên khó khăn hơn. Chẳng hạn, PGP (theo ý tôi là giao thức; gpg là cách triển khai phổ biến nhất ở đây) không ký thông điệp gốc; nó ký một hàm băm của tin nhắn. Nhưng bằng chứng bảo mật là tốt nhất trong các tình huống đơn giản. Bạn không muốn bằng chứng của mình về bảo mật của RSA phụ thuộc vào hàm băm. (Ví dụ, nhiều người đã sử dụng MD5 làm hàm băm ưa thích trong một thời gian dài, nhưng ngày nay MD5 được coi là khá hỏng.) Một mình, bảo mật của RSA phụ thuộc vào ý tưởng rằng bạn sẽ không ký các tin nhắn tùy ý bằng một khóa được sử dụng để mã hóa. Giữ đúng yêu cầu đó là cách tốt nhất để đảm bảo an ninh của PGP. (Như tôi nhớ, đây là lời khuyên thường xuyên nhất về mã hóa bất đối xứng trong cuốn sách của Bruce Scheier Mật mã học ứng dụng .)

Bây giờ, hãy nói về một câu hỏi khác mà bạn đã hỏi: "Điều này cũng không có nghĩa là bạn cần phân phối hai khóa công khai cho mọi người mà bạn muốn liên lạc?"

"Khóa" có nghĩa là một điều đối với người dùng và một điều khác với việc triển khai tiền điện tử. Bạn chỉ cần giao tiếp một "khóa" cấp độ người dùng, mặc dù điều đó có thể chứa nhiều khóa công khai RSA.

PGP có một khái niệm về khóa con. Khóa chủ của tôi là khóa chỉ ký. Tôi có một khóa con mã hóa riêng biệt. Khóa con đó được ký bởi khóa chính của tôi. Nếu bạn nhập khóa PGP của tôi từ trình điều khiển khóa hoặc tải xuống từ trang web của tôi, thì bạn sẽ nhận được khóa chính và tất cả các khóa con của tôi. Mặc dù bạn có thể đã ký chỉ khóa chính của tôi, khóa chính của tôi đã ký khóa con mã hóa của tôi, vì vậy bạn biết rằng nó cũng thuộc về tôi. Điều đó có nghĩa là bằng cách tải xuống khóa PGP của tôi (bao gồm nhiều khóa công khai RSA), giờ đây bạn có mọi thứ bạn cần để xác minh chữ ký của tôi và mã hóa tin nhắn cho tôi.

Với các khóa con, việc quản lý khóa phức tạp hơn từ quan điểm mật mã (có thêm một bước xác minh khóa), nhưng không phải từ quan điểm thực tế (khóa PGP của tôi bao gồm khóa chính, cũng như tất cả các khóa con của tôi). Sự phức tạp thêm được ẩn giấu trong quá trình thực hiện và không được hiển thị cho người dùng.

2
Piquan