Mã hóa / Giải mã SM4

Mã hóa hoặc giải mã với SM4 — GB/T 32907-2016, mật mã khối 128-bit tiêu chuẩn quốc gia Trung Quốc — ở chế độ ECB và CBC với đệm PKCS#7. Đầu ra tương thích từng byte với openssl enc -sm4-ecb / -sm4-cbc. Mọi thứ chạy trong trình duyệt của bạn; không gì được tải lên.
Đệm PKCS#7 luôn được áp dụng, giống hệt enc của OpenSSL.
Đọc đầu vào như:
Ghi đầu ra như:
Đối chiếu OpenSSL — mã hóa ở đây, rồi chạy openssl enc -d -sm4-cbc -K <hexkey> -iv <hexiv> -in file.sm4 -out file.txt (hoặc -sm4-ecb không có -iv): các byte khớp chính xác, vì trang này áp dụng cùng đệm PKCS#7 như OpenSSL.
Tự kiểm tra
Chạy lại vector đáp án đã biết phụ lục A.1 của GB/T 32907-2016, sáu vector đối chiếu ECB/CBC xác định do một triển khai tham chiếu Python độc lập tạo ra, cả bốn nhóm mẫu, và các đường dẫn phủ định (sai kích thước khóa, bản mã không phải bội số khối, đệm bị sửa phải bị từ chối).
SM4 là gì?
Trong một câu: SM4 là mật mã khối tiêu chuẩn quốc gia Trung Quốc — khối 128-bit, khóa 128-bit, mật mã 32 vòng với cấu trúc Feistel không cân bằng, được công bố là GB/T 32907-2016 (trước đó là GM/T 0002-2012), đảm nhiệm vai trò trong bộ "SM" của Trung Quốc mà AES đảm nhiệm trong thế giới NIST.
SM4 so với AES nhìn nhanh
Khía cạnhSM4AES
Kích thước khối128 bit128 bit
Kích thước khóaChỉ 128 bit128 / 192 / 256 bit
Số vòng3210 / 12 / 14
Cấu trúcFeistel không cân bằng (một từ 32-bit được cập nhật mỗi vòng)mạng thay thế–hoán vị (toàn trạng thái mỗi vòng)
S-boxmột hộp 8×8, dùng 4× mỗi vòngmột hộp 8×8, 16× mỗi vòng + MixColumns
Chế độ chuẩnECB, CBC (trang này); GCM/CTR trong các bộ TLS (RFC 8998)ECB, CBC, CTR, GCM, ...
Đã công bố2012 (GM/T 0002-2012; GB/T 32907-2016); trong ISO/IEC 18033-3:20102001 (FIPS 197)

Cùng việc, thiết kế khác: cả hai đều là mật mã khối 128-bit với S-box 8×8 công khai, nhưng SM4 lặp 32 vòng Feistel nhẹ trong khi AES áp dụng 10–14 vòng toàn trạng thái nặng hơn. Trên phần mềm AES thường nhanh hơn nhờ lệnh phần cứng (AES-NI); SM4 đạt vị thế tương đương với các phần mở rộng CPU chuyên dụng trên nền tảng Trung Quốc. Không cái nào có tấn công thực tế; khóa 128-bit là khóa 128-bit.

Vì sao tôi nên dùng SM4 thay vì AES?

Về tuân thủ và tương tác, không phải độ mạnh: quy định mật mã thương mại Trung Quốc (商用密码) yêu cầu bộ SM trong các lĩnh vực được chứng nhận, và các giao thức như TLCP và TLS 1.3 với các bộ RFC 8998 thương lượng SM4. Nếu đối tác, cơ quan quản lý hay phần cứng của bạn chỉ nói SM4, bạn dùng SM4. Nếu bạn tự do lựa chọn, AES-256 ở trang AES của trang web này vẫn là mặc định toàn cầu.

Những lỗi thường gặp
  • ECB với dữ liệu có cấu trúc. Các khối bản rõ giống nhau cho các khối bản mã giống nhau — con chim cánh cụt kinh điển. Dùng CBC (mặc định của trang này) với IV mới bất cứ khi nào dữ liệu dài hơn một khối.
  • Khóa dài đúng 16 byte. Không như AES, SM4 không có biến thể 192/256-bit. Một cụm mật khẩu như "password" không phải khóa — hãy suy ra khóa bằng KDF trước (xem Trình tạo băm mật khẩu).
  • Giả định đệm là tùy chọn. Trang này — giống enc của OpenSSL — luôn áp dụng PKCS#7, nên bản rõ 16 byte mã hóa thành 32 byte. SM4 không đệm thô được cố ý không cung cấp.
  • Dùng lại IV trong CBC. Một cặp khóa+IV lặp lại trong CBC làm lộ sự giống nhau của tiền tố thông điệp. Tạo IV ngẫu nhiên cho mỗi thông điệp và gửi nó kèm bản mã.
Câu hỏi thường gặp

Có tương thích với OpenSSL không? Có — từng byte. openssl enc -sm4-cbc -K 0011... -iv 4455... -in in.txt -out out.sm4 (OpenSSL 1.1.1+) tạo ra đúng bản mã mà trang này in ra cho cùng khóa, IV và đầu vào; GmSSL cũng vậy.

Sao không có SM4-GCM ở đây? Hệ sinh thái thư viện liên quan tiêu chuẩn chủ yếu đưa SM4-GCM vào các ngăn xếp TLS; quy ước dòng lệnh hướng tệp mà trang này khớp (enc) bao quát ECB/CBC. SM4 có xác thực thuộc về tầng giao thức.

SM4 có trong WebCrypto không? Không — không trình duyệt nào triển khai. Đó là lý do trang này chạy một triển khai viết từ đầu bằng JavaScript, với các vector kiểm thử của chính tiêu chuẩn được nối vào phần tự kiểm tra ở trên.

Tôi có thể giải mã thứ được mã hóa ở nơi khác không? Có, nếu bạn biết chế độ, khóa, IV và rằng PKCS#7 đã được dùng — dán bản mã dạng hex hoặc Base64, chuyển sang Giải mã, rồi tiến hành.