|
|
Δημοσιεύτηκε στις 7/10/2017 5:39:00 μ.μ.
|
|
|
|

Πρόσφατα, έκανα μια λειτουργία σύνδεσης μετά την προσομοίωση, ο κωδικός πρόσβασης σύνδεσης είναι κρυπτογραφημένος από το CryptoJS aes και, στη συνέχεια, θέλω να γράψω τον αντίστοιχο αλγόριθμο σε C# Εισαγωγή στον αλγόριθμο κρυπτογράφησης AES:
Το Advanced Encryption Standard (συντομογραφία: AES), γνωστό και ως κρυπτογράφηση Rijndael στην κρυπτογραφία, είναι ένα πρότυπο κρυπτογράφησης μπλοκ που υιοθετήθηκε από την ομοσπονδιακή κυβέρνηση των ΗΠΑ. Αυτό το πρότυπο χρησιμοποιείται για την αντικατάσταση του αρχικού DES και έχει αναλυθεί και χρησιμοποιηθεί ευρέως σε όλο τον κόσμο. Μετά από μια πενταετή διαδικασία επιλογής, το Advanced Cryptographic Standard δημοσιεύτηκε από το Εθνικό Ινστιτούτο Προτύπων και Τεχνολογίας (NIST) στο FIPS PUB 197 στις 26 Νοεμβρίου 2001 και έγινε έγκυρο πρότυπο στις 26 Μαΐου 2002. Το 2006, το Advanced Encryption Standard έγινε ένας από τους πιο δημοφιλείς αλγόριθμους για κρυπτογραφία συμμετρικών κλειδιών. Ο αλγόριθμος js έχει ως εξής:
Έψαξα για διαδικτυακούς ιστότοπους κρυπτογράφησης AES στο Διαδίκτυο και τα αποτελέσματα είναι διαφορετικά από τη δική μου κρυπτογράφηση, το AES φαίνεται να έχει πολλές λειτουργίες και έχω δει τις εισαγωγές άλλων ανθρώπων από το Διαδίκτυο
Ξεκινήστε προετοιμάζοντας ένα απλό κείμενο και ένα κλειδί: var plaintText = 'αααα Απλό κείμενο var keyStr = 'bbbbbbbbbbbbbbbb'; Γενικά, το κλειδί είναι μια συμβολοσειρά Σύμφωνα με την επίσημη τεκμηρίωση του ιστότοπου, η μέθοδος AES υποστηρίζει AES-128, AES-192 και AES-256 και η μέθοδος κρυπτογράφησης που χρησιμοποιείται στη διαδικασία κρυπτογράφησης εξαρτάται από τον τύπο του εισερχόμενου κλειδιού, διαφορετικά θα κρυπτογραφηθεί σύμφωνα με το AES-256. Το CryptoJS υποστηρίζει AES-128, AES-192 και AES-256. Θα επιλέξει την παραλλαγή με βάση το μέγεθος του κλειδιού που περνάτε. Εάν χρησιμοποιείτε μια φράση πρόσβασης, τότε θα δημιουργήσει ένα κλειδί 256-bit. Δεδομένου ότι η Java δίνεται σύμφωνα με τα 128 bit, αλλά επειδή είναι συμβολοσειρά, πρέπει να μετατραπεί σε 128 bit στο frontend. Στην αρχή, νόμιζα ότι η χρήση του CryptoJS.enc.Hex.parse θα το μετέτρεπε σωστά σε κλειδί 128-bit. Αλλά κατά τα άλλα... Μετά από πολλές προσπάθειες, πρέπει να χρησιμοποιήσετε τη μέθοδο CryptoJS.enc.Utf8.parse για να μετατρέψετε το κλειδί σε 128-bit. Λοιπόν, αφού λέγεται ότι πρόκειται για πολλαπλές προσπάθειες, τότε ο λόγος δεν είναι γνωστός και θα μελετηθεί πιο βαθιά αργότερα. Πριν χρησιμοποιήσετε το κλειδί του τύπου συμβολοσειράς, πρέπει να κάνετε ανάλυση με uft8 για να μπορέσετε να το χρησιμοποιήσετε var κλειδί = CryptoJS.enc.Utf8.parse(keyStr); Δεδομένου ότι το backend χρησιμοποιεί PKCS5Padding, αλλά κατά τη χρήση του CryptoJS, διαπιστώθηκε ότι δεν υπήρχε καθόλου μετατόπιση. Κρυπτογράφηση var encryptedData = CryptoJS.AES.encrypt(plaintText, key, { λειτουργία: CryptoJS.mode.ECB, αναπλήρωση: CryptoJS.pad.Pkcs7 }); Δεδομένου ότι το κρυπτογραφημένο κείμενο που δημιουργείται από το CryptoJS είναι ένα αντικείμενο, εάν το μετατρέψετε απευθείας σε συμβολοσειρά είναι κωδικοποιημένο Base64, το χαρακτηριστικό στο encryptedData.ciphertext μετατρέπεται σε συμβολοσειρά είναι η μορφή που απαιτείται από το backend. var encryptedBase64Str = encryptedData.toString(); Έξοδος: 'RJcecVhTqCHHnlibzTypzuDvG8kjWC+ot8JuxWVdLgY=' console.log(κρυπτογραφημένοBase64Str); Πρέπει να διαβάσετε το ciphertext.toString() σε κρυπτογραφημένα δεδομένα για να λάβετε το ίδιο κρυπτογραφημένο κείμενο με την Java var encryptedStr = encryptedData.ciphertext.toString(); Έξοδος: '44971e715853a821c79e589bcd3ca9cee0ef1bc923582fa8b7c26ec5655d2e06' console.log(κρυπτογραφημένοςStr); Δεδομένου ότι το κρυπτογραφημένο κρυπτογραφημένο κείμενο είναι μια συμβολοσειρά 128-bit, πρέπει να μετατραπεί σε κωδικοποιημένη μορφή Base64 κατά την αποκρυπτογράφηση. Στη συνέχεια, πρέπει να χρησιμοποιήσετε τη μέθοδο CryptoJS.enc.Hex.parse για να τη μετατρέψετε σε δεκαεξαδικό και, στη συνέχεια, να χρησιμοποιήσετε το CryptoJS.enc.Base64.stringify για να τη μετατρέψετε σε κωδικοποιημένη συμβολοσειρά Base64 και, στη συνέχεια, μπορείτε να τη μεταβιβάσετε στη μέθοδο CryptoJS.AES.decrypt για να την αποκρυπτογραφήσετε. Για να λάβετε το κρυπτογραφημένο κείμενο του τύπου συμβολοσειράς, πρέπει πρώτα να το αναλύσετε με τη μέθοδο Hex var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedStr); Μετατροπή κρυπτογραφημένου κειμένου σε συμβολοσειρές Base64 Μόνο το κρυπτογραφημένο κείμενο συμβολοσειράς τύπου Base64 μπορεί να το αποκρυπτογραφήσει var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr); Η συμβολοσειρά που μετατρέπεται σε κωδικοποίηση Base64 μπορεί να μεταβιβαστεί στη μέθοδο CryptoJS.AES.decrypt για λειτουργία αποκρυπτογράφησης. Αποκρυπτογράφηση var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, key, { λειτουργία: CryptoJS.mode.ECB, αναπλήρωση: CryptoJS.pad.Pkcs7 }); Μετά την αποκρυπτογράφηση CryptoJS, εξακολουθεί να είναι αντικείμενο και η μετατροπή του σε απλό κείμενο πρέπει να μετατραπεί σε συμβολοσειρά σε μορφή Utf8. Μετά την αποκρυπτογράφηση, η συμβολοσειρά απλού κειμένου πρέπει να μεταφερθεί με τον τρόπο του Utf8 var decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8); console.log(decryptedStr); «Ααααα
Ακολουθεί ο πηγαίος κώδικας για την υλοποίηση .NET/C# του AES:
|
Προηγούμενος:[12306] Λυπούμαστε, επειδή χειρίζεστε τον επιβάτη πολύ συχνά, δοκιμάστε ξανά αύριοΕπόμενος:Η C# υλοποιεί τη μνήμη διεργασιών χαρτογράφησης αρχείων κοινής χρήσης
|