Điểm:13

Điều gì sai với mã hóa XOR với PRNG an toàn?

lá cờ in

Giả sử tôi muốn mã hóa một tin nhắn bằng mật khẩu.

Tôi không thể chỉ XOR các byte với byte từ trình tạo số giả ngẫu nhiên an toàn bằng mật mã (CSPRNG) với hạt giống là mật khẩu hoặc hàm băm của nó sao? Tôi không thể nhìn thấy bất cứ điều gì sai trái với điều này.

Hay CSPRNG quá chậm nên cần có các lược đồ mã hóa phức tạp hơn?

lá cờ us
Câu hỏi tương tự ở đây: https://crypto.stackexchange.com/questions/35809/whats-wrong-with-xor-encryption-with-hash-and-an-iterated-salt?rq=1
fraxinus avatar
lá cờ sa
Bạn gần như đã phát minh ra chế độ hoạt động mật mã CTR (Bộ đếm)
Điểm:22
lá cờ in

Các byte mà bạn XOR với thông báo để lấy bản mã được gọi là luồng khóa. Có thể an toàn khi tạo luồng khóa bằng cách sử dụng CSPRNG, trình tạo số giả ngẫu nhiên an toàn bằng mật mã và hạt giống tĩnh.

Tuy nhiên, có những vấn đề thực tế nếu bạn sử dụng CSPRNG của hệ thống:

  • đôi khi nó có thể quyết định (tái) gieo hạt;
  • thuật toán có thể thay đổi theo thời gian hoặc giữa các hệ thống;
  • cách các byte ngẫu nhiên được trích xuất có thể thay đổi (ví dụ: có thể quyết định căn chỉnh các từ).

Vì vậy, bạn phải chắc chắn rằng thao tác CSPRNG được đúc kết trước khi bạn sử dụng nó để mã hóa thứ gì đó. Trong trường hợp xấu nhất, dữ liệu ngẫu nhiên được đưa vào để khởi tạo mật mã của bạn, trong trường hợp đó, dữ liệu sẽ bị mất một cách hiệu quả. Cái này đã xảy ra trước đây khi "SHA1PRNG" của Sun trước tiên được thay thế bằng một thuật toán khác và sau đó là dữ liệu ngẫu nhiên OpenSSL trên Android.

Về mặt lý thuyết, mật mã luồng - hoặc mật mã khối ở chế độ luồng - đều là CSPRNG khi có một hạt giống (sự kết hợp giữa khóa và IV/nonce), một thuật toán cụ thể và cách truy xuất luồng khóa theo quy định. Vì vậy, nói chung, câu trả lời nhàm chán là sử dụng AES-CTR để tạo luồng khóa và sử dụng AES-GCM - sử dụng AES-CTR trong nội bộ - nếu bạn cũng yêu cầu xác thực thư. Trên các hệ thống không có khả năng tăng tốc phần cứng, có thể sử dụng mật mã dòng như ChaCha20 để thay thế.

Ít nhàm chán hơn một chút, bạn cũng có thể tạo mật mã luồng từ hàm băm bằng cách sử dụng chế độ bộ đếm. Tốt hơn là bạn nên sử dụng cấu trúc MAC, chẳng hạn như HMAC cho điều đó. Trên thực tế, hầu hết CSPRNG mà các hệ thống cung cấp không nhiều hơn thế - nhưng như đã nêu, chúng thường được thiết kế để cung cấp dữ liệu ngẫu nhiên, không phải dữ liệu xác định. Và vâng, nhìn chung các thuật toán này chậm hơn so với mật mã luồng chuyên dụng hoặc mật mã khối được tăng tốc phần cứng - chúng phức tạp hơn hơn là ít phức tạp hơn.

lá cờ in
Tôi muốn xem xét một định nghĩa PRNG theo định nghĩa. I E. “CSPRNG” của hệ thống của bạn trên thực tế hoàn toàn không phải là CSPRNG mà là một nguồn ngẫu nhiên được tăng cường bằng CSPRNG.
Maarten Bodewes avatar
lá cờ in
Hoặc một CSPRNG được tăng cường với một nguồn ngẫu nhiên, vâng. Thông thường, bạn thường gộp chúng lại với nhau - điều này cũng tốt miễn là bạn chỉ sử dụng chúng để nhận các số (-ized) ngẫu nhiên từ một nguồn entropy hạn chế.
Điểm:16
lá cờ in

Có, bạn có thể; nó được gọi là một dòng mật mã. Nó có thể được xem như là một xấp xỉ của một đệm một lần, khi bạn không có đủ entropy để tạo khóa OTP (phải có cùng độ dài với văn bản gốc), nhưng lại có đủ để tạo PRNG.

