Κρυπτογράφηση / αποκρυπτογράφηση / υπογραφή SM2

Η πλήρης εργαλειοθήκη δημοσίου κλειδιού SM2 πάνω στη συνιστώμενη καμπύλη sm2p256v1 (GB/T 32918.5): δημιουργία ζεύγους κλειδιών, υπογραφή και επαλήθευση με το σχήμα ZA βασισμένο στο SM3 (GB/T 32918.2), και κρυπτογράφηση ή αποκρυπτογράφηση με τη σειρά C1C3C2 του προτύπου, τη παλαιά σειρά C1C2C3, ή ASN.1 DER. Όλα εκτελούνται στο πρόγραμμα περιήγησης· τίποτα δεν μεταφορτώνεται.
Ιδιωτικό κλειδί (hex, 64 ψηφία — αντιμετωπίζεται σαν κωδικός πρόσβασης)
Δημόσιο κλειδί (hex, 130 ψηφία με πρόθεμα 04 ή 128 ψηφία x||y)
Το ιδιωτικό κλειδί χρησιμοποιείται από την Υπογραφή και την Αποκρυπτογράφηση· το δημόσιο από την Επαλήθευση και την Κρυπτογράφηση. Τα κλειδιά δεν φεύγουν ποτέ από αυτή τη σελίδα.
ID χρήστη(το «διακριτικό αναγνωριστικό» που αναμειγνύεται στο ZA· το προεπιλεγμένο είναι το de-facto πρότυπο)
Ανάγνωση μηνύματος ως: Σταθερό k (για προχωρημένους):
r (hex)
s (hex)
Υπογραφή, ASN.1 DER (SEQUENCE { r INTEGER, s INTEGER } - η μορφή που χρησιμοποιούν OpenSSL/GmSSL)
Σχετικά με το πεδίο σταθερού k: κάθε πραγματική υπογραφή πρέπει να χρησιμοποιεί νέο, απρόβλεπτο k — η επαναχρησιμοποίηση ή η εικασία του k διαρρέει το ιδιωτικό κλειδί (το γνωστό μάθημα του ECDSA της Sony). Η σελίδα δημιουργεί τυχαίο k από το crypto.getRandomValues όταν το πεδίο είναι κενό. Το πεδίο συμπληρώνεται μόνο για την αναπαραγωγή ενός γνωστού διανύσματος για διδασκαλία ή δοκιμές.
ID χρήστη(πρέπει να ταιριάζει με αυτό του υπογράφοντα)
Ανάγνωση μηνύματος ως: Μορφή υπογραφής:
r (hex)
s (hex)
✓ Η υπογραφή είναι ΕΓΚΥΡΗ
✗ Η υπογραφή είναι ΜΗ ΕΓΚΥΡΗ
Ανάγνωση μηνύματος ως: Μορφή κρυπτογραφήματος: Έξοδος:
Σταθερό k (για προχωρημένους):
Υπενθύμιση υβριδικής κρυπτογράφησης: η κρυπτογράφηση SM2 προορίζεται για σύντομα μυστικά (κλειδιά συνεδρίας, PIN), όχι για μαζικά δεδομένα — κάθε μήνυμα πληρώνει 96 bytes επιβάρυνσης C1+C3 και έναν πολλαπλασιασμό σημείου ελλειπτικής καμπύλης. Κρυπτογραφείται ένα τυχαίο κλειδί SM4/AES με SM2, και έπειτα τα δεδομένα με τον συμμετρικό κρυπτογράφο (σελίδα SM4 / σελίδα AES).
Ανάγνωση κρυπτογραφήματος ως: Τάξη: Εγγραφή απλού κειμένου ως:
Διασταύρωση με OpenSSL — το δεκαεξαδικό C1C3C2 αυτής της σελίδας ταιριάζει με το openssl pkeyutl -sm2encrypt -pubin -inkey pub.pem (OpenSSL 3.x με -pkeyopt ec_scheme:c1c3c2, η προεπιλογή), και τα εργαλεία GmSSL gmssl sm2randkey / sm2encrypt· οι υπογραφές ταιριάζουν με το openssl dgst -sm3 -sign με το ίδιο αναγνωριστικό χρήστη μέσω -pkeyopt sm2_userid:1234567812345678. Ένα αρχικό byte 04 πριν από το C1 (όπως παράγουν αρκετές βιβλιοθήκες) γίνεται δεκτό κατά την αποκρυπτογράφηση.
Σημείωση συμμόρφωσης: το SM2 είναι επιλογή αλγορίθμου που υπαγορεύεται από τη συμμόρφωση και τη διαλειτουργικότητα της κινεζικής εμπορικής κρυπτογραφίας, με ασφάλεια συγκρίσιμη με την ECC 256 bit (NIST P-256). Σε παραγωγή συνδυάζεται με πραγματικό σύστημα διαχείρισης κλειδιών ή hardware κλειδιά — η σελίδα προγράμματος περιήγησης είναι αριθμομηχανή, όχι θησαυροφυλάκιο.
Αυτοέλεγχος
Επανεκτελεί τα διανύσματα παραγωγής κλειδιών, υπογραφής με σταθερό k και κρυπτογράφησης που παρήγαγε ανεξάρτητη υλοποίηση αναφοράς σε Python (και διασταυρώθηκαν με το gmssl), τους κύκλους DER υπογραφής και DER κρυπτογραφήματος, κύκλους υπογραφής/επαλήθευσης και κρυπτογράφησης/αποκρυπτογράφησης με τυχαίο k, και τις αρνητικές διαδρομές (παραποιημένο C3, περικομμένο κρυπτογράφημα, δημόσιο κλειδί εκτός καμπύλης, r = 0).
Τι είναι το SM2;
Σε μία πρόταση: το SM2 είναι το κινεζικό εθνικό πρότυπο κρυπτοσύστημα δημοσίου κλειδιού — σχήμα υπογραφής και κρυπτογράφησης ελλειπτικής καμπύλης πάνω στη σταθερή καμπύλη sm2p256v1, δημοσιευμένο ως GB/T 32918-2016 (προηγουμένως GM/T 0003-2012), και παίζει στη κινεζική σουίτα «SM» τον ρόλο που παίζουν ECDSA/ECDH (P-256) στον κόσμο NIST.
ECC σε μία παράγραφο (η διαίσθηση)

