Công cụ dành cho nhà phát triển · Máy tính hàm băm SHA
SHA-256 Từng bước: Đệm, Lịch trình tin nhắn và 64 Vòng
· Cách thức hoạt động
sha-256 mật mã browser-apis javascript
SHA-256 đệm đầu vào của bạn, chia nó thành các khối 512-bit và chạy từng khối qua 64 vòng trộn. Bài đăng này giải thích mọi giai đoạn bằng ngôn ngữ đơn giản mà không yêu cầu nền tảng về mật mã.
Điều gì thực sự xảy ra với byte của bạn — hộp đen mà hầu hết các nhà phát triển không bao giờ mở ra
SHA-256 là thuật toán xác định biến đổi bất kỳ đầu vào nào thành dấu vân tay 256-bit (32-byte). Những gì trông giống như một hộp đen nhìn từ bên ngoài thực ra là một chuỗi các bước được xác định rõ ràng. Việc hiểu các bước đó sẽ loại bỏ bí ẩn và cho phép bạn xác minh tính chính xác, theo dõi lỗi và hiểu lý do tại sao kết quả đầu ra lại như vậy. Mọi phần của thuật toán đều được công khai; sức mạnh đến từ thiết kế chứ không phải từ bí mật.
Thuật toán hoạt động trên các khối 512-bit. Nếu đầu vào của bạn ngắn hơn, nó sẽ được đệm. Nếu dài hơn, nó sẽ được chia thành nhiều khối, mỗi khối được xử lý theo trình tự, với đầu ra của mỗi khối sẽ được đưa vào khối tiếp theo. Sau khi tất cả các khối được xử lý, bạn có tám số 32-bit được nối với nhau để tạo thành thông báo 256-bit cuối cùng.
Phần đệm — thêm 1 bit, số 0 và độ dài tin nhắn 64-bit để đạt bội số của 512 bits
Bước đệm mang tính quyết định và chính thức hóa. Sau đầu vào thực tế của bạn, hãy thêm một 1 bit (trong thực tế, byte 0x80 nếu đầu vào của bạn kết thúc ở ranh giới byte). Sau đó nối thêm các bit 0 cho đến khi bạn thiếu 64 bits bội số của 512 bits. Cuối cùng, nối thêm mã hóa big-endian 64-bit của độ dài đầu vào tính bằng bit. Phần đệm này đảm bảo mọi thông báo đều là bội số của 512 bits và mã hóa độ dài ban đầu để các đầu vào giống hệt nhau có độ dài khác nhau không thể tạo ra cùng một thông báo.
Đối với abc đầu vào (3 bytes = 24 bits), thông báo được đệm là 512 bits (một khối): ba byte 61 62 63, theo sau là 0x80, tiếp theo là số 0, theo sau là mã hóa 64-bit của 24 (tức là 0x00...0x18 trong trường big-endian 64-bit). Tin nhắn bây giờ điền chính xác một khối 512-bit. Đối với một chuỗi trống, phần đệm sẽ thêm 0x80, theo sau là số 0, theo sau là 0x00...0x00 (biểu thị 0 bits của đầu vào). Đối với đầu vào dài hơn như tệp 100 byte, phần đệm sẽ lấp đầy khối cuối cùng vào 512 bits và cho biết 800 bits độ dài ban đầu.
Các giá trị và hằng số ban đầu được cố định bằng thuật toán; nguồn gốc lịch sử của chúng là bằng chứng kho lưu trữ bên ngoài
Thuật toán bắt đầu với tám biến làm việc 32-bit, được khởi tạo thành 32 bits đầu tiên trong số các phần phân số của căn bậc hai của tám số nguyên tố đầu tiên. Đây là các hằng số được mã hóa cứng, hiển thị trong mọi triển khai tham chiếu và trong mã nguồn của thư viện mật mã. Chúng tồn tại bởi vì việc sử dụng các hằng số cố định từ toán học sẽ tránh được sự nghi ngờ về một cửa sau ẩn. Công cụ ToolAcre sử dụng triển khai Web Crypto của trình duyệt, áp dụng các hằng số tương tự này.
Thuật toán cũng sử dụng các hằng số tròn 64, bắt nguồn từ 32 bits đầu tiên của các phần phân số của căn bậc ba của các số nguyên tố 64 đầu tiên. Đây cũng là cố định và công cộng. Các hằng số đóng vai trò là vật liệu trộn bổ sung; việc thay đổi chúng sẽ phá vỡ thuật toán và tạo ra các bản tóm tắt khác nhau.
Lịch trình tin nhắn — mở rộng 16 từ thành 64 bằng cách dịch chuyển và xoay vòng
Lịch trình tin nhắn mở rộng 16 từ (512 bits) thành 64 từ (2048 bits) thông qua một công thức cụ thể. Đối với các vòng 0-15, các từ đến trực tiếp từ khối đầu vào. Đối với các vòng 16-63, mỗi từ mới được tính bằng cách lấy hai từ trước đó (ở các khoảng cách cụ thể), áp dụng xoay và dịch chuyển, XOR trong một từ khác và lưu trữ kết quả. Công thức có tính xác định và có thể đảo ngược trong ngữ cảnh của một khối, nhưng việc mở rộng sẽ lan truyền ảnh hưởng của đầu vào trên tất cả các vòng 64.
Công thức mở rộng sử dụng phép quay sang phải (dịch chuyển bit tròn trong đó các bit rơi ra ở một đầu sẽ xuất hiện trở lại ở đầu kia) và các phép toán dịch chuyển phải. Xoay bảo toàn tất cả các bit nhưng thay đổi vị trí của chúng; dịch chuyển phải loại bỏ các bit. Sự kết hợp của các thao tác xoay, dịch chuyển và XOR đảm bảo rằng mỗi bit của đầu vào đều ảnh hưởng đến nhiều từ trong lịch trình.
Một vòng — các hàm Ch, Maj và Sigma được mô tả là các hoạt động trộn bit và cách cập nhật tám biến làm việc
Mỗi vòng 64 xử lý một từ trong lịch trình tin nhắn và cập nhật tám biến làm việc. Hàm cốt lõi bao gồm sáu thao tác: hỗn hợp có điều kiện (thường được gọi là Ch, nghĩa là "chọn") chọn các bit dựa trên biến điều khiển, hàm đa số (Maj) chọn giá trị phổ biến nhất trong số ba biến, hai hàm trộn đặc biệt (Sigma_0 và Sigma_1) xoay và dịch chuyển các biến làm việc và phép cộng modulo 2^32. Tất cả số học được thực hiện trên các từ 32-bit, do đó tình trạng tràn sẽ xảy ra.
Hàm "chọn" nhận ba đầu vào 32-bit và đối với mỗi vị trí bit, chọn bit từ đầu vào đầu tiên nếu bit điều khiển là 1 hoặc bit từ đầu vào thứ hai nếu bit điều khiển là 0. Hàm đa số xem xét ba đầu vào và đối với mỗi vị trí bit, xuất ra giá trị bit xuất hiện thường xuyên nhất trong số ba vị trí đó. Đây là các hoạt động phi tuyến tính phá vỡ tính tuyến tính và đảm bảo rằng những thay đổi đầu vào nhỏ sẽ lan truyền khắp trạng thái một cách không thể đoán trước.
Xâu chuỗi các khối và tạo đầu ra - thêm kết quả của từng khối vào trạng thái đang chạy
Mỗi vòng cập nhật tất cả tám biến làm việc bằng cách xoay chúng và kết hợp một giá trị mới được tính toán từ hằng số vòng hiện tại, từ lịch trình thông báo và trạng thái trước đó. Bảy biến làm việc đầu tiên thay đổi: biến số 8 trở thành biến số 1, biến số 1 trở thành biến số 2, v.v. Số 8 mới được tính từ các biến cũ bằng cách sử dụng các hàm trộn. Sau vòng 64, bạn có tám giá trị 32-bit mới. Chúng được thêm (modulo 2^32) vào các hằng số ban đầu, tạo ra trạng thái băm cuối cùng cho khối này.
Đối với thông báo nhiều khối, tám giá trị từ một khối sẽ trở thành trạng thái ban đầu cho khối tiếp theo. Chuỗi đảm bảo rằng sự thay đổi ở bất kỳ đâu trong đầu vào sẽ ảnh hưởng đến tất cả các khối tiếp theo. Vào thời điểm bạn đạt đến khối cuối cùng, mọi bit đầu vào đều ảnh hưởng đến đầu ra cuối cùng.
Ví dụ đã hoạt động và nội dung này không bao gồm - truy tìm phần đệm và số khối cho một tin nhắn ngắn; bằng chứng bảo mật nằm ngoài phạm vi
Đối với abc đầu vào, thông báo sẽ nằm gọn trong một khối 512-bit sau khi đệm. Phần đệm thêm 424 bits, tạo nên tổng số 512 bits. Lịch trình tin nhắn mở rộng mục này thành 64 từ. Mỗi vòng sử dụng một từ và cập nhật tám biến làm việc thông qua các hàm trộn. Sau vòng 64, trạng thái được XOR với các hằng số ban đầu, tạo ra bản tóm tắt cuối cùng ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad.
Đây là vectơ thử nghiệm đã được công bố: cùng một phép tính trên cùng một đầu vào luôn tạo ra cùng một đầu ra. Công cụ ToolAcre thực hiện tính toán chính xác này thông qua triển khai Web Crypto của trình duyệt. Bạn có thể xác minh nó bằng cách băm abc và so sánh kết quả với vectơ đã biết. Bất kỳ trình duyệt nào triển khai Web Crypto chính xác sẽ tạo ra cùng một kết quả; thuật toán không thừa nhận đường tắt hoặc đường dẫn thay thế.
Bài học rút ra: Web Crypto thực hiện trộn SHA-256 xác định mà không để lộ bí mật
Thuật toán được công khai và mỗi bước đều mang tính quyết định. Các hàm trộn (Ch, Maj, Sigma_0, Sigma_1) được chọn là phi tuyến tính, nghĩa là việc thay đổi một bit đầu vào không làm thay đổi một bit đầu ra theo dự đoán. Việc mở rộng các từ thông báo 16 thành 64 đảm bảo rằng toàn bộ dữ liệu đầu vào sẽ ảnh hưởng đến toàn bộ quá trình tính toán. Các vòng 64 và chuỗi trạng thái có nghĩa là đầu ra nhạy cảm với mọi bit của đầu vào và kho lưu trữ sử dụng kết quả đầu ra làm thông báo xác định. Khả năng chống va chạm là một thuộc tính bảo mật có giới hạn, không phải là lời hứa rằng các kết quả đầu ra trùng lặp là không thể về mặt toán học.
Bằng chứng mật mã nằm ngoài phạm vi của bài đăng này. Điểm mấu chốt là bây giờ bạn đã biết thuật toán thực sự làm gì. Nó không phải là phép thuật và cũng không phải là hộp đen. Nếu bạn muốn xác minh rằng ToolAcre đang băm chính xác, hãy theo dõi thông tin đầu vào của riêng bạn thông qua các bước này hoặc sử dụng triển khai tham chiếu bằng ngôn ngữ khác và so sánh kết quả. Việc triển khai của trình duyệt và mọi tham chiếu chính xác sẽ tạo ra các thông báo giống hệt nhau cho các đầu vào giống nhau.