Tại sao tôi quan tâm: Tôi muốn triển khai một số phiên bảo mật để liên lạc qua internet và vì tôi hoàn toàn là một người nghiệp dư trong lĩnh vực này và không muốn dành nhiều thời gian để tìm hiểu về mật mã hoặc về các thư viện cụ thể (vì tôi làm điều này chỉ để giải trí), tôi muốn có sự chuẩn bị tối thiểu từ phía lập trình. Về khía cạnh toán học, tôi giỏi môn này, vì vậy việc dành thêm thời gian để suy nghĩ (trái ngược với việc tìm kiếm trên Google và đọc tài liệu) không phải là vấn đề.
phỏng đoán/câu hỏi của tôi: Phần thú vị xuất hiện khi tôi nhận ra rằng chỉ có một mật mã bất đối xứng (khối hoặc luồng), hãy gọi nó là $X$, là đủ cho tất cả các nhu cầu mật mã cơ bản.Nói cách khác, tất cả các danh mục mật mã cơ bản khác (các loại mật mã khác, hàm băm và chữ ký, không có loại nào khác) có thể được rút gọn thành thuật toán này; bạn có thể tạo thuật toán băm chỉ bằng cách sử dụng $X$, và thuật toán ký chỉ sử dụng $X$. Điều này có nghĩa là việc kết hợp các thuật toán như RSA+ChaCha+Poly1305 hoặc bất kỳ thuật toán nào không lỗi thời khi tốc độ không liên quan. Tôi không đặt mục tiêu cao hơn là truyền thông internet. FHE và tương tự nằm ngoài phạm vi. Sau đó, nó không đủ để thực hiện chỉ $X$ khi thời gian và tốc độ không liên quan? Tại sao sau đó mọi người lại phát minh ra tất cả các thuật toán này, ngoài lý do tốc độ?
Bằng chứng của tôi:
Biến mật mã dòng thành mật mã khối:
Chỉ cần xử lý một luồng có độ dài cố định bằng mật mã luồng và gọi nó là mật mã khối.
Chuyển một mật mã khối hoạt động trên một tập hợp có kích thước tùy ý thành một mật mã khối hoạt động trên một tập hợp có kích thước lũy thừa $2$.
Để cho $A$ là bộ $\{1,\dots,N\}$. Để cho $X$ là một mật mã khối với hai chức năng $E$ và $D$ (chức năng mã hóa và giải mã) ánh xạ các phần tử từ $A$ đến $A$. Để cho $2^k$ là sức mạnh lớn nhất của $2$ nhỏ hơn hoặc bằng $N$. Để cho $B$ là bộ $\{1,\dots,2^k\}$. Để cho $x$ là một số từ $A$. Trình tự $x,E(x),E(E(x)),...$ được giả định là ngẫu nhiên và phân phối đều trên tập hợp $A$ (cũng là một chu kỳ looong, vì đây là một mật mã bất đối xứng), mang lại một số từ $B$ trung bình xảy ra sau mỗi $\frac{|B|}{|A|}$ phần tử. Chúng ta có thể lấy sự xuất hiện đầu tiên như hình ảnh của chức năng mới $E'$ mà bây giờ ánh xạ từ $B$ đến $B$. Định nghĩa $D'$ là nghịch đảo của $E'$. cặp $(E',D')$ là một mật mã khối mới hoạt động trên một tập kích thước $2^k$, nói cách khác trên các khối $k$ chút ít. Nó an toàn như $X$ bởi vì nếu chúng ta có thể bẻ khóa mật mã này thì điều đó có nghĩa là chúng ta có thể tìm thấy kết quả của mật mã ban đầu được áp dụng một vài lần, chẳng hạn $m$ lần.Sau đó, chúng ta chỉ có thể áp dụng lại mật mã $m-1$ nhiều lần hơn trên một tin nhắn được mã hóa và sau đó sử dụng bản crack này để hoàn tác nó $m$ lần. Từ $m$ dự kiến sẽ ít hơn $k$, điều này là khả thi.
Biến một mật mã khối có kích thước $2^k$ thành mật mã dòng.
Hãy giả sử $k$ là số chẵn (giải thích khái niệm này đơn giản hơn). Về mặt kỹ thuật, tôi chỉ mã hóa và giải mã một tin nhắn có kích thước tùy ý, đây không chính xác là mật mã luồng. Đầu tiên, mở rộng tin nhắn để có độ dài là bội số của $\frac{k}{2}$. Hãy nghĩ về thông điệp này như một chuỗi các khối có kích thước $\frac{k}{2}$. Chúng ta có thể mã hóa tại chỗ các cặp khối này: khối thứ nhất và khối thứ hai cùng nhau, sau đó là khối thứ hai và thứ ba, v.v.... cho đến hết. Cho đến bây giờ, điều này giống như một mật mã dòng. Chúng tôi có thể tùy chọn thêm một số bắt đầu ngẫu nhiên vào tin nhắn nếu ban đầu tin nhắn quá ngắn. Chúng ta cũng có thể tùy chọn đảo ngược thứ tự của các khối này và áp dụng trình tự mã hóa tương tự. Bây giờ, chúng tôi có thể giải mã toàn bộ tin nhắn hoặc không giải mã gì: Nếu chúng tôi mất một phần của nó, chúng tôi không thể giải mã bất cứ thứ gì. Giống như mật mã khối ban đầu có nghĩa là hoạt động. Điều này an toàn như mật mã khối ban đầu vì nếu chúng tôi có thể bẻ khóa toàn bộ tin nhắn, thì chúng tôi có thể chạy lại quá trình mã hóa và tạo ra tất cả các sản phẩm liên kết, bao gồm cả việc giải mã 2 khối cuối cùng mà bộ mã hóa đã mã hóa.
Biến mật mã khối thành hàm băm.
Tôi đã chỉnh sửa phần này, vì ý tưởng đầu tiên đã sai ...
Tạo hai cặp khóa và loại bỏ các khóa riêng và mã hóa cứng các khóa chung trong thuật toán. Giống như int phần trước, hãy chuẩn bị các khối. Bây giờ mã hóa đầu tiên $k$ các bit tại chỗ trước tiên bằng một phím, sau đó với phím kia, loại bỏ $l<<k$, $l|k$ bit "ngẫu nhiên" (giả ngẫu nhiên, được tạo bởi một số hàm băm đơn giản của thông báo) từ điều này được tạo ra $k$ bit và nối các bit còn lại. Tiếp tục làm điều này cho đến khi chỉ có $k$ bit còn lại, sau đó gọi nó là hàm băm mạnh.Điều này an toàn như mật mã, bởi vì nếu giả sử chúng tôi tìm thấy một thông báo khác có cùng đầu ra, thì trong khi chúng tôi đang băm lại cả hai thông báo đó cùng một lúc, tại một thời điểm nào đó, chúng tôi sẽ tạo ra cùng một thông báo $k-l$ bit (sau khi loại bỏ ngẫu nhiên $l$ chút ít). Đây là lý do tại sao nó khó: $k-l$ bit có thể được điền vào $k$ nhiều nhất là bit $2^l\binom{k}{l}$ cách (mà chúng ta có thể ràng buộc với một số lượng nhỏ), thì hầu hết chúng sẽ không tạo ra giống nhau $k-l$ bit giúp giới hạn nó, thì ngay cả khi chúng ta có thể giải mã một tổ hợp khác của $k$ bit (điều này có thể có thể xảy ra vì chúng giống với bản gốc $k$ bit), dữ liệu được giải mã $k$ các bit sẽ phải được giải mã lại, nhưng bây giờ chúng không giống với bản gốc $k$ bit, vì vậy về cơ bản chúng tôi sẽ phải bẻ khóa mật mã vào thời điểm này. Chúng tôi sử dụng hai mật mã khác nhau (hai khóa công khai khác nhau) vì chúng tôi muốn loại bỏ bất kỳ tính linh hoạt nào.
Biến một mật mã khối thành một chức năng chữ ký.
Trước tiên, chúng ta có thể tính toán hàm băm của tin nhắn và sau đó mã hóa hàm băm. Điều này rõ ràng là an toàn, vì đây là cách các thuật toán hiện tại hoạt động.
Tôi xin lỗi vì đã sử dụng các thẻ khác nhau, tôi chỉ không biết nên sử dụng thẻ nào.