Шифрование Javascript AES [закрыто]

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 («Сообщение», «Кодовая фраза»); var decrypted = CryptoJS.AES.decrypt (encryptedAES.toString (), «Passphrase»); console.log («Encrypted:», encryptedAES.toString ()); console.log ( «Decrypted:», decrypted.toString (CryptoJS.enc.Utf8)); </script>
Хари Дас

Ответы:

66

JSAES - мощная реализация AES на JavaScript. http://point-at-infinity.org/jsaes/

backslash17
источник
32
JSAES находится под лицензией GNU GPL, поэтому его нельзя использовать для некоторых проектов.
Роберт
11
Теперь это очень полезно и многофункционально code.google.com/p/crypto-js
Дэвид Киранс,
2
@HappyDeveloper Ну нет. Не вините за это лицензию. Автор выбрал неправильную лицензию, так как GPL не подходит для библиотек.
inta
4
Это «бесплатное использование», но вы не можете использовать его, если хотите выпустить полученный продукт под какой-либо другой лицензией, кроме GPL.
Curtis
3
JSAES - хорошая отправная точка, но с его помощью можно зашифровать только 16 байт данных. Если вы хотите зашифровать больший блок данных, вам нужно расширить его самостоятельно, чтобы реализовать вектор инициализации, режим шифрования (CBC или другой ...), заполнение.
Паоло
35

Вот демонстрационная страница , использующая slowAES.

slowAES было легко использовать. Логично оформленный. Разумная оригинальная упаковка. Поддерживает ручки и рычаги, такие как 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 из пароля, эта библиотека не будет работать без изменений. Небольшая модификация, и для этой цели он отлично работает.

РЕДАКТИРОВАТЬ : Я собрал пример упаковки SlowAES и модифицированной версии PBKDF2 Анандама в компоненты сценария Windows. Использование этого AES с ключом, полученным из пароля, показывает хорошее взаимодействие с классом .NET RijndaelManaged.

EDIT2 : демонстрационная страница показывает, как использовать это шифрование AES с веб-страницы. Использование тех же входных параметров (iv, key, mode и т. Д.), Поддерживаемых в .NET, дает вам хорошее взаимодействие с классом .NET Rijndael. Вы можете сделать "просмотр исходного кода", чтобы получить javascript для этой страницы.

EDIT3
- позднее добавление: криптография Javascript считается вредной. Стоит прочитать.

Cheeso
источник
1
Я вижу один допустимый вариант использования - приложение HTML 5, в котором все файлы хранятся локально. Если локальные файлы могут быть взломаны, то вы в любом случае обречены ;-).
Nux
8
насчет ссылки edit3, это чушь статья ... половина ее утверждений полностью ложна!
mmm
2
Проблема случайного ключа может быть решена, если пользователь перемещает мышь и вводит ключи как истинный генератор случайных чисел.
mmm
2
Ссылка на демонстрационную страницу не работает.
Шон
26

В своих поисках шифрования AES я нашел это у некоторых студентов Стэндфорда. Утверждает, что он самый быстрый. Поддерживает CCM, OCB, GCM и блочное шифрование. http://crypto.stanford.edu/sjcl/

Дэнни С
источник
вот о чем я говорю!
mmm
5
Документация отсутствует, и ею сложно пользоваться. Как изменить длину ключа? Я поискал документы и не смог разобраться в разумные сроки. Также, когда вы что-то шифруете, вы получаете массив пар ключ-значение, но документация, похоже, не объясняет это. В итоге я использовал библиотеку подвижных типов.
CpnCrunch,
И это не асинхронно, поэтому, если вы шифруете или дешифруете более длинную строку, например, с помощью AES-CBC, тогда он блокирует пользовательский интерфейс
rsz
12

Погуглив "JavaScript AES" нашел несколько примеров. Первое, что появилось, призвано объяснить алгоритм, а также предложить решение:

Скрипты подвижного типа: AES

Самир Талвар
источник
1
Я не мог понять, как установить IV в этой библиотеке. Тоже не очень ОО.
Cheeso
Эквивалент IV в режиме счетчика - nonce. Эта реализация была переформулирована, чтобы стать больше объектно-ориентированной. Он включает только режим работы счетчика (CTR).
ChrisV 01
Это работает очень хорошо, за исключением того, что у него нет режима ECB.
CpnCrunch
10

