|
|
Geplaatst op 07-10-2017 17:39:00
|
|
|
|

Onlangs heb ik een inlogfunctie na de simulatie gedaan, het loginwachtwoord is versleuteld door CryptoJS aes, en daarna wil ik het bijbehorende algoritme in C# schrijven Inleiding tot het AES-encryptie-algoritme:
De Advanced Encryption Standard (afkorting: AES), ook bekend als Rijndael-encryptie in de cryptografie, is een blokencryptiestandaard die door de Amerikaanse federale overheid is aangenomen. Deze standaard wordt gebruikt ter vervanging van de oorspronkelijke DES en is wereldwijd geanalyseerd en veel gebruikt. Na een selectieproces van vijf jaar werd de Advanced Cryptographic Standard gepubliceerd door het National Institute of Standards and Technology (NIST) in FIPS PUB 197 op 26 november 2001, en werd op 26 mei 2002 een geldige standaard. In 2006 werd de Advanced Encryption Standard een van de populairste algoritmen voor symmetrische sleutelcryptografie. Het js-algoritme is als volgt:
Ik heb online op internet gezocht naar websites voor AES-encryptie, en de resultaten verschillen van mijn eigen encryptie, AES lijkt veel modi te hebben, en ik heb de introducties van anderen via internet gezien
Begin met het voorbereiden van een platte tekst en een sleutel: var plaintText = 'aaaaaa'; Platte tekst var keyStr = 'bbbbbbbbbbbbbbbbbb'; Over het algemeen is de sleutel een string Volgens de documentatie van de officiële website ondersteunt de AES-methode AES-128, AES-192 en AES-256, en de gebruikte encryptiemethode in het encryptieproces hangt af van het type binnenkomende sleutel, anders wordt deze versleuteld volgens AES-256. CryptoJS ondersteunt AES-128, AES-192 en AES-256. Hij kiest de variant op basis van de grootte van de sleutel waarin je past. Als je een wachtwoordzin gebruikt, genereert deze een 256-bits sleutel. Omdat Java wordt gegeven volgens 128bit, maar omdat het een string is, moet het op de frontend worden omgezet naar 128bit. In eerste instantie dacht ik dat het gebruik van CryptoJS.enc.Hex.parse het correct zou omzetten naar een 128-bits sleutel. Maar verder... Na vele pogingen moet je de CryptoJS.enc.Utf8.parse-methode gebruiken om de sleutel om te zetten naar 128-bits. Aangezien gezegd wordt dat het meerdere pogingen zijn, is de reden niet bekend, en zal het later dieper worden bestudeerd. Voordat je de sleutel van het stringtype gebruikt, moet je eerst met uft8 parsen voordat je het kunt gebruiken var key = CryptoJS.enc.Utf8.parse(keyStr); Omdat de backend PKCS5Padding gebruikt, bleek bij gebruik van CryptoJS helemaal geen offset te zijn. Versleuteling var encryptedData = CryptoJS.AES.encrypt(plaintText, key, { modus: CryptoJS.mode.ECB, opvulling: CryptoJS.pad.Pkcs7 }); Aangezien de door CryptoJS gegenereerde ciphertext een object is, als je deze direct omzet naar een string die een Base64-codering is, het attribuut op encryptedData. Ciphertext wordt omgezet in een string in het formaat dat door de backend vereist is. var encryptedBase64Str = encryptedData.toString(); Output: 'RJcecVhTqCHHnlibzTypzuDvG8kjWC+ot8JuxWVdLgY=' console.log(versleuteldBase64Str); Je moet ciphertext.toString() lezen op encryptedData om dezelfde ciphertext als Java te krijgen var encryptedStr = encryptedData.ciphertext.toString(); Output: '44971e715853a821c79e589bcd3ca9cee0ef1bc923582fa8b7c26ec5655d2e06' console.log(versleuteldeStr); Omdat de versleutelde ciphertext een 128-bits string is, moet deze bij het ontsleutelen worden omgezet naar een Base64-gecodeerd formaat. Daarna moet je de methode CryptoJS.enc.Hex.parse gebruiken om het om te zetten naar hexadecimaal, en vervolgens CryptoJS.enc.Base64.stringify gebruiken om het om te zetten in een Base64-gecodeerde string, en vervolgens kun je het doorgeven aan de CryptoJS.AES.decrypt-methode om het te ontsleutelen. Om de ciphertext van het stringtype te krijgen, moet je deze eerst parsen met de Hex-methode var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedStr); Converteer ciphertext naar Base64-strings Alleen Base64-type string ciphertext kan deze ontsleutelen var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr); De string die is omgezet naar Base64-codering kan worden doorgegeven aan de CryptoJS.AES.decrypt-methode voor decryptieoperaties. Decryptie var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, key, { modus: CryptoJS.mode.ECB, opvulling: CryptoJS.pad.Pkcs7 }); Na CryptoJS-ontsleuteling is het nog steeds een object, en het omzetten in platte tekst moet worden omgezet naar een string in Utf8-formaat. Na de ontsleuteling moet de plaintextstring worden getransponeerd op de manier van Utf8 var decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8); console.log(ontsleuteldeStr); 'aaaaa'
Hier is de broncode voor de .NET/C#-implementatie van AES:
|
Vorig:[12306] Sorry, omdat u de passagier te vaak bedient, probeer het morgen opnieuwVolgend:C# implementeert procesgeheugenmapping van bestandsgedeeld geheugen
|