|
|
Opublikowano 07.10.2017 17:39:00
|
|
|
|

Ostatnio użyłem funkcji logowania po symulacji, hasło logowania jest szyfrowane przez CryptoJS aes, a potem chcę napisać odpowiadający mu algorytm w C# Wprowadzenie do algorytmu szyfrowania AES:
Zaawansowany Standard szyfrowania (skrót: AES), znany również jako szyfrowanie Rijndael w kryptografii, to standard szyfrowania blokowego przyjęty przez rząd federalny USA. Standard ten został użyty jako zastępstwo oryginalnego DES i był analizowany oraz szeroko stosowany na całym świecie. Po pięcioletnim procesie selekcji, Zaawansowany Standard Kryptograficzny został opublikowany przez National Institute of Standards and Technology (NIST) w FIPS PUB 197 w dniu 26 listopada 2001 roku i stał się ważnym standardem 26 maja 2002 roku. W 2006 roku Advanced Encryption Standard stał się jednym z najpopularniejszych algorytmów kryptografii klucza symetrycznego. Algorytm js wygląda następująco:
Szukałem internetowych stron z szyfrowaniem AES w Internecie i wyniki różnią się od moich własnych zasad – AES wydaje się mieć wiele trybów, a widziałem też inne powody z Internetu
Zacznij od przygotowania tekstu jawnego i klucza: var plaintText = 'aaaaa'; Tekst jawny var keyStr = 'bbbbbbbbbbbbbbbb'; Zazwyczaj kluczem jest struna Według oficjalnej dokumentacji ze strony internetowej, metoda AES obsługuje AES-128, AES-192 i AES-256, a metoda szyfrowania stosowana w procesie szyfrowania zależy od rodzaju klucza przychodzącego, w przeciwnym razie będzie szyfrowany zgodnie z AES-256. CryptoJS obsługuje AES-128, AES-192 oraz AES-256. Wybierze wariant na podstawie wielkości klucza, który wprowadzasz. Jeśli użyjesz hasła, wygeneruje on klucz 256-bitowy. Ponieważ Java jest podana według 128bit, ale jest to ciąg znaków, musi być konwertowany na 128bit na frontendzie. Na początku myślałem, że użycie CryptoJS.enc.Hex.parse poprawnie przekonwertuje ją na klucz 128-bitowy. Ale poza tym... Po wielu próbach musisz użyć metody CryptoJS.enc.Utf8.parse, aby przekonwertować klucz na 128-bitowy. Cóż, ponieważ mówi się, że to wielokrotne próby, to powód nie jest znany i zostanie on później bardziej szczegółowo zbadany. Przed użyciem tonacji typu struny musisz przeanalizować z uft8, zanim będziesz mógł jej użyć var key = CryptoJS.enc.Utf8.parse(keyStr); Ponieważ backend korzysta z PKCS5Padding, ale przy użyciu CryptoJS nie ma żadnego offsetu. Szyfrowanie var encryptedData = CryptoJS.AES.encrypt(plaintText, key, { tryb: CryptoJS.mode.ECB, nadkład: CryptoJS.pad.Pkcs7 }); Ponieważ szyfrogram generowany przez CryptoJS jest obiektem, jeśli przekonwertujesz go bezpośrednio na ciąg zakodowany w Base64, atrybut encryptedData.ciphertext jest konwertowany na ciąg to format wymagany przez backend. var encryptedBase64Str = encryptedData.toString(); Wyjście: 'RJcecVhTqCHHnlibzTypzuDvG8kjWC+ot8JuxWVdLgY=' console.log(encryptedBase64Str); Musisz przeczytać ciphertext.toString() na encryptedData, aby uzyskać ten sam szyfrogram co Java var encryptedStr = encryptedData.ciphertext.toString(); Wyjście: '44971e715853a821c79e589bcd3ca9cee0ef1bc923582fa8b7c26ec5655d2e06' console.log(encryptedStr); Ponieważ zaszyfrowany tekst jest ciągiem 128 bitów, podczas deszyfrowania musi zostać przekonwertowany do formatu kodowanego w Base64. Następnie musisz użyć metody CryptoJS.enc.Hex.parse, aby przekonwertować to na szesnastkę, a następnie użyć CryptoJS.enc.Base64.stringify, aby przekonwertować to na ciąg zakodowany w Base64, a następnie możesz przekazać to metodzie CryptoJS.AES.decrypt, aby go odszyfrować. Aby uzyskać szyfrogram typu ciągu, najpierw trzeba go przeanalizować metodą heksadecimalną var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedStr); Przekonwertowanie tekstu szyfrowanego na ciągi Base64 Tylko szyfrogram typu Base64 może go odszyfrować var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr); Ciąg znaków przekonwertowanych na kodowanie Base64 może być przekazany do metody CryptoJS.AES.decrypt do operacji deszyfrowania. Deszyfrowanie var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, key, { tryb: CryptoJS.mode.ECB, nadkład: CryptoJS.pad.Pkcs7 }); Po odszyfrowaniu CryptoJS nadal jest to obiekt, a przekształcenie go w tekst jawny musi zostać przekształcone w ciąg w formacie Utf8. Po odszyfrowaniu ciąg tekstu jawnego musi zostać przeniesiony w sposób Utf8 var decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8); console.log(deszyfrowanyStr); 'aaaaa'
Oto kod źródłowy implementacji AES w .NET/C#:
|
Poprzedni:[12306] Przepraszam, bo zbyt często obsługujesz pasażera, proszę spróbuj jutroNastępny:C# implementuje mapowanie pamięci plikowej (file share) pamięci
|