|
|
Postat pe 07.10.2017 17:39:00
|
|
|
|

Recent, am făcut o funcție de autentificare post-simulare, parola de autentificare este criptată de CryptoJS aes, iar apoi vreau să scriu algoritmul corespunzător în C# Introducere în algoritmul de criptare AES:
Standardul Avansat de Criptare (abreviere: AES), cunoscut și sub denumirea de criptare Rijndael în criptografie, este un standard de criptare pe blocuri adoptat de guvernul federal al SUA. Acest standard este folosit pentru a înlocui DES original și a fost analizat și utilizat pe scară largă în întreaga lume. După un proces de selecție de cinci ani, Standardul Criptografic Avansat a fost publicat de Institutul Național de Standarde și Tehnologie (NIST) în FIPS PUB 197 la 26 noiembrie 2001 și a devenit un standard valabil la 26 mai 2002. În 2006, Advanced Encryption Standard a devenit unul dintre cei mai populari algoritmi pentru criptografia cu chei simetrice. Algoritmul js este următorul:
Am căutat site-uri online de criptare AES pe Internet, iar rezultatele sunt diferite față de criptarea mea, AES pare să aibă multe moduri și am văzut prezentări ale altor persoane pe Internet
Începe prin a pregăti un text clar și o cheie: var plaintText = 'aa'; Text simplu var keyStr = 'bbbbbbbbbbbbbb'; În general, cheia este un șir Conform documentației site-ului oficial, metoda AES suportă AES-128, AES-192 și AES-256, iar metoda de criptare folosită în procesul de criptare depinde de tipul cheii primite, altfel va fi criptată conform AES-256. CryptoJS suportă AES-128, AES-192 și AES-256. Va alege varianta după mărimea cheii pe care o treci. Dacă folosești o parolă, atunci va genera o cheie de 256 de biți. Deoarece Java este dat conform 128bitului, dar fiind un șir, trebuie convertit în 128bit pe frontend. La început, am crezut că folosirea CryptoJS.enc.Hex.parse o va converti corect într-o cheie de 128 de biți. Dar în rest... După mai multe încercări, trebuie să folosești metoda CryptoJS.enc.Utf8.parse pentru a converti cheia la 128 de biți. Ei bine, deoarece se spune că sunt mai multe încercări, motivul nu este cunoscut și va fi studiat mai în profunzime mai târziu. Înainte de a folosi tonalitatea tipului de șir, trebuie să parsezi cu uft8 înainte să o poți folosi var key = CryptoJS.enc.Utf8.parse(keyStr); Deoarece backend-ul folosește PKCS5Padding, când folosești CryptoJS, s-a constatat că nu există deloc offset. Criptare var encryptedData = CryptoJS.AES.encrypt(plaintText, key, { mod: CryptoJS.mode.ECB, umplutură: CryptoJS.pad.Pkcs7 }); Deoarece textul cifrat generat de CryptoJS este un obiect, dacă îl converti direct într-un șir codificat în Base64, atributul de pe encryptedData.ciphertext este convertit într-un șir, este formatul cerut de backend. var encryptedBase64Str = encryptedData.toString(); Output: 'RJcecVhTqCHHnlibzTypzuDvG8kjWC+ot8JuxWVdLgY=' console.log(encryptedBase64Str); Trebuie să citești ciphertext.toString() pe encryptedData pentru a obține același text cifrat ca Java var encryptedStr = encryptedData.ciphertext.toString(); Ieșire: '44971e715853a821c79e589bcd3ca9cee0ef1bc923582fa8b7c26ec5655d2e06' console.log(Str criptat); Deoarece textul cifrat este un șir de 128 de biți, trebuie convertit în format codificat Base64 la decriptare. Apoi trebuie să folosești metoda CryptoJS.enc.Hex.parse pentru a-l converti în hexazecimal, apoi să folosești CryptoJS.enc.Base64.stringify pentru a-l converti într-un șir codificat Base64, iar apoi poți să o transferi metodei CryptoJS.AES.decrypt pentru a-l decripta. Pentru a obține textul cifrat al tipului de șir, trebuie mai întâi să-l analizezi cu metoda Hex var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedStr); Convertiți textul cifrat în șiruri Base64 Doar textul cifrat de tip Base64 îl poate decripta var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr); Șirul convertit în codare Base64 poate fi transmis în metoda CryptoJS.AES.decrypt pentru operațiuni de decriptare. Decriptare var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, key, { mod: CryptoJS.mode.ECB, umplutură: CryptoJS.pad.Pkcs7 }); După decriptarea CryptoJS, acesta rămâne un obiect, iar transformarea lui în text clar trebuie convertită într-un șir în format Utf8. După decriptare, șirul de text clar trebuie transpus în stilul Utf8 var decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8); console.log(decriptatStr); 'aa'
Iată codul sursă pentru implementarea .NET/C# a AES:
|
Precedent:[12306] Scuze, pentru că conduci pasagerul prea des, te rog încearcă din nou mâineUrmător:C# implementează maparea memoriei procesului pentru partajarea fișierelor
|