Bí mật chính so với bí mật thuật toán


8

đó là một tuyên bố nổi tiếng rằng

" Bảo mật mật mã phải dựa vào khóa bí mật thay vì thuật toán bí mật ."

Tôi muốn hỏi về một số chi tiết về nó. Và đó là sự khác biệt của họ?

Tôi thấy một điều hiển nhiên là đối với một hệ thống nhiều người dùng, việc tạo khóa dễ dàng hơn nhiều so với việc tạo ra một thuật toán riêng biệt cho mỗi cặp người dùng, (và ngay cả đối với một cặp người dùng, người ta có thể lập luận rằng việc cập nhật khóa dễ dàng hơn)

Nhưng, nó có phải là đối số duy nhất?

Ý tôi là, nếu chúng ta định nghĩa

AlgorithmA = AlgorithmX + key A
AlgorithmB = AlgorithmX + key B

Sau đó, một thay đổi trên khóa không khác với thay đổi trong thuật toán.

Sự khác biệt duy nhất tôi thấy là đối với một cặp người dùng / khóa mới

  • Hầu hết cấu trúc Thuật toán không đổi trong trường hợp khóa bí mật,

  • Hầu hết cấu trúc Thuật toán cần thay đổi trong trường hợp Thuật toán bí mật

Nhưng đâu là giới hạn? "Hầu hết" có nghĩa là gì?

Tôi muốn có nhiều quan điểm và manh mối hơn để hiểu tại sao sự khác biệt này thường được đề cập.


Câu trả lời:


4

Định nghĩa vấn đề

Mục tiêu của mật mã là ước tính một quá trình theo đó

crypt(x)

truyền tải không có thông tin về x nhưng tồn tại một hàm decryptsao cho

decrypt(crypt(x)) == x

Nếu việc giải mã và mật mã chỉ được thực hiện trong cùng một hoạt động của cùng một chương trình, bạn có thể thực hiện điều này một cách hoàn hảo bằng cách sử dụng trạng thái ẩn:

var map = {};  // A hidden hashmap.

function crypt(x) {
  var k = unique_unforgeable_value();
  map[k] = x;
  return k;
}

function decrypt(k) { return map[k]; }

Trong thực tế, cryptdecryptđược gọi bởi các chương trình khác nhau hoặc các lần chạy khác nhau của cùng một chương trình, vì vậy chúng ta cần xấp xỉ cryptbằng cách sử dụng hàm xác định có đầu ra không thể phân biệt được với các bit ngẫu nhiên - nó không thể bị ép (theo nghĩa mã hóa Shannon) do đó không có bit cấu trúc bổ sung nào có thể được sử dụng để thu thập thông tin về x.

decryptcrypt= =TôidentTôity

Câu trả lời

Bằng cách giới thiệu một thuật toán có thể nén đơn giản với một bí mật không thể nén được

crypt = crypt_algo(secret)
decrypt = decrypt_algo(secret)

chúng ta có thể ước chừng mục tiêu trên. cryptdecrypt có nội dung thông tin cao do nội dung thông tin bí mật cao mặc dù crypt_algodecrypt_algocó nội dung thông tin thấp.

secretcần phải được giữ từ những kẻ tấn công để làm việc này vì nếu không, kẻ tấn công có thể chỉ đơn giản là làm món cà ri ở trên. Thuật toán không cần phải giữ bí mật vì nó chỉ cung cấp một phần nhỏ nội dung thông tin của hàm bị cong.

Hãy cẩn thận

"Bảo mật mật mã phải dựa vào khóa bí mật thay vì thuật toán bí mật."

Tôi không đồng ý với thay vì .

Bạn có thể có được một số biện pháp phòng thủ chuyên sâu bằng cách giữ bí mật cả hai, nhưng thử nghiệm crypt_algorất khó, vì vậy, trong lịch sử, các thuật toán bí mật được phát triển trong nhà bởi những người nghiệp dư đã bị tấn công tồi tệ hơn khi bị tấn công so với những số lượng lớn đã được xem xét cẩn thận bởi số lượng lớn chuyên gia mật mã. Đây là lý do tại sao bảo mật bằng cách che khuất đã nhận được một tên xấu xứng đáng. "Sự tối nghĩa" ở đó đề cập đến các nỗ lực giữ bí mật thuật toán để thay thế cho các khóa bảo vệ đúng cách.


Tôi nghĩ rằng đây là câu trả lời đúng, thuật toán có cấu trúc và khóa không, và đó là khóa =)
Hernan_eche

5

Sự khác biệt mà bạn muốn thực hiện giữa khóa và thuật toán phù hợp không dựa trên việc phần lớn thao tác được chứa trong cái này hay cái kia, mà là sự phức tạp nằm ở đâu. Tôi không nói về sự phức tạp thuật toán ở đây, nhưng sự phức tạp trong ý nghĩa hàng ngày của nó: khó hiểu và lý do về.

