Шифрування AES Javascript [закрито]


109

Чи є в Javascript бібліотека для шифрування 256-бітних AES?


Ось що вам потрібно для шифрування AES за допомогою crypto-js <script src = " cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/… > <script> var encryptedAES = CryptoJS.AES.encrypt ("Повідомлення", "Passphrase"); var decrypted = CryptoJS.AES.decrypt (encryptedAES.toString (), "Passphrase"); console.log ("Зашифровано:", encryptedAES.toString ()); console.log ( "Розшифровано:", decrypted.toString (CryptoJS.enc.Utf8)); </script>
Харі Дас

Відповіді:


66

JSAES - це потужна реалізація AES в JavaScript. http://point-at-infinity.org/jsaes/


32
JSAES ліцензується згідно з GNU GPL - тому він не застосовується для деяких проектів.
Роберт

11
Зараз це дуже корисно і багатофункціонально code.google.com/p/crypto-js
David Kierans

2
@HappyDeveloper Ну, ні. Не звинувачуйте в цьому ліцензію. Автор обрав неправильну ліцензію, оскільки GPL не підходить для бібліотек.
інта

4
Це "безкоштовно для використання", але ви не можете використовувати його, якщо ви хочете випустити отриманий продукт під чимось іншим, ніж GPL.
Кертіс

3
JSAES - хороша відправна точка, але її можна використовувати лише для шифрування 16 байт даних. Якщо ви хочете зашифрувати більший блок даних, вам доведеться розширити його самостійно, щоб реалізувати вектор інтіалізації, режим шифрування (CBC або інше ...), доповнення.
Паоло

35

Ось демонстраційна сторінка, яка використовує slowAES.

slowAES був простий у використанні. Логічно розроблений. Розумна упаковка OO. Підтримує ручки та важелі, такі як режим IV та шифрування. Хороша сумісність з .NET / C #. Назва - язик у щоці; його називають " повільним AES", оскільки він не реалізований в C ++. Але в моїх тестах це було не непрактично повільно.

У ньому відсутній режим ECB. Також не вистачає режиму CTR, хоча ви могли б створити один досить легко, даючи режим ECB, я думаю.

Він орієнтований виключно на шифрування. Приємний додатковий клас, який робить виведення ключів на основі пароля RFC2898 , в Javascript, доступний від Anandam . Ця пара бібліотек добре працює з аналогічними класами .NET. Хороший інтероп. Хоча, на відміну від SlowAES, Javascript PBKDF2 помітно повільніше, ніж клас Rfc2898DeriveBytes при генерації ключів.

Не дивно, що технічно є хороший інтероп, але ключовим моментом для мене стала модель, прийнята SlowAES, звична та проста у використанні. Я знайшов деякі інші бібліотеки Javascript для AES важко зрозуміти та використовувати. Наприклад, у деяких з них я не міг знайти місця для встановлення IV або режиму (CBC, ECB тощо). Речі були не там, де я очікував їх. SlowAES був не таким. Властивості були там, де я очікував їх. Мені було легко підібрати, ознайомившись із моделями криптопрограмування Java та .NET.

Анабадам PBKDF2 виявився не зовсім на цьому рівні. Він підтримував лише один виклик функції DeriveBytes, тож якщо вам потрібно отримати і ключ, і IV з пароля, ця бібліотека не працюватиме без змін. Деяка незначна модифікація, і вона працює просто для цієї мети.

EDIT : Я поставив разом приклад пакування SlowAES і модифіковану версію Anandam в PBKDF2 в компоненти сценаріїв Windows. Використання цього AES за допомогою ключа, отриманого паролем, демонструє хорошу взаємодію з класом .NET RijndaelManaged.

EDIT2 : на демонстраційній сторінці показано, як використовувати це шифрування AES з веб-сторінки. Використовуючи ті самі входи (iv, ключ, режим тощо), які підтримуються в .NET, ви добре взаємодієте з класом .NET Rijndael. Ви можете зробити "джерело перегляду", щоб отримати javascript для цієї сторінки.

EDIT3
пізнє доповнення: Криптографія Javascript вважається шкідливою. Варто прочитаного.



1
Я бачу один дійсний випадок використання - додаток HTML 5, у якому всі файли зберігаються локально. Якщо локальні файли можуть бути викрадені, то ваш приречений у будь-якому випадку ;-).
Nux

