Điểm:2

Sử dụng khoảng trắng để phá vỡ mật mã luồng nhiều thời gian

lá cờ th

Tôi có câu hỏi về bài tập lập trình đầu tiên trong khóa học mật mã của Dan Boneh trên Coursera. Bạn được cung cấp 10 bản mã được mã hóa bằng cùng một khóa và bạn có thể cho rằng bản rõ chỉ bao gồm các chữ cái và khoảng trắng.

Gợi ý cho rằng bạn nên xem xét điều gì sẽ xảy ra khi một khoảng trắng được xor-ed bằng một chữ cái. Ý tưởng là kiểm tra xem các phần con xor-ed của các kết hợp bản mã có tương ứng với một chữ cái hay không, điều này sẽ cho phép chúng tôi tìm ra khóa.

Nếu chúng tôi tìm thấy một chữ cái, tôi nghĩ chúng tôi có thể khôi phục phần khóa đó, tương ứng với chữ cái mà chúng tôi hiện đang xử lý, bằng cách thực hiện như sau:

Để cho c_sub1c_sub2 là các phần con của bản mã c1c2 mà chúng tôi hiện đang kiểm tra và cho phép m_sub1m_sub2 là các phần con tương ứng của bản rõ. Một trong m_sub1 hoặc m_sub2 phải là một khoảng trắng. Để tìm ra cái nào, chúng tôi thử như sau: Giả định m_sub1 là khoảng trắng, lấy phần con tương ứng của khóa (k_sub) bởi xor-ing c_sub1 với 00100000 (biểu diễn nhị phân của ký tự khoảng trắng), k_sub = xor(c_sub1,00100000)và kiểm tra xem việc mã hóa chữ cái viết thường hay không (vì xor-ing với khoảng trắng sẽ lật cách viết hoa chữ thường) bằng k_sub sản lượng c_sub2, nếu có chúng ta nên biết rằng k_sub là phần phụ đúng của khóa. Nếu không, hãy thử tương tự với giả định rằng m_sub2 là khoảng trắng.

Tôi không thể tìm thấy bất kỳ lỗi logic nào trong lý luận đó, nhưng cách triển khai của tôi mang lại một giải pháp không chính xác và tôi khá chắc chắn rằng mình đã loại bỏ tất cả các khả năng xảy ra lỗi khác. Ai đó có thể cho tôi biết liệu cách tiếp cận này có sai không?

Điểm:1
lá cờ in

kiểm tra xem việc mã hóa chữ cái có phân biệt chữ hoa chữ thường hay không (vì xor-ing có khoảng trắng sẽ lật ngược chữ hoa chữ thường) bằng k_sub có mang lại c_sub2 hay không, nếu có, chúng ta nên biết rằng k_sub là phần phụ chính xác của khóa. Nếu không, hãy thử tương tự với giả định rằng m_sub2 là khoảng trắng

Hiện tại bạn đang ghép nối hai luồng bản mã, trong khi bạn có 10 luồng trong số đó. Bạn nên chọn một trong số 10 luồng và sau đó thực hiện XOR với tất cả 9 luồng khác ở cùng một vị trí. Nếu hầu hết các luồng đó trả về các chữ cái (và không có kết hợp XOR không hợp lệ - nhưng điều đó khó kiểm tra hơn) thì bạn có thể khá chắc chắn rằng ký tự được mã hóa là một khoảng trắng và bạn có thể tìm thấy khóa bằng XOR mà bạn thực hiện trong câu trả lời của mình .

Tôi nghĩ đó có thể là trường hợp trong bài tập của Boneh, nhưng hãy lưu ý rằng bạn có thể gặp phải các tổ hợp văn bản rõ ràng cùng nhau cũng có thể tạo ra một chữ cái. Vì vậy, bạn không thể đơn giản thực hiện XOR với hai luồng và xác thực dự đoán của mình theo cách đó. Bạn càng có nhiều luồng, bạn càng chắc chắn; cuối cùng, tất nhiên, bạn cũng có thể xác thực bằng cách xem các tin nhắn văn bản gốc và/hoặc sử dụng các kỹ năng ngôn ngữ của mình để điền vào chỗ trống.


Nếu tôi nhớ không nhầm thì tôi đã chọn nó hơi khác một chút. Tôi lấy một luồng, lặp lại tất cả các ký tự trong bảng chữ cái (lưu ý: các ký tự đầu vào có thể được gọi là "bảng chữ cái" ở đây, ý tôi không phải là ABC) cho từng vị trí, sau đó XOR cả ba cùng nhau. Nếu tất cả các luồng tạo ra kết quả trong bảng chữ cái thì tôi nhấn đúng ký tự. Điều này cho phép bạn chỉ xử lý các ký tự trong bảng chữ cái, không phải các kết hợp XOR kỳ lạ.

