Javascript AES加密


109

是否有可用的Java AES 256位加密库?


这是使用crypto-js进行AES加密所需要的<script src =“ cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/… > <script> var cryptoAES = CryptoJS.AES.encrypt (“ Message”,“ Passphrase”);解密的var = CryptoJS.AES.decrypt(encryptedAES.toString(),“ Passphrase”); console.log(“ Encrypted:”,encryptionAES.toString()); console.log( “解密:”,decrypted.toString(CryptoJS.enc.Utf8)); </ script>
Hari Das

Answers:


66

JSAES是JavaScript中AES的强大实现。 http://point-at-infinity.org/jsaes/


32
JSAES是根据GNU GPL许可的-因此,它不适用于某些项目。
罗伯特

11
这是现在非常有用的,功能丰富的code.google.com/p/crypto-js
大卫Kierans

2
@HappyDeveloper好吧,不。不要为此怪罪许可证。作者选择了错误的许可证,因为GPL不适合于图书馆。
inta 2013年

4
它“免费使用”,但是如果您要根据GPL以外的其他标准发布最终产品,则不能使用它。
柯蒂斯2014年

3
JSAES是一个很好的起点,但是它只能用于加密16个字节的数据。如果要加密更大的数据块,则必须自己扩展它以实现初始化矢量,加密模式(CBC或其他...),填充。
Paolo 2015年

35

这是一个使用slowAES 的演示页面

slowAES易于使用。合理设计。合理的OO包装。支持旋钮和控制杆,例如IV和加密模式。与.NET / C#的良好兼容性。这个名字是嘲讽的。之所以称为“ 慢速 AES”,是因为它不是在C ++中实现的。但是在我的测试中,它并不慢。

它缺少ECB模式。我猜也缺少CTR模式,尽管您可以在ECB模式下轻松构建一个CTR模式。

它仅专注于加密。,做了很好的互补类RFC2898兼容的基于口令的密钥导出,在Javascript中,是可以从Anandam。这对库可与类似的.NET类一起很好地工作。良好的互操作性。但是,与SlowAES相比,JavaScript PBKDF2 在生成密钥时明显比Rfc2898DeriveBytes类慢。

从技术上讲,它具有良好的互操作性也就不足为奇了,但对我而言,关键是SlowAES采用的模型既熟悉又易于使用。我发现其他一些用于AES的Javascript库很难理解和使用。例如,在其中一些我找不到设置IV或模式(CBC,ECB等)的地方。事情不是我期望的那样。SlowAES不是那样的。这些属性是我所期望的正确的位置。熟悉Java和.NET加密编程模型后,对我来说很容易上手。

Anandam的PBKDF2并没有达到这个水平。它仅支持对DeriveBytes函数的单次调用,因此,如果您需要从密码中派生密钥和IV,则该库将无法正常工作。稍作修改,就可以达到此目的。

编辑:我整理了一个SlowAES和Anandam PBKDF2的修改版本打包到Windows脚本组件中的示例。将此AES与密码派生的密钥一起使用,可以很好地与.NET RijndaelManaged类互操作。

EDIT2演示页面显示了如何从网页使用此AES加密。使用.NET支持的相同输入(iv,键,模式等),可以与.NET Rijndael类进行良好的互操作。您可以执行“查看源代码”以获取该页面的javascript。

EDIT3
最近添加了:Javascript Cryptography被认为是有害的。值得一读。



1
我看到一个有效的用例-HTML 5应用程序,其中所有文件都存储在本地。如果本地文件可以被劫持,那么在任何情况下您都注定要失败;-)。
Nux 2012年

8
关于edit3链接,它只是一篇文章的废话。它的一半陈述完全是错误的!
mmm 2012年

2
可以通过让用户移动鼠标并输入密钥作为真正的随机生成器来解决随机密钥问题。
mmm 2012年

2
演示页面的链接似乎已断开。
肖恩

26

在我对AES加密的搜索中,我发现了一些Standford学生。声称那里最快。支持CCM,OCB,GCM和块加密。 http://crypto.stanford.edu/sjcl/