8
про посилання edit3, це лайно статті ... половина його тверджень повністю хибна!
ммм

2
Проблему з випадковими ключами можна вирішити, якщо користувач переміщає мишу та вводить ключі як справжній генератор випадкових випадків.
ммм

2
Здається, посилання на демонстраційну сторінку порушено.
Шон

26

У своїх пошуках шифрування AES я знайшов це у деяких студентів Стендфорда. Претендує на те, що найшвидший там. Підтримує шифрування CCM, OCB, GCM та Block. http://crypto.stanford.edu/sjcl/


ось що я говорю про!
ммм

5
Документації бракує, і її важко використовувати. Як ви змінюєте довжину ключа? Я полював навколо документів і не зміг розібратися в розумний час. Крім того, коли ви шифруєте щось, ви отримуєте масив повернених пар ключових значень, але документи, здається, не пояснюють це. Я в кінцевому рахунку використовував бібліотеку рухомих типів.
CpnCrunch

І це не асинхронізація, тому якщо ви шифруєте або розшифровуєте якусь довшу рядок, наприклад, з AES-CBC, вона блокує інтерфейс користувача
rsz

12

Гугл "JavaScript AES" знайшов кілька прикладів. Перший, що з’явився, покликаний пояснити алгоритм, а також запропонувати рішення:

Сценарії рухомого типу: AES


1
Я не міг зрозуміти, як встановити IV у цій бібліотеці. Крім того, це не дуже ОО.
Чесо

Еквівалент IV в лічильному режимі - це не поняття. Ця реалізація була переформульована на більшу кількість OO. Він включає лише режим лічильника (CTR).
ChrisV

Це працює досить добре, за винятком того, що він не має жодного режиму ECB.
CpnCrunch

10

Ця публікація тепер стара, але криптовалюта може бути найповнішою бібліотекою шифрування javascript.

CryptoJS - це сукупність криптографічних алгоритмів, реалізованих у JavaScript. До неї відносяться такі цифри: AES-128, AES-192, AES-256, DES, Triple DES, Кролик, RC4, RC4Drop та хешири: MD5, RIPEMD-160, SHA-1, SHA-256, SHA-512, SHA -3 з 224, 256, 384 або 512 бітами.

Ви можете переглянути їх посібник із швидкого запуску, який також є посиланням на наступний порт node.js.

node-cryptojs-aes - порт node.js з крипто-js


1
На жаль, документації не вистачає. Здається, лише керівництво "швидкого початку". Де повна документація? Він говорить, що підтримує декілька ключових завдань, але жодної документації, як це зробити.
CpnCrunch

@CpnCrunch: повний документ API не в режимі он-лайн, але код як повний коментар api javadoc api. І ви можете генерувати це. Прочитайте коментарі до джерела cipher-core.js, ви знайдете розмір ключа шифру та розмір шифру IV.
marcz

дивно, коли я шифрую і розшифровую назад, тексти різні
OMGPOP

Виникають деякі конфлікти через використання openssl
Влад

9

Нещодавно у мене виникла потреба виконати деяку сумісність шифрування / дешифрування між javascript та python.

Зокрема ...

1) Використання AES для шифрування в JavaScript та розшифрування в python (Google App Engine) 2) Використання RSA для шифрування в JavaScript та розшифрування в python (Google App Engine) 3) Використання pycrypto

Я виявив, що в Інтернеті плаває багато і багато різних версій RSA та AES, і всі вони відрізняються своїм підходом, але я не знайшов хорошого прикладу взаємодії з javascript та python.

Врешті-решт мені вдалося зібрати разом щось, що відповідало моїм потребам після безлічі спроб та помилок.

Так чи інакше, я привів приклад js / webapp, що спілкувався з двигуном додатка google, на якому розміщений сервер python, який використовує AES та відкриті ключі та приватні ключі RSA.

Я хоч би включив його сюди за посиланням, якщо це буде корисно іншим, кому потрібно виконати те саме.

http://www.ipowow.com/files/aesrsademo.tar.gz

і перегляньте демонстрацію на rsa-aes-demo DOT appspot DOT com

