Cryptage Javascript AES [fermé]

109

Existe-t-il une bibliothèque disponible pour le cryptage AES 256 bits en Javascript?

codeur
la source
Voici ce dont vous avez besoin pour le chiffrement AES à l'aide de crypto-js <script src = " cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/… > <script> var encryptedAES = CryptoJS.AES.encrypt ("Message", "Passphrase"); var decrypted = CryptoJS.AES.decrypt (encryptedAES.toString (), "Passphrase"); console.log ("Encrypted:", encryptedAES.toString ()); console.log ( "Decrypted:", decrypted.toString (CryptoJS.enc.Utf8)); </script>
Hari Das

Réponses:

66

JSAES est une puissante implémentation d'AES en JavaScript. http://point-at-infinity.org/jsaes/

barre oblique inverse17
la source
32
JSAES est sous licence GNU GPL - il n'est donc pas utilisable pour certains projets.
Robert
11
Ceci est maintenant très utile et contient un code riche.google.com/p/crypto-js
David Kierans
2
@HappyDeveloper Eh bien, non. Ne blâmez pas la licence pour cela. L'auteur a choisi la mauvaise licence, car la GPL ne convient pas aux bibliothèques.
entre le
4
Il est "gratuit à utiliser", mais vous ne pouvez pas l'utiliser si vous souhaitez publier votre produit résultant sous autre chose que la GPL.
Curtis
3
JSAES est un bon point de départ mais il ne peut être utilisé que pour crypter 16 octets de données. Si vous souhaitez crypter un plus gros bloc de données, vous devez l'étendre vous-même pour implémenter le vecteur d'initialisation, le mode de cryptage (CBC ou autre ...), le remplissage.
Paolo
35

Voici une page de démonstration qui utilise slowAES.

slowAES était facile à utiliser. Conçu de manière logique. Emballage OO raisonnable. Prend en charge les boutons et les leviers comme IV et le mode de cryptage. Bonne compatibilité avec .NET / C #. Le nom est ironique; il est appelé " AES lent " car il n'est pas implémenté en C ++. Mais dans mes tests, ce n'était pas trop lent.

Il manque un mode ECB. Il manque également un mode CTR, bien que vous puissiez en créer un assez facilement avec un mode ECB, je suppose.

Il se concentre uniquement sur le cryptage. Une belle classe complémentaire qui fait la dérivation de clé basée sur un mot de passe conforme à la RFC2898, en Javascript, est disponible auprès d'Anandam . Cette paire de bibliothèques fonctionne bien avec les classes .NET analogues. Bonne interopérabilité. Cependant, contrairement à SlowAES, le Javascript PBKDF2 est sensiblement plus lent que le Rfc2898DeriveBytes classe lors de la génération de clés.

Il n'est pas surprenant que techniquement l'interopérabilité soit bonne, mais le point clé pour moi était que le modèle adopté par SlowAES est familier et facile à utiliser. J'ai trouvé que certaines des autres bibliothèques Javascript pour AES étaient difficiles à comprendre et à utiliser. Par exemple, dans certains d'entre eux, je n'ai pas pu trouver l'emplacement pour régler l'IV, ou le mode (CBC, ECB, etc.). Les choses n'étaient pas là où je m'attendais à ce qu'elles soient. SlowAES n'était pas comme ça. Les propriétés étaient exactement là où je m'attendais à ce qu'elles soient. C'était facile pour moi de comprendre, ayant été familier avec les modèles de programmation cryptographique Java et .NET.

Le PBKDF2 d'Anandam n'était pas tout à fait à ce niveau. Il n'a pris en charge qu'un seul appel à la fonction DeriveBytes, donc si vous devez dériver à la fois une clé et un IV d'un mot de passe, cette bibliothèque ne fonctionnera pas, inchangée. Une légère modification, et cela fonctionne très bien à cette fin.

EDIT : J'ai rassemblé un exemple de packaging SlowAES et une version modifiée du PBKDF2 d'Anandam dans les composants de script Windows. L'utilisation de cet AES avec une clé dérivée d'un mot de passe montre une bonne interaction avec la classe .NET RijndaelManaged.

EDIT2 : la page de démonstration montre comment utiliser ce cryptage AES à partir d'une page Web. L'utilisation des mêmes entrées (iv, clé, mode, etc.) prises en charge dans .NET vous donne une bonne interopérabilité avec la classe .NET Rijndael. Vous pouvez faire une "vue source" pour obtenir le javascript de cette page.

