|
|
Publicerad på 2017-10-07 17:39:00
|
|
|
|

Nyligen gjorde jag en inloggningsfunktion efter simulering, inloggningslösenordet krypteras av CryptoJS aes, och sedan vill jag skriva motsvarande algoritm i C# Introduktion till AES-krypteringsalgoritmen:
Advanced Encryption Standard (förkortning: AES), även känd som Rijndael-kryptering inom kryptografi, är en blockkrypteringsstandard som antagits av den amerikanska federala regeringen. Denna standard används för att ersätta den ursprungliga DES och har analyserats och använts i stor utsträckning över hela världen. Efter en femårig urvalsprocess publicerades Advanced Cryptographic Standard av National Institute of Standards and Technology (NIST) i FIPS PUB 197 den 26 november 2001 och blev en giltig standard den 26 maj 2002. År 2006 blev Advanced Encryption Standard en av de mest populära algoritmerna för symmetrisk nyckelkryptografi. Js-algoritmen är som följer:
Jag sökte efter online-webbplatser för AES-kryptering på internet, och resultaten skiljer sig från min egen kryptering, AES verkar ha många lägen, och jag har sett andras introduktioner från internet
Börja med att förbereda en klartext och nyckel: var plaintText = 'aaaaa'; Klartext var keyStr = 'bbbbbbbbbbbbbbbb'; Generellt är nyckeln en sträng Enligt den officiella webbplatsens dokumentation stöder AES-metoden AES-128, AES-192 och AES-256, och krypteringsmetoden som används i krypteringsprocessen beror på vilken typ av inkommande nyckel den har, annars kommer den att krypteras enligt AES-256. CryptoJS stöder AES-128, AES-192 och AES-256. Den väljer varianten utifrån storleken på nyckeln du passerar i. Om du använder en lösenfras kommer den att generera en 256-bitars nyckel. Eftersom Java ges enligt 128-bitar, men eftersom det är en sträng, måste det konverteras till 128-bitars i frontend. Först trodde jag att CryptoJS.enc.Hex.parse skulle konvertera den korrekt till en 128-bitars nyckel. Men annars... Efter många försök behöver du använda metoden CryptoJS.enc.Utf8.parse för att konvertera nyckeln till 128-bitars. Eftersom det sägs att det är flera försök, är orsaken inte känd, och det kommer att studeras mer ingående senare. Innan du använder nyckeln för strängtypen måste du parsa med uft8 innan du kan använda den var key = CryptoJS.enc.Utf8.parse(keyStr); Eftersom backend använder PKCS5Padding, men när man använde CryptoJS, upptäcktes det att det inte fanns någon offset alls. Kryptering var encryptedData = CryptoJS.AES.encrypt(plaintText, key, { läge: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); Eftersom chiffertexten som genereras av CryptoJS är ett objekt, om du konverterar den direkt till en sträng som är en Base64-kodad, är attributet på encryptedData. Chiffertext konverteras till en sträng är det format som krävs av backend. var encryptedBase64Str = encryptedData.toString(); Output: 'RJcecVhTqCHHnlibzTypzuDvG8kjWC+ot8JuxWVdLgY=' console.log(krypteradBase64Str); Du måste läsa ciphertext.toString() på encryptedData för att få samma chiffertext som Java var encryptedStr = encryptedData.ciphertext.toString(); Utdata: '44971e715853a821c79e589bcd3ca9cee0ef1bc923582fa8b7c26ec5655d2e06' console.log(krypteradStr); Eftersom den krypterade chiffertexten är en 128-bitars sträng måste den konverteras till Base64-kodat format vid dekryptering. Sedan behöver du använda metoden CryptoJS.enc.Hex.parse för att konvertera det till hexadecimal, och sedan använda CryptoJS.enc.Base64.stringify för att konvertera det till en Base64-kodad sträng, och sedan kan du skicka det till CryptoJS.AES.decrypt-metoden för att dekryptera det. För att få chiffertexten för strängtypen måste du först tolka den med Hex-metoden var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedStr); Konvertera chiffertext till Base64-strängar Endast Base64-typ strängchiffertext kan dekryptera den var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr); Strängen som konverterats till Base64-kodning kan skickas in i CryptoJS.AES.decrypt-metoden för dekrypteringsoperation. Dekryptering var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, key, { läge: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); Efter CryptoJS-dekryptering är det fortfarande ett objekt, och att omvandla det till klartext måste konverteras till en sträng i Utf8-format. Efter dekryptering måste klartextsträngen transponeras på samma sätt som Utf8 var decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8); console.log(dekrypteradStr); 'aaaaa'
Här är källkoden för .NET/C#-implementeringen av AES:
|
Föregående:[12306] Förlåt, för att du kör passageraren för ofta, försök igen imorgonNästa:C# implementerar processminnesmappning på fildelningsminne
|