Mã hóa / giải mã / ký SM2

Bộ công cụ khóa công khai SM2 đầy đủ trên đường cong khuyến nghị sm2p256v1 (GB/T 32918.5): tạo cặp khóa, ký và xác minh với lược đồ ZA dựa trên SM3 (GB/T 32918.2), và mã hóa hoặc giải mã theo thứ tự chuẩn C1C3C2, thứ tự cũ C1C2C3, hoặc ASN.1 DER. Mọi thứ chạy trong trình duyệt của bạn; không gì được tải lên.
Khóa riêng (hex, 64 chữ số — xử lý như mật khẩu)
Khóa công khai (hex, 130 chữ số với tiền tố 04 hoặc 128 chữ số x||y)
Khóa riêng được dùng cho Ký và Giải mã; khóa công khai cho Xác minh và Mã hóa. Khóa không bao giờ rời khỏi trang này.
User ID("định danh phân biệt" trộn vào ZA; mặc định là chuẩn trên thực tế)
Đọc thông điệp như: k cố định (nâng cao):
r (hex)
s (hex)
Chữ ký, ASN.1 DER (SEQUENCE { r INTEGER, s INTEGER } - định dạng OpenSSL/GmSSL dùng)
Về ô k cố định: mọi chữ ký thật phải dùng một k mới không đoán được — dùng lại hoặc đoán k sẽ làm lộ khóa riêng (bài học ECDSA của Sony). Trang này tạo k ngẫu nhiên từ crypto.getRandomValues bất cứ khi nào ô trống. Chỉ điền ô để tái tạo một vector đã biết cho việc giảng dạy hoặc kiểm thử.
User ID(phải khớp với bên ký)
Đọc thông điệp như: Định dạng chữ ký:
r (hex)
s (hex)
✓ Chữ ký HỢP LỆ
✗ Chữ ký KHÔNG HỢP LỆ
Đọc thông điệp như: Định dạng bản mã: Đầu ra:
k cố định (nâng cao):
Nhắc về mã hóa lai: mã hóa SM2 dành cho bí mật ngắn (khóa phiên, PIN), không dành cho dữ liệu khối — mỗi thông điệp trả 96 byte phụ trội C1+C3 và một phép nhân điểm đường cong elliptic. Mã hóa một khóa SM4/AES ngẫu nhiên bằng SM2, rồi mã hóa dữ liệu bằng mật mã đối xứng (trang SM4 / trang AES).
Đọc bản mã như: Bậc: Ghi bản rõ như:
Đối chiếu OpenSSL — hex C1C3C2 của trang này khớp với openssl pkeyutl -sm2encrypt -pubin -inkey pub.pem (OpenSSL 3.x với -pkeyopt ec_scheme:c1c3c2, mặc định), và bộ công cụ GmSSL gmssl sm2randkey / sm2encrypt; chữ ký khớp với openssl dgst -sm3 -sign với cùng user ID qua -pkeyopt sm2_userid:1234567812345678. Byte 04 đứng đầu trước C1 (do một số thư viện tạo ra) được chấp nhận khi giải mã.
Lưu ý tuân thủ: SM2 là một lựa chọn thuật toán do tuân thủ mật mã thương mại Trung Quốc và tương tác quyết định, với độ an toàn tương đương ECC 256-bit (NIST P-256). Khi đưa vào sản xuất, hãy ghép nó với một hệ thống quản lý khóa thật hoặc khóa phần cứng — một trang trình duyệt là máy tính, không phải két sắt.
Tự kiểm tra
Chạy lại các vector dẫn xuất khóa, ký với k cố định và mã hóa được tạo bởi một triển khai tham chiếu Python độc lập (và đối chiếu với gmssl), các vòng DER chữ ký và DER bản mã, vòng ký/xác minh và mã hóa/giải mã với k ngẫu nhiên, cùng các đường dẫn phủ định (C3 bị sửa, bản mã bị cắt, khóa công khai ngoài đường cong, r = 0).
SM2 là gì?
Trong một câu: SM2 là hệ mật khóa công khai tiêu chuẩn quốc gia Trung Quốc — một lược đồ chữ ký và mã hóa đường cong elliptic trên đường cong cố định sm2p256v1, được công bố là GB/T 32918-2016 (trước đó là GM/T 0003-2012), đảm nhiệm vai trò trong bộ "SM" của Trung Quốc mà ECDSA/ECDH (P-256) đảm nhiệm trong thế giới NIST.
ECC trong một đoạn (trực giác)

Mọi mật mã đường cong elliptic đều dựa trên một mẹo: cho điểm cơ sở G trên một đường cong trên trường số nguyên tố lớn và bội số P = d·G, tính d từ P nghĩa là giải bài toán logarit rời rạc trên đường cong elliptic, mà không thuật toán nhanh nào được biết. Khóa riêng d chỉ là một số 256-bit; khóa công khai là điểm d·G. SM2 không phải là phép toán đường cong mới — nó là một cách ký cụ thể (như ECDSA) và mã hóa (như ECIES thu nhỏ) trên một đường cong cụ thể, băm bằng SM3 thay vì SHA.

sm2p256v1 so với NIST P-256
Khía cạnhsm2p256v1NIST P-256 (secp256r1)
Kích thước trườngsố nguyên tố 256-bitsố nguyên tố 256-bit
Dạng đường congy² = x³ + ax + by² = x³ − 3x + b (a = −3)
Mức an toàn≈ 128 bit≈ 128 bit
Chữ kýSM2 (GB/T 32918.2), dựa trên SM3, user ID gắn vào ZAECDSA với SHA-256
Mã hóaSM2 (GB/T 32918.4), C1C3C2ECIES (ANSI X9.63, không do NIST chuẩn hóa)
BămSM3 (GB/T 32905)Họ SHA-2
Đã công bốthiết kế 2010, GM/T 0003-2012, GB/T 32918-2016; trong ISO/IEC 14888-31999 (SEC 2 / NIST)
Hỗ trợ TLSTLCP (GM/T 386) và các bộ mật mã TLS 1.3 RFC 8998ở mọi nơi

