|
|
Zveřejněno 07.10.2017 17:39:00
|
|
|
|

Nedávno jsem použil přihlašovací funkci po simulaci, přihlašovací heslo je zašifrované pomocí CryptoJS aes a pak chci napsat odpovídající algoritmus v C# Úvod do šifrovacího algoritmu AES:
Pokročilý šifrovací standard (zkratka: AES), známý také jako Rijndaelovo šifrování v kryptografii, je blokový šifrovací standard přijatý federální vládou USA. Tento standard nahrazuje původní DES a byl analyzován a široce používán po celém světě. Po pětiletém výběrovém procesu byl Pokročilý kryptografický standard publikován Národním institutem pro standardy a technologie (NIST) ve FIPS PUB 197 dne 26. listopadu 2001 a stal se platným standardem 26. května 2002. V roce 2006 se Advanced Encryption Standard stal jedním z nejpopulárnějších algoritmů pro kryptografii symetrických klíčů. Algoritmus js je následující:
Hledal jsem online weby o AES šifrování na internetu a výsledky se liší od mého vlastního šifrování, AES má mnoho režimů a viděl jsem úvody od ostatních lidí z internetu
Začněte přípravou otevřeného textu a klíče: var plaintText = 'aaaa'; Prostý text var keyStr = 'bbbbbbbbbbbb'; Obecně je klíčem struna Podle oficiální dokumentace na webu metoda AES podporuje AES-128, AES-192 a AES-256 a šifrovací metoda použitá v šifrovacím procesu závisí na typu příchozího klíče, jinak bude šifrován podle AES-256. CryptoJS podporuje AES-128, AES-192 a AES-256. Varianta si vybere podle velikosti klíče, do kterého vložíte. Pokud použijete heslo, vygeneruje to 256bitový klíč. Protože Java je zadána podle 128bit, ale protože je to řetězec, musí být na frontendu převedena na 128bit. Nejprve jsem si myslel, že použití CryptoJS.enc.Hex.parse ji správně převede na 128bitový klíč. Ale jinak... Po mnoha pokusech je potřeba použít metodu CryptoJS.enc.Utf8.parse k převodu klíče na 128bit. No, protože se říká, že jde o více pokusů, není znám důvod a bude podrobněji zkoumán později. Před použitím tóniny typu struny je potřeba parsovat s uft8, než ji můžete použít var key = CryptoJS.enc.Utf8.parse(keyStr); Protože backend používá PKCS5Padding, ale při použití CryptoJS se zjistilo, že žádný offset neexistuje. Šifrování var encryptedData = CryptoJS.AES.encrypt(plaintText, key, { režim: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); Protože šifrovaný text generovaný CryptoJS je objekt, pokud jej přímo převedete na řetězec kódovaný v Base64, atribut encryptedData.ciphertext se převede na řetězec je formát požadovaný backendem. var encryptedBase64Str = encryptedData.toString(); Výstup: 'RJcecVhTqCHHnlibzTypzuDvG8kjWC+ot8JuxWVdLgY=' console.log(encryptedBase64Str); Musíte číst ciphertext.toString() na encryptedData, abyste získali stejný šifrovaný text jako Java var encryptedStr = encryptedData.ciphertext.toString(); Výstup: '44971e715853a821c79e589bcd3ca9cee0ef1bc923582fa8b7c26ec5655d2e06' console.log(encryptedStr); Protože šifrovaný šifrovaný text je 128bitový řetězec, je nutné jej při dešifrování převést do formátu kódovaného v Base64. Pak musíte použít metodu CryptoJS.enc.Hex.parse k převodu do hexadecimálního formátu, a pak použít CryptoJS.enc.Base64.stringify k převodu na řetězec kódovaný v Base64, a pak to můžete předat metodě CryptoJS.AES.decrypt k dešifrování. Pro získání šifrovaného textu typu řetězce je nejprve potřeba jej analyzovat pomocí hexadecimální metody var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedStr); Převést šifrovaný text do řetězců Base64 Pouze šifrovaný řetězec typu Base64 jej může dešifrovat var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr); Řetězec převedený do kódování v Base64 lze předat do metody CryptoJS.AES.decrypt pro dešifrovací operaci. Dešifrování var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, key, { režim: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); Po dešifrování CryptoJS je stále objektem a jeho převod na otevřený text je třeba převést na řetězec ve formátu Utf8. Po dešifrování je třeba řetězec otevřeného textu převést způsobem Utf8 var decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8); console.log(decryptedStr); 'aaaaa'
Zde je zdrojový kód implementace AES v .NET/C#:
|
Předchozí:[12306] Promiňte, protože příliš často obsluhujete cestující, zkuste to prosím zítra znovuDalší:C# implementuje mapování paměť procesů pro sdílení souborů
|