EDIT3
un ajout tardif: la cryptographie Javascript est considérée comme nuisible. Vaut la lecture.

Cheeso
la source
1
Je vois un cas d'utilisation valide - une application HTML 5 dans laquelle tous les fichiers sont stockés localement. Si les fichiers locaux peuvent être détournés, vous êtes condamné dans tous les cas ;-).
Nux
8
à propos du lien edit3, c'est une merde d'un article ... la moitié de ses déclarations sont complètement fausses!
mmm
2
Le problème des touches aléatoires peut être résolu en demandant à l'utilisateur de déplacer la souris et de saisir des touches comme un véritable générateur aléatoire.
mmm
2
Le lien vers la page de démonstration semble rompu.
Sean
26

Dans mes recherches de cryptage AES, j'ai trouvé cela chez certains étudiants de Standford. Prétend être le plus rapide là-bas. Prend en charge le cryptage CCM, OCB, GCM et Block. http://crypto.stanford.edu/sjcl/

Danny C
la source
c'est ce dont je parle!
mmm
5
La documentation fait défaut et elle est difficile à utiliser. Comment changez-vous la longueur de la clé? J'ai cherché dans les documents et je n'ai pas pu le comprendre dans un délai raisonnable. De plus, lorsque vous cryptez quelque chose, vous obtenez un tableau de paires clé-valeur renvoyées, mais la documentation ne semble pas les expliquer. J'ai fini par utiliser la bibliothèque de types mobiles.
CpnCrunch
Et ce n'est pas asynchrone, donc si vous cryptez ou décryptez une chaîne plus longue, par exemple avec AES-CBC, cela bloque l'interface utilisateur
rsz
12

Google "JavaScript AES" a trouvé plusieurs exemples. Le premier qui est apparu est conçu pour expliquer l'algorithme et fournir une solution:

Scripts de type mobile: AES

Samir Talwar
la source
1
Je ne savais pas comment installer l'IV dans cette bibliothèque. Ce n'est pas non plus très OO.
Cheeso
L'équivalent de l'IV en mode compteur est le nonce. Cette implémentation a été reformulée pour être plus OO. Il n'inclut que le mode de fonctionnement du compteur (CTR).
ChrisV
Cela fonctionne plutôt bien, sauf qu'il n'a pas de mode ECB.
CpnCrunch
10

Ce message est maintenant vieux, mais le crypto-js , est peut-être maintenant la bibliothèque de cryptage javascript la plus complète.

CryptoJS est une collection d'algorithmes cryptographiques implémentés en JavaScript. Il comprend les cyphers suivants: AES-128, AES-192, AES-256, DES, Triple DES, Rabbit, RC4, RC4Drop et les hachages: MD5, RIPEMD-160, SHA-1, SHA-256, SHA-512, SHA -3 avec 224, 256, 384 ou 512 bits.

Vous voudrez peut-être consulter leur guide de démarrage rapide qui est également la référence pour le port node.js suivant.

node-cryptojs-aes est un port node.js de crypto-js

Marcz
la source
1
Malheureusement, la documentation fait défaut. Il semble seulement avoir un guide de «démarrage rapide». Où est la documentation complète? Il dit qu'il prend en charge plusieurs longueurs de clé, mais aucune documentation sur la façon de le faire.
CpnCrunch
@CpnCrunch: la documentation complète de l'API n'est pas en ligne, mais le code sous forme de commentaires complets sur l'API javadoc. Et vous pouvez le générer. Lisez les commentaires sur la source de cipher-core.js.Vous trouverez la taille de la clé de chiffrement et la taille IV du chiffrement.
marcz
bizarre, quand je crypte et décrypte à nouveau, les textes sont différents
OMGPOP
Il y a quelques conflits en raison de l'utilisation d'OpenSl
Vlad
9

Récemment, j'ai eu le besoin d'effectuer une interopérabilité de cryptage / décryptage entre javascript et python.

Plus précisément...

1) Utiliser AES pour crypter en javascript et décrypter en python (Google App Engine) 2) Utiliser RSA pour crypter en javascript et décrypter en python (Google App Engine) 3) Utiliser pycrypto

J'ai trouvé beaucoup de versions différentes de RSA et AES flottant sur le Web et elles étaient toutes différentes dans leur approche, mais je n'ai pas trouvé un bon exemple d'interopérabilité de bout en bout javascript et python.

Finalement, j'ai réussi à bricoler quelque chose qui convenait à mes besoins après de nombreux essais et erreurs.