Các lỗ hổng chung của mật mã dòng, độc lập với việc lựa chọn thuật toán tạo dòng khóa, là:

  • Tái sử dụng phím tấn công. Nếu bạn có quyền truy cập vào hai tin nhắn được mã hóa, bạn có thể XOR hai tin nhắn đó để lấy XOR của hai tin nhắn văn bản gốc. câu trả lời này minh họa độc đáo làm thế nào điều này có thể không an toàn. Để tránh cuộc tấn công này, đừng bao giờ sử dụng lại mật khẩu của bạn và đảm bảo hàm băm tạo khóa của bạn có đủ khả năng chống va chạm.
  • Tấn công lật bit. Giả sử rằng kẻ tấn công chặn một trong những tin nhắn được mã hóa của bạn và trong khi cô ấy không biết toàn bộ tin nhắn, thì bằng cách nào đó, cô ấy biết rằng chữ số 1 xuất hiện tại một vị trí cụ thể trong đó, được mã hóa trong bản mã là 0x2A. Thay đổi byte đó thành 0x22 (= 0x2A^('1'^'9')) sẽ thay đổi điều đó 1 đến một 9 trong văn bản gốc và âTôi nợ bạn \$100â bạn đã gửi được nhận là Tôi nợ bạn \$900â. Cuộc tấn công này có thể được giảm thiểu bằng cách bao gồm một MAC với tin nhắn của bạn để phát hiện các thay đổi.
lá cờ za
giả sử kẻ tấn công biết rằng phần cuối cùng của cookie được mã hóa của bạn là `is_admin=0` :-)
Joshua avatar
lá cờ cn
@hanshenrik: Sự thật thú vị. Tôi có một cookie hoạt động như vậy. Nhưng nếu bạn thay đổi is_admin thành 1, bạn chỉ đánh lừa javascript. Máy chủ không bị lừa.
Điểm:6
lá cờ kr

Ngoài câu trả lời của "Maarten Bodewes" và "dan04":

Chương trình của bạn không cung cấp bất kỳ sự bảo vệ nào đối với sự chính trực. Nếu bạn sử dụng cùng một mật khẩu cho các tin nhắn khác nhau, thì byte thứ nhất sẽ giống hệt nhau trong tất cả các khóa được tạo, byte thứ 2 sẽ lại giống hệt nhau trong tất cả các khóa được tạo, v.v. Điều này có nghĩa là kẻ tấn công có thể thay thế bất kỳ byte nào trong tin nhắn được mã hóa bằng byte có cùng số từ một tin nhắn khác và bạn sẽ không thể phát hiện xem tin nhắn mã hóa của mình có bị sửa đổi hay không. Để làm điều đó, kẻ bị tấn công thậm chí không cần biết mật khẩu. Do đó, kẻ tấn công có thể thay đổi tin nhắn được mã hóa từ "Chuyển 1000 USD" thành "Chuyển 5000 USD" và không ai có thể phát hiện ra rằng tin nhắn được mã hóa đã bị sửa đổi.

ilkkachu avatar
lá cờ ws
sử dụng cùng một mật khẩu/khóa cho nhiều thư cũng có khả năng mở các cuộc tấn công giải mã
lá cờ kr
@ilkkachu: Chắc chắn rồi. "dan04" đã đề cập đến nó. Tôi thấy không có ý nghĩa để lặp lại nó.
lá cờ kr
Lưu ý rằng gạch đầu dòng thứ hai trong câu trả lời của dan04 cũng là về tính chính trực. Sự khác biệt giữa cái này và cái kia khá tinh tế: cái đó có vẻ tổng quát hơn (vì nó không phụ thuộc vào việc có nhiều tin nhắn), nhưng có lẽ có một số tình huống mà cuộc tấn công này có thể xảy ra nhưng cuộc tấn công kia thì không?
R.. GitHub STOP HELPING ICE avatar
lá cờ cn
Không có khả năng sử dụng lại cùng một dòng khóa là một vấn đề khá khác. Ngay cả khi không có điều đó, những kẻ tấn công có thể thay đổi thông báo. Chúng không thể thay thế một thông báo đã biết khác nhưng chúng có thể lật các bit cụ thể, v.v. Bạn cần mã hóa được xác thực để tránh điều đó.
Joshua avatar
lá cờ cn
Và bạn cho rằng anh ta không có IV tại sao? (IV sẽ được tải khi khởi tạo CSPRNG).
lá cờ kr
@Joshua: Điểm tốt. Tôi đã bỏ qua "CS" và coi đó là PRNG bình thường.Nếu nó thực sự là CS, thì ngay cả khi cùng một hạt giống (mật khẩu) được đặt, 1) chuỗi được tạo trên một máy tính khác sẽ khác và do đó sẽ không thể giải mã được thông báo gốc; 2) ngay cả trên cùng một máy tính sau khi khởi chạy CSPRNG để giải mã, trình tự được tạo có thể khác (ví dụ: CR PRNG hoạt động trong Java, Lớp SecureRandom). Do đó, không thể giải mã được tin nhắn đã mã hóa trước đó. Do đó, sơ đồ trong OP thậm chí còn tồi tệ hơn.
Điểm:1
lá cờ us