多数民众赞成在我在说什么!
mmm 2012年

5
缺少文档,并且很难使用。您如何更改密钥长度?我在文档中搜寻,无法在合理的时间内弄清楚。同样,当您加密某些东西时,您会得到一个返回的键-值对数组,但是文档似乎无法解释这些。我最终使用了可移动类型库。
CpnCrunch

而且这不是异步的,因此,如果您要使用AES-CBC加密或解密更长的字符串,那么它将阻止UI
rsz


10

这篇文章现在很老了,但是crypto-js可能现在是最完整的javascript加密库。

加密JS是用JavaScript实现的密码算法的集合。它包括以下密码:AES-128,AES-192,AES-256,DES,三重DES,Rabbit,RC4,RC4Drop和哈希表:MD5,RIPEMD-160,SHA-1,SHA-256,SHA-512,SHA -3,具有224、256、384或512位。

您可能需要查看他们的快速入门指南,该指南也是以下node.js端口的参考。

node-cryptojs-aescrypto-js的node.js端口


1
不幸的是,缺少文档。它似乎只有一个“快速入门”指南。完整的文档在哪里?它说它支持多种密钥长度,但是没有有关如何做到这一点的文档。
CpnCrunch

@CpnCrunch:完整的API文档不是在线的,但是代码是完整的Javadoc api注释。您可以生成它。阅读cipher-core.js源代码上的注释,即可找到密码的密钥大小和密码的IV大小。
2014年

很奇怪,当我加密和解密回来时,文本是不同的
OMGPOP 2014年

由于使用openssl而存在一些冲突
Vlad

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与使用AES以及公钥和私钥RSA的google app引擎托管的python服务器通信的示例。

我虽然会通过链接将其包含在此处,以防它对需要完成同一件事的其他人有用。

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

7

从我自己的经验来看,asmcrypto.js在JavaScript中提供了最快的AES实现(尤其是在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)

编辑:网页加密API现在大多数浏览器中实现,如果你关心性能应作为首要的解决方案。请注意,IE11实施了该标准的较早版本,没有使用Promise。

一些示例可以在这里找到:


使用CryptoJS可以达到大约8 MiB / s的速度。想知道这将如何执行。
Lodewijk 2014年


3

尝试asmcrypto.js-确实非常快。

PS:我是作者,可以回答您的问题。我也很高兴得到一些反馈:)


asmcrypto.js很好,但是在IE10上效果不佳。有时会使浏览器挂起超过1分钟,或至少45秒。另外,我不明白,为什么您需要替换全局Math函数?有很多使用此库的库。
2014年

2
您能否评论一下如何确定其正常工作?IOW:您如何知道自己正确实施了AES?
Lodewijk 2014年

IE10的性能很差,因为它根本没有优化asm.js。它还具有一些不同的JIT模式。使代码在IE中运行良好也使其在Chrome和FF中发挥作用。假设我有正确的选择。关于Math.random进行了长时间的讨论。简而言之,这种防止原始Math.random输出泄漏的需求(理论上讲可能会降低PRNG的安全性)。
vibornoff 2014年



1

如果您尝试使用javascript以避免使用SSL,请再三考虑。有很多中途措施,但是只有 SSL提供安全的通信。Javascript加密库可以帮助抵御某些攻击,但不能抵御真正的中间人攻击。

如果您要在自定义域中为Google App Engine寻找SSL,请访问wwwizer.com

以下文章介绍了如何使用javascript创建尝试安全通信以及如何将其弄错: 使用JavaScript加密模块而不是SSL / HTTPS


1
不知道为什么这会被淘汰,因为任何想到实施javascript加密的人都至少需要考虑这一点。已投票。
Jules

使用客户端加密来避免SSL是一个古老的观点,有些人说反对它:实际上,它可以为HTTPS增加安全性,避免被动攻击,或在下载的应用程序和浏览器扩展中使用。我只是看到它曾经被错误地使用过(我的大学,但是他们已经解决了),并且多次被正确地使用过(例如,cryptocat)。
古斯塔沃·罗德里格斯



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.