Accélération AES pour Java
Je veux crypter/décrypter beaucoup de petits (2-10 ko) les éléments de données. La performance est ok pour l'instant: Sur un Core2Duo, je reçois environ 90 Mo/s en AES256 (lors de l'utilisation de 2 threads). Mais j'ai peut-être besoin de l'améliorer dans l'avenir - ou au moins de réduire l'impact sur le CPU.
- Est-il possible d'utiliser dédié au chiffrement AES matériel avec Java (à l'aide de la JCE, ou peut-être une autre API)?
- Serait Java profiter des fonctionnalités du PROCESSEUR (SSE5?!), si j'obtiens un meilleur CPU?
- Ou est-il plus rapide de la JCE fournisseurs? (J'ai essayé SunJCE et BouncyCastle - pas de grande différence.)
- D'autres possibilités comprennent?
source d'informationauteur Chris Lercher
Vous devez vous connecter pour publier un commentaire.
La JVM ne sera pas, par elle-même, de profiter des fonctionnalités du PROCESSEUR lors de l'exécution de code qui se trouve être un chiffrement AES: reconnaître un code comme étant une mise en œuvre de l'AES est au-delà de la capacité de l'compilateur JIT. À l'utilisation de matériel spécifique (par exemple, le "Cadenas" sur la VIA processeurs, ou le AES-NI instructions sur les nouveaux processeurs Intel), vous devez vous rendre, à un certain point, par le biais de "code natif".
Éventuellement, un JCE fournisseur pourrait le faire pour vous. Je ne suis pas au courant de tout facilement disponibles JCE fournisseur qui comprend optimisé en code natif pour la norme AES (il y avait un projet appelé Apache Jusmais il semble être au point mort et je ne sais pas son statut). Toutefois, il est concevable que SunJCE ne sera que dans une future version (mais avec Oracle achat Soleil et de la overfeaturism de OpenJDK 7, il est difficile de savoir quand la prochaine version de Java sera publié). Sinon, mordre la balle et utiliser du code natif vous-même. Code natif est invoquée par JNIet pour le natif AES code, un quartier populaire de la mise en œuvre est celui de la Brian Gladman. Lorsque vous obtenez un plus grand et plus récent processeur avec l'instruction AES-NI, remplacez le code natif avec un peu de code qui sait au sujet de ces instructions, comme Intel décrit.
En utilisant AES-128 au lieu de l'AES-256, vous devriez obtenir un +40% d'augmentation de vitesse. La rupture de l'AES-128 est actuellement au-delà de la technologie de l'Humanité, et devrait se maintenir au cours des prochaines décennies. Avez-vous vraiment besoin d'une clé de 256 bits AES ?
Vous pouvez bénéficier de l'amélioration des AES vitesses en utilisant SunPKCS11 fournisseur de sécurité avec mozilla nss bibliothèque.
Le programme d'installation est décrite à
Juste au cas où des gens courir dans cette. JAVA 8 est maintenant utilise AES-NI. Voir ceci: AES-NI intrinsèques activé par défaut?
Une simple recherche sur google d'identifier certains JCE fournisseurs qui prétendent que l'accélération matérielle Solaris Crypto Cadre. J'ai entendu même le point de rupture est 4K (ou sous le 4k, son plus rapide à exécuter à l'aide de la JVM java fournisseurs).
Je pourrais chercher à l'aide de la NSS mise en œuvre, il pourrait ont certaines optimisations du compilateur pour votre plate-forme et vous pouvez certainement construire à partir de la source avec eux activé); si je n'ai pas utilisé moi-même. Le gros avantage avec le matériel d'un fournisseur est probablement le fait que les touches peut être stockées dans le matériel d'une manière qui prend en charge les utiliser sans les exposer à l'OS.
Mise à jour: je devrais probablement mentionner que le Keyczar la source, a un aperçu utile (quelque part dans la source ou dans les environs docs) sur la réduction de la surcharge pour l'initialisation de l'algorithme de Chiffrement. Il a également fait exactement ce que vous voulez (voir l'Encryption), et semble mettre en œuvre asynchrone de chiffrement (à l'aide d'un pool de threads).
Je suggère également à l'aide de l'algorithme AES-128 plutôt que de 256. Si le code est faiblement couplé, et est encore dans les nombreuses années qu'il faut pour AES-128 pour devenir archaïque, je pense qu'il sera beaucoup plus facile de mettre à jour le chiffrement à ce point (lorsque le matériel sera plus puissant), plutôt que d'essayer d'optimiser les performances via le matériel maintenant.
Bien sûr, c'est en supposant qu'il est faiblement couplé 😀