Όλη η κρυπτογραφία ελλειπτικών καμπυλών βασίζεται σε ένα τέχνασμα: δεδομένου του σημείου βάσης G πάνω σε μια καμπύλη πάνω από πεπερασμένο σώμα πρώτου αριθμού και του πολλαπλάσιου P = d·G, ο υπολογισμός του d από το P σημαίνει επίλυση του προβλήματος διακριτού λογαρίθμου ελλειπτικής καμπύλης, για το οποίο δεν είναι γνωστός γρήγορος αλγόριθμος. Το ιδιωτικό κλειδί d είναι απλώς ένας αριθμός 256 bit· το δημόσιο κλειδί είναι το σημείο d·G. Το SM2 δεν είναι νέα αριθμητική καμπύλης — είναι συγκεκριμένος τρόπος υπογραφής (όπως το ECDSA) και κρυπτογράφησης (όπως ένα μικρό ECIES) πάνω σε μια συγκεκριμένη καμπύλη, με κατακερματισμό SM3 αντί για SHA.

sm2p256v1 έναντι NIST P-256
Πλευράsm2p256v1NIST P-256 (secp256r1)
Μέγεθος πεδίουπρώτος αριθμός 256 bitπρώτος αριθμός 256 bit
Σχήμα καμπύληςy² = x³ + ax + by² = x³ − 3x + b (a = −3)
Επίπεδο ασφαλείας≈ 128 bit≈ 128 bit
ΥπογραφήSM2 (GB/T 32918.2), βασισμένο στο SM3, ταυτότητα χρήστη δεσμευμένη στο ZAECDSA με SHA-256
ΚρυπτογράφησηSM2 (GB/T 32918.4), C1C3C2ECIES (ANSI X9.63, όχι τυποποιημένο από το NIST)
ΚατακερματισμόςSM3 (GB/T 32905)Οικογένεια SHA-2
Δημοσιεύτηκεσχεδίαση 2010, GM/T 0003-2012, GB/T 32918-2016· στο ISO/IEC 14888-31999 (SEC 2 / NIST)
Υποστήριξη TLSΣουίτες TLCP (GM/T 386) και TLS 1.3 RFC 8998παντού

