对称加密算法

10

我正在寻找一种安全的对称密钥加密算法,能够同时兼容JavaScript和Java。

我已经尝试实现了一种算法,但是遇到了一些编码问题。


2
“compatible”是什么意思? - hellectronic
我可以使用JavaScript进行加密,使用Java进行解密,反之亦然,而且不会出现编码问题。 - Diogo Cardoso
2
我想推荐你阅读《关于Unicode和字符集,每个软件开发人员绝对必须知道的绝对最低限度(无任何借口!)》(http://www.joelonsoftware.com/articles/Unicode.html)。 - hellectronic
你遇到了什么问题? - Nayuki
@NayukiMinase 我能够在 JavaScript 和 Java 上正确加密和解密,但当我尝试在 JavaScript 中加密并在 Java 中解密,或者反过来时,有些文本无法正确解密。 - Diogo Cardoso
显示剩余2条评论
4个回答

32
你不应该使用JavaScript进行加密,尤其是在客户端开放被篡改的情况下, 而且没有 具有密码学安全性的随机数生成器

我曾经尝试过实现一个,但遇到了一些编码问题。

你试图编写自己的加密算法?这违反了安全领域所坚守的一切原则。实际上,解释加密工作原理的真正教程,会非常担心人们由于不理解其中的数学原理而弄乱事情,我曾经在其中看到过这种情况:

enter image description here

如果你不理解加密,例如,“什么是具有密码学安全性的伪随机数生成器”以及常见的攻击方式,那么你就不应该去做。

如果你不理解侧信道攻击等内容,那么你也不应该去做。

如果你不理解加密的内容,并且至少读过两本相关书籍,那么你没有必要去实现它。

加密并不是一个神奇的黑匣子,即使在不触碰任何打包解决方案中的代码的情况下,很容易出错。

那你应该做什么呢?忘记JS加密吧。我知道,我自己尝试过。这是浪费时间。从我的错误中吸取教训。

获取SSL证书,SSL是我们在服务器与客户端之间加密传输消息的最佳方式。它几乎是最安全的。如果你面对能够击败SSL的对手,相信我,你的基于JS的加密也已经被破解了。

一旦它到达服务器,就可以进行加密以确保其不会被篡改。其他任何方式都是浪费时间。

此外,请阅读这些书籍:

![这个是免费的][4] [![这个是收费的][5]][5] (来源: [schneier.com](https://www.schneier.com/images/book-ce-150w.jpg))

然后当你理解它们后,回来对我大喊大叫,告诉我为什么我错了,不理解在客户端上需要JS来进行加密。


3

有一个JS写的出色的DES算法实现(同样支持3DES),我经常使用。周一我会在办公室上传链接并准备好。在通过base64编码传输后,这个算法可以与.Net/Mono(内置)、Java(内置)和PHP(mcrypt)完美配合使用。

找到了链接,但两个都失效了:http://www.shopable.co.uk/des.htmlhttp://www.netdealing.com。我已经将其上传至 http://pastebin.com/KbRsWKJY


1
在大学里,他们教我DES,但现在它很容易被解密了... AES应该没问题,但我不认为JavaScript能处理这样的事情。 - Francesco Belladonna
2
DES由于遭受到暴力破解攻击而变得容易被破译,但DESede则不是那么容易破解的。AES比DESede实现更快,所以如果JavaScript可以处理DESede,它肯定可以处理AES-128。仅在旧版本实现中使用DESede(或者如果您找不到其他库并且了解一些弱点,例如小块大小、弱密钥、密钥中的奇偶校验位等)。 - Maarten Bodewes
1
让我澄清一下:指向JS代码并不意味着我盲目地支持在客户端上不加批判地使用(3)DES。但是我认为使用JS加密可以作为深度防御中有意义的一层。所以我会在我认为有意义的地方使用它。 - Eugen Rieck

1

这个页面有CTR模式,可在Java中使用。我建议使用128位密钥,否则可能会遇到Java出口政策对更大密钥大小的限制问题。

这里有一个页面,使用了一些非常有用的加密方法,包括密码加密技术和带完整性检查和认证的密码。不过,您可能需要在Java上使用弹性城堡库来匹配它们。

有很多JavaScript库,但是任何一个都会存在字符编码问题。因此,请确保在JavaScript端和Java端使用相同的编码方式。快速查找告诉我JavaScript在内部使用UTF-16,但请勿纠缠于此。

最后,不要在家里尝试这个,库已经存在,请使用它们(特别是如果它们提到测试和/或官方测试向量)。


我在哪里可以找到使用Bouncy Castle的Java AES实现? - Diogo Cardoso
Bouncy Castle库实现了JCE/JCA提供程序。因此,大多数功能都添加到Java本身的加密API中。您可以通过使用例如Cipher.getInstance("algo/mode/padding", "BC")来访问弹性实现;但是只有在将提供程序添加到Security类之后才能这样做。您还可以直接访问安全功能的较低级别的BC实现。 - Maarten Bodewes
这两个示例是否兼容? JavaScript: http://www.movable-type.co.uk/scripts/aes.html; Java: http://java.sun.com/developer/technicalArticles/Security/AES/AES_v1.html - Diogo Cardoso
不是的,在Java中,“AES”被翻译为“AES/ECB/PKCS5Padding”。你需要“AES/CTR/NoPadding”。 - Maarten Bodewes
我尝试使用BouncyCastle解密消息,在查看了几个示例后,我编写了这个方法http://ideone.com/s4XQV(基于TEA算法方法),但我一直在收到以下异常信息:“main”org.bouncycastle.crypto.DataLengthException:解密中的最后一个块不完整,位于org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher.doFinal(Unknown Source)。 - Diogo Cardoso

0
就像其他答案所说,如果您不必使用JavaScript进行加密,请避免使用它。但是,在某些情况下,使用JavaScript进行加密是有一定合理性的。
当您需要时,我建议使用这个库:https://keybase.io/triplesec/
它比另一个答案中提到的DES更安全。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接