|
|
Опубліковано 07.10.2017 17:39:00
|
|
|
|

Нещодавно я зробив функцію входу після симуляції, пароль для входу зашифрований CryptoJS aes, а потім я хочу написати відповідний алгоритм на C# Вступ до алгоритму шифрування AES:
Розширений стандарт шифрування (скорочено: AES), також відомий як шифрування Рейндаеля у криптографії, є стандартом блочного шифрування, прийнятим федеральним урядом США. Цей стандарт використовується для заміни оригінального DES і був проаналізований та широко застосований у всьому світі. Після п'ятирічного процесу відбору Розширений криптографічний стандарт був опублікований Національним інститутом стандартів і технологій (NIST) у FIPS PUB 197 26 листопада 2001 року і став чинним 26 травня 2002 року. У 2006 році Advanced Encryption Standard став одним із найпопулярніших алгоритмів для криптографії симетричного ключа. Алгоритм js виглядає так:
Я шукав онлайн-сайти з шифруванням AES в Інтернеті, і результати відрізняються від моїх власних шифрувань, AES, здається, має багато режимів, і я бачив знайомства інших людей з Інтернету
Почніть з підготовки відкритого тексту та ключа: var plaintText = 'ааа'; Відкритий текст var keyStr = 'bbbbbbbbbbbbbbbb'; Зазвичай ключ — це струна Згідно з офіційною документацією на сайті, метод AES підтримує AES-128, AES-192 та AES-256, а метод шифрування, що використовується в процесі шифрування, залежить від типу вхідного ключа, інакше він буде зашифрований відповідно до AES-256. CryptoJS підтримує AES-128, AES-192 та AES-256. Варіант вибирається за розміром ключа, який ви передаєте. Якщо ви використовуєте пароль, він генерує 256-бітний ключ. Оскільки Java задана за 128-бітною системою, але оскільки це рядок, її потрібно конвертувати у 128-бітну на фронтенді. Спочатку я думав, що використання CryptoJS.enc.Hex.parse правильно конвертує його у 128-бітний ключ. Але в іншому випадку... Після багатьох спроб потрібно використати метод CryptoJS.enc.Utf8.parse, щоб конвертувати ключ у 128-біт. Оскільки кажуть, що це кілька спроб, причина невідома, і це буде вивчено глибше пізніше. Перед тим, як використовувати тональність типу струнки, потрібно розібратися з uft8, перш ніж застосувати його var key = CryptoJS.enc.Utf8.parse(keyStr); Оскільки бекенд використовує PKCS5Padding, при використанні CryptoJS виявилося, що зміщення взагалі немає. Шифрування var encryptedData = CryptoJS.AES.encrypt(plaintText, key, { режим: CryptoJS.mode.ECB, заповнення: CryptoJS.pad.Pkcs7 }); Оскільки шифротекст, згенерований CryptoJS, є об'єктом, якщо ви конвертуєте його безпосередньо у рядок, закодований у Base64, атрибут на encryptedData.ciphertext конвертується у рядок — це формат, який вимагає бекенд. var encryptedBase64Str = encryptedData.toString(); Output: 'RJcecVhTqCHHnlibzTypzuDvG8kjWC+ot8JuxWVdLgY=' console.log(зашифровано Base64Str); Вам потрібно прочитати ciphertext.toString() на encryptedData, щоб отримати той самий шифротекст, що й Java var encryptedStr = encryptedData.ciphertext.toString(); Вихід: '44971e715853a821c79e589bcd3ca9cee0ef1bc923582fa8b7c26ec565d2e06' console.log(encryptedStr); Оскільки зашифрований шифротекст є 128-бітним рядком, його потрібно конвертувати у формат кодування Base64 під час розшифрування. Потім потрібно використати метод CryptoJS.enc.Hex.parse для конвертації у шістнадцятковий, потім CryptoJS.enc.Base64.stringify для конвертації у рядок, закодований у Base64, а потім передати його методу CryptoJS.AES.decrypt для розшифрування. Щоб отримати шифротекст рядкового типу, спочатку потрібно розбрати його методом Hex var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedStr); Конвертація шифротексту у рядки Base64 Лише рядковий шифротекст типу Base64 може його розшифрувати var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr); Рядок, конвертований у кодування Base64, може бути переданий у метод CryptoJS.AES.decrypt для операції дешифрування. Розшифрування var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, ключ, { режим: CryptoJS.mode.ECB, заповнення: CryptoJS.pad.Pkcs7 }); Після дешифрування CryptoJS він все ще є об'єктом, і для перетворення його у відкритий текст потрібно конвертувати у рядок у форматі Utf8. Після розшифрування рядок відкритого тексту потрібно транспонувати за способом Utf8 var decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8); console.log(розшифрована сила); 'Аа
Ось вихідний код реалізації AES у .NET/C#:
|
Попередній:[12306] Вибачте, бо ви занадто часто керуєте пасажиром, будь ласка, спробуйте знову завтраНаступний:C# реалізує відображення файлової пам'яті процесів
|