Και οι δύο καμπύλες προσφέρουν την ίδια συγκεκριμένη ασφάλεια· καμία δεν έχει πρακτική επίθεση. Η επιλογή μεταξύ τους είναι κανονιστική και θέμα διαλειτουργικότητας, όχι ισχύος.

Το αναγνωριστικό χρήστη και το ZA — αυτό που υπογράφει το SM2 και το ECDSA δεν υπογράφει

Πριν από τον κατακερματισμό, το SM2 ενσωματώνει την ταυτότητα του υπογράφοντος στο αποτύπωμα: ZA = SM3(ENTL ‖ ID ‖ a ‖ b ‖ xG ‖ yG ‖ xA ‖ yA), όπου ENTLa είναι το μήκος σε bit του ID, τα μεσαία τέσσερα πεδία καθορίζουν την ακριβή καμπύλη, και τα δύο τελευταία είναι το δημόσιο κλειδί του υπογράφοντος. Το μήνυμα κατακερματίζεται ως SM3(ZA ‖ M). Δύο συνέπειες: μια υπογραφή δεσμεύεται στη δηλωμένη ταυτότητα (χαρακτηριστικό), και ο επαληθευτής πρέπει να ενημερωθεί για το ID του υπογράφοντος και να χρησιμοποιήσει το ίδιο (κλασική παγίδα διαλειτουργικότητας). Σχεδόν όλο το οικοσύστημα συμφώνησε στο προεπιλεγμένο ID 16 ψηφίων 1234567812345678 — όχι από το κείμενο του προτύπου, αλλά από τα παραδείγματα παραρτήματος του GM/T 0003· το προεπιλεγμένο του OpenSSL ταιριάζει, όπως και αυτή η σελίδα.

Μορφές κρυπτογραφήματος: C1C3C2, C1C2C3 και DER

Ένα κρυπτογράφημα SM2 έχει τρία μέρη: C1 = το εφήμερο σημείο kG (64 bytes, x‖y), C3 = SM3(x2 ‖ M ‖ y2) (32 bytes, ακεραιότητα), C2 = M ⊕ KDF(x2 ‖ y2) (το μασκαρισμένο μήνυμα). Το κείμενο GM/T 0003 του 2012 τα συνένωνε C1 ‖ C2 ‖ C3· το πρότυπο GB/T 32918.4 του 2016 αναδιάταξε σε C1 ‖ C3 ‖ C2, και το OpenSSL 1.1.1+ το ακολούθησε. Τα παλαιά τραπεζικά και κυβερνητικά συστήματα μιλούν ακόμη την παλαιά σειρά — γι' αυτό η σελίδα έχει και τις δύο, συν τη μορφή ASN.1 (SEQUENCE των INTEGER x1, INTEGER y1, OCTET STRING C3, OCTET STRING C2) που εκπέμπουν ορισμένες βιβλιοθήκες. Όταν η αποκρυπτογράφηση αποτυγχάνει με το εργαλείο του άλλου μέρους, η σειρά bytes είναι το πρώτο που ελέγχεται.

