|
|
Zverejnené 7. 10. 2017 17:39:00
|
|
|
|

Nedávno som použil prihlasovaciu funkciu po simulácii, prihlasovacie heslo je zašifrované pomocou CryptoJS aes a potom chcem napísať príslušný algoritmus v C# Úvod do algoritmu šifrovania AES:
Pokročilý šifrovací štandard (skratka: AES), známy aj ako Rijndael šifrovanie v kryptografii, je blokový šifrovací štandard prijatý federálnou vládou USA. Tento štandard sa používa na nahradenie pôvodného DES a bol analyzovaný a široko používaný po celom svete. Po päťročnom výberovom procese bol Pokročilý kryptografický štandard publikovaný Národným inštitútom štandardov a technológií (NIST) vo FIPS PUB 197 dňa 26. novembra 2001 a stal sa platným štandardom 26. mája 2002. V roku 2006 sa Advanced Encryption Standard stal jedným z najpopulárnejších algoritmov pre kryptografiu symetrických kľúčov. Algoritmus js je nasledovný:
Hľadal som online stránky o AES šifrovaní na internete a výsledky sa líšia od môjho vlastného šifrovania, AES má zrejme mnoho režimov a videl som úvody od iných ľudí z internetu
Začnite prípravou otvoreného textu a kľúča: var plaintText = 'aaaaa'; Neobyčajný text var keyStr = 'bbbbbbbbbbbbbbbb'; Všeobecne je tónina struna Podľa oficiálnej webovej dokumentácie metóda AES podporuje AES-128, AES-192 a AES-256 a šifrovacia metóda použitá v šifrovacom procese závisí od typu prichádzajúceho kľúča, inak bude šifrovaný podľa AES-256. CryptoJS podporuje AES-128, AES-192 a AES-256. Variant vyberie podľa veľkosti kľúča, ktorý vložíte. Ak použijete heslo, vygeneruje 256-bitový kľúč. Keďže Java je zadaná podľa 128bitu, ale keďže je to reťazec, musí sa na frontende konvertovať na 128bit. Najprv som si myslel, že použitie CryptoJS.enc.Hex.parse to správne prevedie na 128-bitový kľúč. Ale inak... Po mnohých pokusoch je potrebné použiť metódu CryptoJS.enc.Utf8.parse na konverziu kľúča na 128-bit. No, keďže sa hovorí, že ide o viacero pokusov, dôvod nie je známy a bude podrobnejšie skúmaný neskôr. Pred použitím kľúča daného typu struny je potrebné najskôr analyzovať s uft8, než ho môžete použiť var key = CryptoJS.enc.Utf8.parse(keyStr); Keďže backend používa PKCS5Padding, ale pri použití CryptoJS sa zistilo, že nedochádza k žiadnemu offsetu. Šifrovanie var encryptedData = CryptoJS.AES.encrypt(plaintText, key, { režim: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); Keďže šifrovaný text generovaný CryptoJS je objekt, ak ho konvertujete priamo na reťazec kódovaný v Base64, atribút na encryptedData.ciphertext sa konvertuje na reťazec je formát požadovaný backendom. var encryptedBase64Str = encryptedData.toString(); Výstup: 'RJcecVhTqCHHnlibzTypzuDvG8kjWC+ot8JuxWVdLgY=' console.log(encryptedBase64Str); Musíš čítať ciphertext.toString() na encryptedData, aby si získal rovnaký šifrovaný text ako v Jave var encryptedStr = encryptedData.ciphertext.toString(); Výstup: '44971e715853a821c79e589bcd3ca9cee0ef1bc923582fa8b7c26ec5655d2e06' console.log(encryptedStr); Keďže šifrovaný šifrovaný text je 128-bitový reťazec, je potrebné ho pri dešifrovaní previesť do formátu kódovaného v Base64. Potom musíte použiť metódu CryptoJS.enc.Hex.parse na konverziu do hexadecimalnej formy, potom použiť CryptoJS.enc.Base64.stringify na prevod do reťazca kódovaného v Base64, a potom to môžete odovzdať metóde CryptoJS.AES.decrypt na dešifrovanie. Aby ste získali šifrovaný text typu reťazca, musíte ho najskôr analyzovať pomocou hexadecimalnej metódy var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedStr); Konverzia šifrovaného textu do Base64 reťazcov Dešifrovať ho dokáže dešifrovať iba šifrový text typu Base64 var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr); Reťazec prevedený do kódovania Base64 môže byť odoslaný do metódy CryptoJS.AES.decrypt na dešifrovaciu operáciu. Dešifrovanie var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, key, { režim: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); Po dešifrovaní CryptoJS je stále objektom a jeho premena na čistý text je potrebné previesť na reťazec vo formáte Utf8. Po dešifrovaní je potrebné prasiatku otvoreného textu preniesť spôsobom Utf8 var decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8); console.log(decryptedStr); 'aaaaa'
Tu je zdrojový kód implementácie AES v .NET/C#:
|
Predchádzajúci:[12306] Prepáčte, pretože príliš často obsluhujete pasažier, skúste to znova zajtraBudúci:C# implementuje mapovanie pamäťe procesov, zdieľaná pamäť súborov
|