Quoi qu'il en soit, j'ai donné un exemple de js / webapp parlant à un serveur python hébergé par le moteur d'application Google qui utilise AES et des éléments de clé publique et de clé privée RSA.

Je pensais que je l'inclurais ici par lien au cas où cela serait utile à d'autres qui auraient besoin d'accomplir la même chose.

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

et voir la démo sur rsa-aes-demo DOT appspot DOT com

modifier: regardez la sortie de la console du navigateur et affichez également la source pour obtenir des conseils et des messages utiles sur ce qui se passe dans le démo

edit: lien très ancien et obsolète mis à jour vers la source pour pointer maintenant vers

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

David Kierans
la source
1
Merci beaucoup pour cela! Je n'ai pas pu pour la vie de moi obtenir mes javascript aes pour parler à mes python aes.
Spike
1
J'ai essayé toute la nuit (avec pycrypto et d'autres) de faire ce que votre code m'a aidé à accomplir en 10 minutes. Merci beaucoup!
Remy Vanherweghem
1
Pour une raison quelconque, RSA fonctionne facilement, mais AES est une douleur royale. Merci pour ça!!!
speedplane
1
le lien ... n'est pas trouvé!
machineaddict
7

À en juger par ma propre expérience, asmcrypto.js fournit l'implémentation AES la plus rapide en JavaScript (en particulier dans Firefox car il peut pleinement exploiter asm.js).

Depuis le 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: L' API de cryptographie Web est désormais implémentée dans la plupart des navigateurs et doit être utilisée comme solution principale si vous vous souciez des performances. Sachez que IE11 a implémenté une version préliminaire de la norme qui n'utilisait pas de promesses.

Quelques exemples peuvent être trouvés ici:

Joël Richard
la source
J'obtiens environ 8 Mio / s avec CryptoJS. Je me demande comment cela fonctionnerait.
Lodewijk
3

Essayez asmcrypto.js - c'est vraiment rapide.

PS: Je suis auteur et je peux répondre à vos questions le cas échéant. Je serais également heureux de recevoir des commentaires :)

vibornoff
la source
asmcrypto.js est bien, mais sur IE10, cela ne fonctionne pas bien. il bloque le navigateur pendant plus d'une minute parfois, ou au moins 45 secondes. De plus, je n'ai pas compris, pourquoi vous devez remplacer la fonction mathématique globale? il existe de nombreuses bibliothèques qui utilisent celle-ci.
decho le
2
Pouvez-vous nous dire comment vous êtes sûr que cela fonctionne correctement? IOW: Comment savez-vous que vous avez correctement implémenté AES?
Lodewijk
Les performances d'IE10 sont médiocres car elles n'optimisent pas du tout asm.js. En outre, il a des modèles JIT un peu différents. Faire en sorte que le code fonctionne bien dans IE le rend également nul dans Chrome et FF. Supposons que j'avais le bon choix. En ce qui concerne Math.random, il y a eu une longue discussion . En bref, ce besoin de prévention des fuites de sortie brutes Math.random (qui en théorie peuvent dégrader la sécurité PRNG).
vibornoff
1

Si vous essayez d'utiliser javascript pour éviter d'utiliser SSL, détrompez-vous. Il existe de nombreuses mesures à mi-chemin, mais seul SSL fournit une communication sécurisée. Les bibliothèques de chiffrement Javascript peuvent aider contre un certain ensemble d'attaques, mais pas contre une véritable attaque de type "man-in-the-middle".

Si vous recherchez SSL pour le moteur d'application Google sur un domaine personnalisé, jetez un œil à wwwizer.com .

Le post suivant explique comment créer une tentative de communication sécurisée avec javascript et comment se tromper: utilisez le module de cryptage JavaScript au lieu de SSL / HTTPS

speedplane
la source
1
Je ne sais pas pourquoi cela a été rejeté dans l'oubli, car c'est un très bon point que quiconque envisage d'implémenter un cryptage javascript doit au moins prendre en compte. J'ai voté pour.
Jules
Utiliser la crypto côté client pour éviter SSL est un vieux point que certaines personnes disent aller à l'encontre: en fait, il peut ajouter de la sécurité au HTTPS, en évitant les attaques passives, ou être utilisé dans des applications téléchargées et des extensions de navigateur. J'ai juste vu une fois qu'il était mal utilisé (mon collège, mais ils l'ont déjà corrigé) et plusieurs fois utilisé correctement (cryptocat, par exemple).
Gustavo Rodrigues