Thuật toán mã hóa của bạn sẽ hoạt động rất kém trong một số trường hợp thực tế.Chẳng hạn, nếu bạn mã hóa một đĩa bằng nó, thì việc đọc một tệp từ cuối đĩa sẽ yêu cầu CSPRNG tạo ra hàng gigabyte/terabyte số ngẫu nhiên trước khi bạn nhận được các số được sử dụng để mã hóa tệp đó.

Điểm:0
lá cờ ss

Bạn sẽ phải kết hợp một yếu tố ngẫu nhiên thực tế - nếu bạn không tạo trình tạo với các số ngẫu nhiên thì đầu ra cũng sẽ không ngẫu nhiên.Giải pháp bạn mô tả dễ bị:

  1. Từ điển tấn công. Bạn có thể tạo các giá trị băm cho tất cả các mật khẩu phổ biến. Hoặc tải về nó.
  2. Các cuộc tấn công bằng văn bản đã biết. Bởi vì hạt giống của bạn được cố định nên luồng ngẫu nhiên cũng được cố định. Nếu bạn biết bản rõ của một tin nhắn, giờ đây bạn có thể giải mã tất cả các tin nhắn khác có cùng độ dài. Tùy thuộc vào thông tin bạn gửi, có thể có nhiều văn bản gốc hơn bạn nghĩ (ví dụ: tệp có các dấu hiệu cụ thể, đối với thư, ngôn ngữ có thể dễ đoán hơn bạn nghĩ).

Thủ thuật XOR chỉ gây nhầm lẫn chứ không phổ biến và dễ bị tấn công thống kê. Ngay cả các miếng đệm dùng một lần chỉ với XOR cũng dễ bị tổn thương một phần. Ví dụ. đối với các tin nhắn rất dài, XOR theo thống kê cũng để lại 1/256 tin nhắn của bạn không được mã hóa vì XOR với 0 không làm gì cả và 1/256 bị đảo ngược vì XOR với 0xff giống như KHÔNG. Một lần nữa - tùy thuộc vào thông tin bạn gửi, tỷ lệ khớp 1/256 có thể đủ tốt cho kẻ tấn công (ví dụ: nếu kẻ tấn công muốn biết liệu bạn có chia sẻ một tệp cụ thể mà chúng biết ngữ cảnh hay không.)

Bạn có thể muốn thêm muối RNG của mình với tính ngẫu nhiên thực sự ngoài hàm băm. Và bạn cần đệm để đảm bảo rằng bạn không bị rò rỉ thông tin về độ dài.

lá cờ cn
Tôi nghĩ rằng bạn đang nhầm chìa khóa đang sử dụng. Câu hỏi không giải quyết được nếu một khóa tĩnh hoặc một số loại trao đổi khóa được sử dụng. Tất nhiên, bất kỳ sự ngẫu nhiên nào trong quy trình mã hóa đều cần được gửi đến người nhận theo một cách nào đó (gửi IV, quy trình trao đổi khóa, v.v.). Và tính ngẫu nhiên cho các khóa phải được tạo bởi một số quy trình an toàn, nếu có thể.
lá cờ cn
Nhưng về đoạn thứ hai của bạn, điều đó đơn giản là không đúng. XOR với 0 không làm gì cả - nhưng đó chính xác là vấn đề. Kẻ tấn công không biết liệu vị trí của khóa đó có được XOR với 0 hoặc 1 hay không (xem xét các bit đơn lẻ). Nếu khóa thực sự là ngẫu nhiên, đồng nhất và không bao giờ lặp lại, thì kẻ tấn công không thể biết bit nào của thông báo bị lật hoặc không thay đổi.Đó chính là lý do tại sao các cuộc tấn công thống kê không hoạt động đối với OTP.

Đă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.