Nếu tìm thấy nhiều ký tự, thì hãy sử dụng ký tự tạo ra các ký tự được sử dụng nhiều nhất trong tất cả các luồng cùng nhau (phân tích tần suất).

Nếu điều đó vẫn không tạo ra kết quả, bạn cũng có thể thử các luồng khác (tất nhiên, bạn chỉ phải so sánh luồng 2 với 8 luồng, như bạn đã so sánh # 1 và # 2).


OK, giả sử chúng ta có vị trí đầu tiên (các vị trí không được chỉ định trong tên biến) và một tập hợp các luồng. Bây giờ, chúng ta hãy bắt đầu với luồng đầu tiên và XOR nó với tất cả các luồng khác, được biểu thị bằng $y$ ở đâu $y != 1$.

Bạn có một cặp gồm hai giá trị bản mã bao gồm $c_1 = p_1 \oplus k$$c_y = p_y \oplus k$. Vì vậy, XOR'ing cùng nhau mang lại cho bạn $r = c_1 \oplus c_y = p_1 \oplus p_y$ (không có gì mới ở đây). Bây giờ nếu bạn đoán $p_1$ và gọi nó $p'_1$ bạn sẽ nhận được $p'_1 \oplus p_1 \oplus p_y = p'_y$. Bây giờ nếu $p'_y$ là một ký tự không hợp lệ thì rõ ràng $p'_1$ là một dự đoán sai. Nếu bạn không may mắn thì bạn cần thực hiện phân tích tần suất trên tất cả các kết quả $p'_y$. Nhưng hãy nhớ rằng bạn có thể làm điều này với tất cả các $\binom{n+1}2$ cặp trước khi dùng đến điều đó.

Một khi bạn có $p'_1 = p_1$ thì rõ ràng khóa chỉ là XOR với ký tự bản mã: $c_1 \oplus p_1 = k$. Điều đó có nghĩa là bạn chỉ phải lặp lại bảng chữ cái chứ không phải tất cả các phím và bạn thực sự có thể nhanh chóng loại bỏ những lần thử sai.

eager2learn avatar
lá cờ th
Cảm ơn câu trả lời của bạn. Tôi có một số câu hỏi:
eager2learn avatar
lá cờ th
"hãy lưu ý rằng bạn có thể gặp phải các kết hợp văn bản rõ ràng cùng nhau cũng có thể tạo ra một chữ cái. Vì vậy, bạn không thể chỉ thực hiện XOR với hai luồng và xác thực dự đoán của mình theo cách đó". Tôi đã nghĩ về điều đó, nhưng tôi không hiểu cách bạn xác thực điều này với nhiều luồng. Bạn có nên chỉ đếm cho từng vị trí trong khóa mà khóa nào xuất phát từ việc xor-ing hai cặp bản mã và sau đó chọn chuỗi khóa xuất hiện thường xuyên nhất không?
eager2learn avatar
lá cờ th
" Tôi lấy một luồng, lặp lại tất cả các ký tự trong bảng chữ cái (lưu ý: các ký tự đầu vào có thể được gọi là "bảng chữ cái" ở đây, ý tôi không phải là ABC) cho từng vị trí, sau đó XOR cả ba ký tự lại với nhau. Nếu tất cả các luồng tạo ra kết quả trong bảng chữ cái thì tôi nhấn đúng ký tự." Tại sao bạn lại xor ba chuỗi ở đây, trích dẫn chỉ đề cập đến một luồng và sau đó là một ký tự trong mỗi lần lặp? Ngoài ra, tôi không hiểu tại sao xor-ing một phần tử trong bảng chữ cái với một chuỗi con của một bản mã sẽ dẫn đến một chữ cái
Maarten Bodewes avatar
lá cờ in
Đã thêm giải thích với XOR thực tế.
eager2learn avatar
lá cờ th
Tôi có một câu hỏi nữa: Theo cách tiếp cận của bạn, làm cách nào để biết phần tử trong bảng chữ cái mà tôi đã đoán đúng ($p'_1=p_1$) tương ứng với $c_1$ hay $c_y$?
Maarten Bodewes avatar
lá cờ in
Bạn thì không, nhưng sẽ có nhiều khả năng xảy ra hơn khi các luồng khác trả về kết quả như mong đợi. Điều này luôn luôn là trường hợp tất nhiên. Hãy tưởng tượng rằng tất cả các luồng có cùng một ký tự tại một vị trí cụ thể...Điều này có thể thấy rõ ngay lập tức từ bản mã, nhưng ký tự * which* vẫn chưa được biết - bạn chỉ có thể đoán nó từ phần còn lại của tin nhắn văn bản gốc mà bạn * có thể * khôi phục.

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