Συνηθισμένα λάθη
  • Επαναχρησιμοποίηση ή φειδωλή χρήση του k. Το k της υπογραφής και της κρυπτογράφησης πρέπει να είναι νέο και απρόβλεπτο σε κάθε πράξη. Ένα επαναλαμβανόμενο k σε δύο υπογραφές παραδίδει το ιδιωτικό κλειδί σε όποιον βλέπει και τις δύο. Η σελίδα αντλεί το k από το CSPRNG του προγράμματος περιήγησης· τα πεδία σταθερού k υπάρχουν μόνο για την αναπαραγωγή γνωστών διανυσμάτων.
  • Αναντιστοιχία αναγνωριστικών χρήστη. Υπογραφή με το προεπιλεγμένο αναγνωριστικό και επαλήθευση με προσαρμοσμένο (ή αντιστρόφως) και κάθε έγκυρη υπογραφή αποτυγχάνει. Το αναγνωριστικό είναι μέρος των υπογεγραμμένων δεδομένων.
  • Η παραδοχή ότι παντού ισχύει C1C3C2. Τα συστήματα της εποχής GM/T 0003, ορισμένες έξυπνες κάρτες και παλαιότερες εκδόσεις του GmSSL χρησιμοποιούν εξ ορισμού C1C2C3· πολλά εργαλεία προσθέτουν επίσης ένα byte 04 για μη συμπιεσμένο σημείο. Η σελίδα δέχεται όλα αυτά κατά την αποκρυπτογράφηση.
  • Κρυπτογράφηση μαζικών δεδομένων με SM2. Κάθε κρυπτογράφημα φέρει 96 bytes επιβάρυνσης και κοστίζει δύο πολλαπλασιασμούς σημείων. Το SM2 χρησιμοποιείται σε ένα κλειδί, το SM4/AES στα δεδομένα.
  • Αντιμετώπιση δημόσιου κλειδιού με πρόθεμα 04 ως 65 ωμών bytes κλειδιού. Το 04 είναι δείκτης κωδικοποίησης: το ίδιο το κλειδί είναι x ‖ y, 128 δεκαεξαδικά ψηφία. Η σελίδα δέχεται και τις δύο γραφές.
Συχνές ερωτήσεις

Είναι συμβατό με το OpenSSL / GmSSL; Ναι. Η έξοδος hex C1C3C2 ταιριάζει με το openssl pkeyutl -sm2encrypt για το ίδιο δημόσιο κλειδί, μήνυμα και k· οι υπογραφές DER ταιριάζουν με την έξοδο του openssl dgst -sm3 -sign byte προς byte (ορίζεται το αναγνωριστικό χρήστη με -pkeyopt sm2_userid:...). Οι εκτελέσεις με τυχαίο k βέβαια διαφέρουν — η σύγκριση γίνεται με αποκρυπτογράφηση/επαλήθευση, όχι με ισότητα.

Γιατί δεν υπάρχει εδώ ανταλλαγή κλειδιού SM2; Το GB/T 32918.3 ορίζει ένα διαδραστικό πρωτόκολλο ανταλλαγής κλειδιών με αυθεντικοποίηση· δεν έχει νόημα ως σελίδα υπολογιστή μίας σελίδας. Η υπογραφή και η κρυπτογράφηση καλύπτουν τις μη διαδραστικές χρήσεις.

Υπάρχει το SM2 στο WebCrypto; Όχι — κανένα πρόγραμμα περιήγησης δεν το υλοποιεί (το Chrome το παρέχει μόνο πίσω από μη τυποποιημένες σημαίες, αν καθόλου). Η σελίδα εκτελεί μια υλοποίηση JavaScript από την αρχή, με τα διανύσματα παραρτήματος του ίδιου του προτύπου συνδεδεμένα στο αυτοτεστ παραπάνω.

Μπορεί να χρησιμοποιηθεί ένα κλειδί PEM του OpenSSL; Εξαγωγή του ακατέργαστου hex αντί γι' αυτό: το openssl ec -in key.pem -text εμφανίζει το ιδιωτικό βαθμωτό μέγεθος και το δημόσιο σημείο. Η σελίδα δέχεται μόνο κλειδιά hex, εσκεμμένα — η μηχανική PEM/SEC1 ανήκει στη σελίδα RSA, όπου ταιριάζει.

Τι είναι λοιπόν το SM9; Διαφορετικό ζώο: κρυπτογραφία βασισμένη σε ταυτότητα, όπου οποιαδήποτε συμβολοσειρά (μια διεύθυνση email) είναι το δημόσιο κλειδί και ένα KGC εκδίδει τα ιδιωτικά κλειδιά. Βλ. τη σελίδα επισκόπησης SM9.