Các thuật toán thích hợp là phức tạp và khó để lý do về. Nó thường thực hiện một loạt các thao tác bit có vẻ tùy ý, các phép toán logic và số học, và xáo trộn dữ liệu nói chung. Rất khó để một giáo dân hoặc thậm chí cho một nhà mật mã học biết được bao nhiêu quyền riêng tư thực sự mua cho bạn, và loại mật mã nào có thể dễ bị tổn thương. Vì vậy, cách tốt nhất để tự tin về bảo mật của thuật toán là đưa nó ra ngoài và được các chuyên gia xem xét rộng rãi nhất có thể. LÀM CÔNG CỤ NÓ.

Mặt khác, chìa khóa là một khái niệm đơn giản: đó là một loạt các bit cần phải ngẫu nhiên. Không cần phải xem lại khóa để đảm bảo tính chính xác của tiền điện tử. Bất kỳ khóa nào được cho là mạnh như bất kỳ khóa nào khác (và nếu điều này không đúng thì về nguyên tắc nó có thể được phát hiện bằng cách xem xét thuật toán, không phải khóa). Chúng tôi biết rằng chất lượng ngẫu nhiên có sẵn để tạo khóa kém hơn hoàn hảo, vì vậy trong thực tế, một số khóa có thể yếu do thiếu ngẫu nhiên, nhưng ít nhất mọi người đều có thể biết mà không cần phải là chuyên gia mật mã và không cần phải thực hiện một phân tích khó khăn về chìa khóa rằng tính ngẫu nhiên tốt SILL dẫn đến một khóa tốt. Vì vậy, hãy sử dụng tính ngẫu nhiên tốt nhất bạn có sẵn sau đó bạn không cần (PHẢI không!) Chia sẻ khóa với mọi người để có niềm tin vào tiền điện tử của bạn.


Tôi nghĩ rằng điều này xứng đáng nhận xét. Tôi đã đọc câu trả lời của bạn và tôi hiểu quan điểm của bạn, có lúc nào đó đúng, nhưng tôi đã chọn câu trả lời @Mike Samuel nói một cách đáng kinh ngạc chính xác là đối diện!. Đó là, thuật toán ít phức tạp hơn khóa, bởi vì thuật toán có (và cần) một cấu trúc, nhưng khóa (không cần phải có cấu trúc). Tôi đồng ý. Thay vào đó, bạn đã nói: "Mặt khác, khóa là một khái niệm đơn giản: đó là một bó bit cần ngẫu nhiên", thực tế, một "khái niệm" đơn giản không phải là một "dữ liệu" đơn giản. Độ phức tạp của dữ liệu 'ngẫu nhiên', là độ phức tạp tối đa có thể có!
Hernan_eche

@Hernan_eche Khóa có độ phức tạp Kolmogorov cao đối với các chuỗi bit khác có cùng độ dài. Nhưng, về mặt khái niệm, nó chỉ là một chuỗi bit ngẫu nhiên và, như một khái niệm, điều đó dễ hiểu hơn nhiều so với bất kỳ thuật toán mã hóa tốt nào.
David Richerby

2

Tôi đã hỏi câu hỏi tương tự vài năm trước từ một trong những chuyên gia nổi tiếng về mật mã.

Điểm thú vị hơn ở đây là bạn có thể nghĩ ra chìa khóa để chứa mã của thuật toán và thuật toán là một Máy Turing phổ dụng (UTM) đơn giản. Hãy nhớ rằng chúng tôi muốn làm là có một thuật toán cố định cho tác vụ mã hóa không thay đổi từ lần chạy thuật toán này sang lần chạy khác, nếu bạn coi khóa là một phần của thuật toán thì thuật toán cần thay đổi mỗi lần đảm bảo an toàn Với một thuật toán cố định cộng với một khóa được chọn ngẫu nhiên, chúng tôi không gặp phải vấn đề đó.

Sự khác biệt ban đầu rõ ràng hơn nếu bạn nghĩ về mật mã tiền hiện đại. Nếu đối thủ biết thuật toán thì mọi thứ đã mất, nó sẽ không có tác dụng, việc giữ thuật toán là điều cần thiết. Nếu trong một trường hợp cụ thể, thuật toán đã được biết thì mọi thứ sẽ bị mất cho tất cả các lần sử dụng trong tương lai. Trong mật mã hiện đại, khóa không phải là một phần của thuật toán , nó được chọn ngẫu nhiên , tiết lộ thuật toán mã hóa (và thậm chí các khóa được sử dụng trước đó) không ảnh hưởng đến bảo mật của các sử dụng trong tương lai vì trong tương lai, khóa sẽ chỉ là một thuật toán khác chuỗi được chọn ngẫu nhiên và điều đó sẽ cấp bảo mật, các khóa được sử dụng trước đó không giúp ích gì trong việc phá vỡ hoạt động mới.

Vậy điều gì xảy ra nếu chúng ta xem xét UTM cộng với một khóa ngẫu nhiên? Trừ khi khóa có cấu trúc đẹp, bạn không thể chứng minh rằng thuật toán sẽ được bảo mật, ví dụ: khóa được chọn ngẫu nhiên từ phân phối thống nhất sẽ không hoạt động. Khóa cần phải là "về cơ bản" một thuật toán cố định cộng với một chuỗi ngẫu nhiên trong trường hợp nó không thực sự khác với việc chuyển phần thuật toán cố định của khóa sang UTM, nó không thay đổi từ lần chạy này sang lần chạy khác.

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.