редагувати: подивіться на вихід консолі браузера, а також перегляньте джерело, щоб отримати підказки та корисні повідомлення про те, що відбувається в демонстраційній версії

редагувати: оновлено дуже старе і неіснуюче посилання на джерело, на яке зараз вказують

https://sestertii.com/files/aesrsademo.tar.gz


1
Дякую ТАКЕ велике за це! Я не міг за все життя змусити своїх Jaes-AES поговорити зі своїм пітоном-асом.
Спайк

1
Я цілу ніч намагався (з pycrypto та іншими) зробити те, що ваш код допоміг мені виконати за 10 хвилин. Дуже дякую!
Ремі Ванхергем

1
З будь-якої причини я змусив RSA працювати легко, але AES - це королівський біль. Дякую за це !!!
швидкісний літак

1
посилання ... не знайдено!
машинобудівний вирок

7

Судячи з власного досвіду, asmcrypto.js забезпечує найшвидшу реалізацію AES в JavaScript (особливо в Firefox, оскільки він може повністю використовувати там asm.js).

З readme:

Chrome/31.0
SHA256: 51 MiB/s (9 times faster than SJCL and CryptoJS)
AES-CBC: 47 MiB/s (13 times faster than CryptoJS and 20 times faster than SJCL)

Firefox/26.0
SHA256: 144 MiB/s (5 times faster than CryptoJS and 20 times faster than SJCL)
AES-CBC: 81 MiB/s (3 times faster than CryptoJS and 8 times faster than SJCL)

Edit: Web Cryptography API тепер реалізована в більшості браузерів і повинні бути використані в якості основного рішення , якщо ви дбаєте про продуктивність. Майте на увазі, що IE11 реалізував більш ранній проект версії стандарту, який не використовував обіцянки.

Деякі приклади можна знайти тут:


З CryptoJS я отримую близько 8 Мбіт / с. Поцікавтеся, як це було б виконано
Lodewijk


3

Спробуйте asmcrypto.js - це дуже швидко.

PS: Я автор і можу відповісти на ваші запитання, якщо такі є. Також я буду радий отримати відгуки :)


asmcrypto.js приємно, але на IE10 він не працює добре. Іноді він зависає в браузері більше 1 хв, або принаймні 45 сек. Крім того, я не зрозумів, чому вам потрібно замінити глобальну математичну функцію? Є багато бібліотек, які використовують цю.
decho

2
Не могли б ви прокоментувати те, як ви впевнені, що він працює належним чином? IOW: Звідки ви знаєте, що ви правильно реалізували AES?
Lodewijk

Продуктивність IE10 погана, оскільки вона зовсім не оптимізує asm.js. Крім того, він має трохи інші JIT-моделі. Здійснення роботи коду в IE також робить його смоктанням у Chrome та FF. Припустимо, у мене був правильний вибір. Стосовно Math.random тривала дискусія . Коротше кажучи, ця потреба у запобіганні витоку вихідного випуску Math. випадкових (що теоретично може погіршити безпеку PRNG).
vibornoff



1

Якщо ви намагаєтеся використовувати javascript, щоб не використовувати SSL, подумайте ще раз. Існує багато заходів на півдорозі, але тільки SSL забезпечує безпечне спілкування. Бібліотеки шифрування Javascript можуть допомогти проти певного набору атак, але не є справжньою атакою "людина-в-середині".

Якщо ви шукаєте SSL для двигуна додатків google на спеціальному домені, перегляньте сторінку wwwizer.com .

У наступному дописі пояснюється, як створити спробу захищеного зв’язку з javascript та як його неправильно: Використовуйте модуль шифрування JavaScript замість SSL / HTTPS


1
Не впевнений, чому це було зведено до забуття, оскільки це дуже хороший момент, який потребує хоча б кожен, хто думає про реалізацію кодування JavaScript. Отримано.
Жуль

Використання крипто-клієнтів на стороні клієнта для уникнення SSL - це стара точка, яку деякі люди кажуть, що йде проти неї: адже вона може додати безпеку HTTPS, уникаючи пасивних атак або використовуватись у завантажених програмах та розширеннях браузера. Я щойно бачив, як він використовується неправильно (мій коледж, але вони це вже виправили) і багато разів використовував правильно (cryptocat, як приклад).
Густаво Родрігес



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.