Этот пост уже старый, но crypto-js , возможно, теперь самая полная библиотека шифрования javascript.

CryptoJS - это набор криптографических алгоритмов, реализованных на JavaScript. Он включает следующие шифры: AES-128, AES-192, AES-256, DES, Triple DES, Rabbit, RC4, RC4Drop и хешеры: MD5, RIPEMD-160, SHA-1, SHA-256, SHA-512, SHA. -3 с 224, 256, 384 или 512 битами.

Вы можете посмотреть их краткое руководство, которое также является справочником для следующего порта node.js.

node-cryptojs-aes - это порт node.js для crypto-js

Marcz
источник
1
К сожалению, документации нет. Это только похоже на руководство по быстрому запуску. Где полная документация? В нем говорится, что он поддерживает несколько длин ключей, но нет документации о том, как это сделать.
CpnCrunch,
@CpnCrunch: полный документ 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, разговаривающего с сервером python, размещенным на движке приложений Google, который использует 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
Спасибо тебе большое за это! Я не мог, хоть убей, заставить мой javascript aes разговаривать с моим python aes.
Спайк,
1
Я всю ночь пытался (с pycrypto и другими) сделать то, что ваш код помог мне сделать за 10 минут. Спасибо большое!
Реми Ванхервегем,
1
По какой-то причине мне удалось легко заставить RSA работать, но AES - королевская боль. Спасибо тебе за это!!!
Speedplane
1
ссылка ... не найдена!
machineaddict 08
7

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

Из ридми:

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 реализовал более раннюю черновую версию стандарта, в которой не использовались обещания.

Некоторые примеры можно найти здесь:

Джоэл Ричард
источник
Я получаю около 8 Мбайт / с с CryptoJS. Интересно, как это будет работать.
Lodewijk
3

Попробуйте asmcrypto.js - это очень быстро.

PS: Я автор и могу ответить на ваши вопросы, если они есть. Также был бы рад получить обратную связь :)

Vibornoff
источник
asmcrypto.js - это хорошо, но в IE10 он не работает. иногда браузер зависает более чем на 1 мин, или не менее 45 сек. Плюс, я не понял, зачем нужно заменять глобальную функцию Math? есть много библиотек, которые его используют.
Decho
2
Не могли бы вы прокомментировать, как вы уверены, что он работает правильно? IOW: Откуда вы знаете, что правильно реализовали AES?
Lodewijk
Производительность IE10 низкая из-за того, что он вообще не оптимизирует asm.js. Также он имеет несколько другие шаблоны JIT. Если заставить код работать в IE, то он плохо работает в Chrome и FF. Предположим, у меня был правильный выбор. По поводу Math.random было долгое обсуждение . Короче говоря, это необходимость предотвращения утечки необработанного вывода Math.random (что теоретически может ухудшить безопасность ГПСЧ).
vibornoff
1

Если вы пытаетесь использовать javascript, чтобы избежать использования SSL, подумайте еще раз. Есть много промежуточных мер, но только SSL обеспечивает безопасную связь. Библиотеки шифрования Javascript могут помочь против определенного набора атак, но не от настоящей атаки типа «человек посередине».

Если вы ищете SSL для движка приложений Google в личном домене, взгляните на wwwizer.com .

В следующем сообщении объясняется, как создать попытку безопасного соединения с javascript и как сделать это неправильно: используйте модуль шифрования JavaScript вместо SSL / HTTPS.

speedplane
источник
1
Не уверен, почему это было предано забвению, так как это очень хороший момент, который должен как минимум рассмотреть любой, кто думает о реализации шифрования javascript. Проголосовали.
Жюль
Использование криптографии на стороне клиента для обхода SSL - это старый момент, который, по мнению некоторых, идет против него: фактически он может повысить безопасность HTTPS, избежать пассивных атак или использоваться в загружаемых приложениях и расширениях браузера. Я просто видел, как однажды он использовался неправильно (мой колледж, но они уже исправили его) и много раз использовался правильно (например, криптокат).
Густаво Родригес,
1

Вот единственное решение, которое сработало для меня:

http://www.hanewin.net/encrypt/aes/aes.htm

Это довольно простой, но простой в использовании и, кажется, хорошо работает.

CpnCrunch
источник
Как вы на самом деле вызываете функцию шифрования и дешифрования?