.NET和Java之间的对称加密

3
我正在使用第三方平台创建落地页,出于业务需求,必须使用此特定平台。
在他们的页面上,我可以通过请求参数加密数据并将其发送到我的服务器。这是通过AES对称加密完成的。
我需要指定密码、盐(必须是十六进制值)和初始化向量(必须是16个字符)。
他们的后端是.NET平台。我知道这一点,因为如果我指定的IV比它期望的长度长,底层异常会是:
System.Security.Cryptography.CryptographicException:指定的初始化向量(IV)与此算法的块大小不匹配。 来源:mscorlib
例如,在他们的端上,我指定:
EncryptSymmetric("Hello World","AES","P4ssw0rD","00010203040506070809", "000102030405060708090A0B0C0D0E0F")
其中输入分别是:明文、算法、密码短语、盐和IV。
我得到的值是:eg/t9NIMnxmh412jTGCCeQ==
如果我尝试使用JCE或BouncyCastle提供程序在本地解密此内容(使用相同的算法、密码短语、盐和IV,进行1000次迭代),我得到的结果是:2rrRdHwpKGRenw8HKG1dsA==,完全不同。
我查看了许多不同的Java示例,以了解如何解密AES。其中一种演示如下:http://blogs.msdn.com/b/dotnetinterop/archive/2005/01/24/java-and-net-aes-crypto-interop.aspx 我如何解密.NET框架在Java平台上生成的使用密码短语、盐和IV的AES对称加密?
如果我能在Java端生成相同的签名并进行比较(如果这里实际生成的是哈希值),则不一定需要能够解密加密字符串的内容。
我正在生产中使用JDK 1.5,因此需要使用1.5来完成此操作。
作为一份附注,许多 Java 示例需要在 Java 端指定重复计数,但在 .NET 端则不需。我需要在 Java 端指定符合默认 .NET 输出的标准迭代次数吗?

由于它应该解密为相同的值,无论使用哪种编程语言...您是否尝试使用C#而不是Java进行解密?在另一种语言中构建解密代码可能有助于定位任何实现差异。 - S.L. Barth
我不是C#程序员,所以我不知道从哪里开始。我只是试图与这个其他平台进行交互。 - Dominic
你可以使用任何其他编程语言来尝试此操作,只要它有支持AES的加密API。另一个想法是,也许问题是源机器和目标机器上明文使用了不同的编码方式?例如UTF-8与UTF-16。 - S.L. Barth
2个回答

2
这完全取决于加密的不同部分/参数的使用方式。
AES用于加密字节。因此,您需要将字符串转换为字节数组。因此,您需要知道用于转换字符串的编码方式(UTF7、UTF8等)。
AES中的密钥有一些固定的大小。因此,您需要知道如何从口令来生成具有正确位数的AES密钥。
由于您提供了盐和IV,我认为盐不是IV。在.Net中没有标准处理盐的方法。据我所知,盐主要用于保护免受彩虹表和哈希攻击。我不知道在AES中需要盐。
也许口令与盐一起进行哈希(您没有提供该方法)以获得AES密钥。
IV不是秘密。最简单的方法是在加密数据前面添加IV。鉴于加密数据的长度,这不是情况。
我不认为您对.Net不熟悉是问题的原因。您需要知道加密实现者做出了哪些决策,才能从您的参数中得到加密字符串。

对我来说,AES中需要盐的原因并不清楚。也许是我误解了它,但肯定和其他块加密一样,AES会受到彩虹表攻击的威胁吧? - S.L. Barth
哈希函数总是产生相同数量的字节(哈希)。一个唯一的哈希结果可以从多个输入返回。因此,哈希有一个有限的结果集。如果您从这个集合中取出每个结果,就可以计算出可能的输入。这样,您就可以构建一个彩虹表。(盐用于创建无限数量的结果)对于AES,结果集的大小是无限的,因为每个输入都将解析为一个唯一的加密结果。 - GvS
1
+1. Dominic 需要询问他的商业伙伴(即提供第三方网站的伙伴)使用了哪种确切的算法组合。除了胡乱猜测之外,没有其他方法。 - Paŭlo Ebermann
我猜他们是使用加盐哈希函数从密码短语中生成密钥,这就是盐的作用。你可以通过传递NULL或意外值来探测它,并查看抛出的异常的堆栈跟踪。 - Yaur

1
据我所见,迭代次数是导致问题的原因。在所有条件相同的情况下(盐、IV、迭代次数),.Net实现生成的输出与Java实现相同。我认为您可能需要询问第三方他们正在使用哪些迭代次数。

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