|
|
Pubblicato su 07/10/2017 17:39:00
|
|
|
|

Recentemente ho fatto una funzione di login dopo la simulazione, la password di accesso è criptata da CryptoJS aes, e poi voglio scrivere l'algoritmo corrispondente in C# Introduzione all'algoritmo di crittografia AES:
Advanced Encryption Standard (abbreviazione: AES), noto anche come crittografia di Rijndael, è uno standard di crittografia a blocchi adottato dal governo federale degli Stati Uniti. Questo standard viene utilizzato per sostituire il DES originale ed è stato analizzato e ampiamente utilizzato in tutto il mondo. Dopo un processo di selezione di cinque anni, lo Standard Crittografico Avanzato è stato pubblicato dal National Institute of Standards and Technology (NIST) in FIPS PUB 197 il 26 novembre 2001, ed è diventato uno standard valido il 26 maggio 2002. Nel 2006, l'Advanced Encryption Standard è diventato uno degli algoritmi più popolari per la crittografia a chiave simmetrica. L'algoritmo js è il seguente:
Ho cercato siti web di crittografia AES online su Internet, e i risultati sono diversi dalla mia, AES sembra avere molte modalità e ho visto le presentazioni di altre persone su Internet
Inizia preparando un testo in chiaro e una chiavi: var plaintText = 'aa'; Testo semplice var keyStr = 'bbbbbbbbbbbbbbbb'; Generalmente, la chiave è una stringa Secondo la documentazione ufficiale del sito web, il metodo AES supporta AES-128, AES-192 e AES-256, e il metodo di crittografia utilizzato nel processo dipende dal tipo di chiave in arrivo, altrimenti verrà criptato secondo AES-256. CryptoJS supporta AES-128, AES-192 e AES-256. Sceglierà la variante in base alla dimensione della chiave che si passa. Se usi una passphrase, allora genererà una chiave a 256 bit. Poiché Java è data secondo 128bit, ma essendo una stringa, deve essere convertita in 128bit sul frontend. All'inizio pensavo che usare CryptoJS.enc.Hex.parse lo avrebbe convertito correttamente in una chiave a 128 bit. Ma per il resto... Dopo molti tentativi, devi usare il metodo CryptoJS.enc.Utf8.parse per convertire la chiave a 128 bit. Beh, dato che si dice che siano multipli tentativi, la ragione non è nota e verrà studiata più a fondo in seguito. Prima di usare la tonalità del tipo di stringa, devi parizzare con uft8 prima di poterla usare var key = CryptoJS.enc.Utf8.parse(keyStr); Poiché il backend utilizza PKCS5Padding, ma usando CryptoJS, si è riscontrato che non c'era alcun offset. Crittografia var encryptedData = CryptoJS.AES.encrypt(plaintText, key, { mode: CryptoJS.mode.ECB, riempimento: CryptoJS.pad.Pkcs7 }); Poiché il testo cifrato generato da CryptoJS è un oggetto, se lo converti direttamente in una stringa codificata in Base64, l'attributo su encryptedData.ciphertext viene convertito in una stringa è il formato richiesto dal backend. var encryptedBase64Str = encryptedData.toString(); Output: 'RJcecVhTqCHHnlibzTypzuDvG8kjWC+ot8JuxWVdLgY=' console.log(criptatoBase64Str); Devi leggere cifrato.toString() su encryptedData per ottenere lo stesso testo cifrato di Java var encryptedStr = encryptedData.ciphertext.toString(); Output: '44971e715853a821c79e589bcd3ca9cee0ef1bc923582fa8b7c26ec5655d2e06' console.log(Str criptata); Poiché il testo cifrato è una stringa di 128 bit, deve essere convertito in formato codificato Base64 durante la decifrazione. Poi devi usare il metodo CryptoJS.enc.Hex.parse per convertirlo in esadecimale, e poi usare CryptoJS.enc.Base64.stringify per convertirlo in una stringa codificata in Base64, e poi puoi passarlo al metodo CryptoJS.AES.decrypt per decifrarlo. Per ottenere il testo cifrato del tipo di stringa, devi prima analizzarlo con il metodo Hex var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedStr); Converti testo cifrato in stringhe Base64 Solo il testo cifrato a stringhe di tipo Base64 può decifrarlo var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr); La stringa convertita in codifica Base64 può essere passata nel metodo CryptoJS.AES.decrypt per l'operazione di decrittazione. Decrittazione var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, key, { mode: CryptoJS.mode.ECB, riempimento: CryptoJS.pad.Pkcs7 }); Dopo la decrittazione CryptoJS, resta comunque un oggetto, e trasformarlo in testo in chiaro deve essere convertito in una stringa in formato Utf8. Dopo la decrittazione, la stringa di testo in chiaro deve essere trasposta nello stile di Utf8 var decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8); console.log(decriptatoStr); 'aa'
Ecco il codice sorgente per l'implementazione .NET/C# di AES:
|
Precedente:[12306] Scusa, perché gestisci troppo spesso il passeggero, per favore riprova domaniProssimo:C# implementa la mappatura della memoria di processo per la condivisione file
|