Cả hai đường cong đều cung cấp cùng một mức an toàn cụ thể; không cái nào có tấn công thực tế. Lựa chọn giữa chúng là về quy định và khả năng tương tác, không phải độ mạnh.

User ID và ZA — thứ SM2 ký mà ECDSA không ký

Trước khi băm, SM2 gộp danh tính người ký vào bản tóm tắt: ZA = SM3(ENTL ‖ ID ‖ a ‖ b ‖ xG ‖ yG ‖ xA ‖ yA), trong đó ENTLa là độ dài bit của ID, bốn trường giữa ghim chính xác đường cong, và hai trường cuối là khóa công khai của người ký. Thông điệp được băm là SM3(ZA ‖ M). Hai hệ quả: chữ ký gắn với danh tính đã khai (một tính năng), và bên xác minh phải được cho biết ID của người ký và dùng cùng một ID (một cái bẫy tương tác kinh điển). Gần như toàn bộ hệ sinh thái đã thống nhất ID mặc định 16 chữ số 1234567812345678 — không phải từ nội dung tiêu chuẩn, mà từ các ví dụ phụ lục của GM/T 0003; mặc định của OpenSSL khớp với nó, và trang này cũng vậy.

Định dạng bản mã: C1C3C2, C1C2C3 và DER

Bản mã SM2 có ba phần: C1 = điểm tạm thời kG (64 byte, x‖y), C3 = SM3(x2 ‖ M ‖ y2) (32 byte, toàn vẹn), C2 = M ⊕ KDF(x2 ‖ y2) (thông điệp đã che). Văn bản GM/T 0003 năm 2012 nối chúng theo C1 ‖ C2 ‖ C3; tiêu chuẩn GB/T 32918.4 năm 2016 đổi thứ tự thành C1 ‖ C3 ‖ C2, và OpenSSL 1.1.1+ theo. Các hệ thống ngân hàng và chính phủ cũ vẫn nói thứ tự cũ — đó là lý do trang này có cả hai, cùng dạng ASN.1 (SEQUENCE gồm INTEGER x1, INTEGER y1, OCTET STRING C3, OCTET STRING C2) mà một số thư viện xuất ra. Khi giải mã thất bại với công cụ của bên kia, thứ tự byte là điều đầu tiên cần kiểm tra.

Những lỗi thường gặp
  • Dùng lại hoặc qua loa với k. Nonce k trong cả ký lẫn mã hóa phải mới và không đoán được cho mỗi thao tác. Một k lặp lại qua hai chữ ký sẽ trao khóa riêng cho bất kỳ ai nhìn thấy cả hai. Trang này lấy k từ CSPRNG của trình duyệt; các ô k cố định chỉ tồn tại để tái tạo các vector đã biết.
  • User ID không khớp. Ký với ID mặc định, xác minh với ID tùy chỉnh (hoặc ngược lại) và mọi chữ ký hợp lệ đều thất bại. ID là một phần của dữ liệu được ký.
  • Giả định C1C3C2 ở mọi nơi. Các hệ thống thời GM/T 0003, một số thẻ thông minh và bản GmSSL cũ mặc định dùng C1C2C3; nhiều công cụ cũng thêm byte 04 của điểm không nén. Trang này chấp nhận tất cả các dạng này khi giải mã.
  • Mã hóa dữ liệu khối bằng SM2. Mỗi bản mã mang 96 byte phụ trội và tốn hai phép nhân điểm. Dùng SM2 cho khóa, SM4/AES cho dữ liệu.
  • Coi khóa công khai có tiền tố 04 là 65 byte khóa thô. 04 là dấu mã hóa: bản thân khóa là x ‖ y, 128 chữ số hex. Trang này chấp nhận cả hai cách viết.
Câu hỏi thường gặp

Có tương thích với OpenSSL / GmSSL không? Có. Đầu ra hex C1C3C2 khớp với openssl pkeyutl -sm2encrypt cho cùng khóa công khai, thông điệp và k; chữ ký DER khớp với đầu ra openssl dgst -sm3 -sign từng byte (đặt user ID bằng -pkeyopt sm2_userid:...). Các lần chạy k ngẫu nhiên dĩ nhiên khác nhau — so sánh bằng cách giải mã/xác minh, không bằng đẳng thức.

Vì sao ở đây không có trao đổi khóa SM2? GB/T 32918.3 định nghĩa một giao thức trao đổi khóa xác thực tương tác; nó không có ý nghĩa như một máy tính một trang. Ký và mã hóa bao quát các cách dùng không tương tác.

SM2 có trong WebCrypto không? Không — không trình duyệt nào triển khai (Chrome chỉ đưa vào sau cờ không chuẩn, nếu có). Trang này chạy một triển khai JavaScript viết từ đầu, với các vector phụ lục của chính tiêu chuẩn được nối vào phần tự kiểm tra ở trên.

Có thể dùng khóa PEM từ OpenSSL không? Thay vào đó xuất hex thô: openssl ec -in key.pem -text in ra vô hướng riêng và điểm công khai. Trang này chỉ nhận khóa hex, có chủ đích — máy PEM/SEC1 nằm ở trang RSA, nơi nó thuộc về.

Vậy SM9 là gì? Một loài khác: mật mã dựa trên định danh, nơi bất kỳ chuỗi nào (một địa chỉ email) là khóa công khai và một KGC cấp khóa riêng. Xem trang tổng quan SM9.