2011-10-24 44 views
3

我正在使用第三方平台创建登录页面,这是我使用此特定平台的业务需求。.NET和Java之间的对称加密

在我们的网站上调用资源时,我们可以在其页面上加密数据并通过请求参数将其发送到我的服务器。这是通过AES对称加密完成的。

我需要指定一个密码,salt(它必须是一个十六进制值)和一个初始化向量(但是是16个字符)。

他们的后端是一个.NET平台。我知道这是因为如果我指定的IV长于预计潜在的例外是:

System.Security.Cryptography.CryptographicException: Specified initialization vector (IV) does not match the block size for this algorithm. Source: 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

如何解密使用由Java平台上的.NET框架生成的密码短语salt和IV的AES对称加密?

我不一定需要能够解密加密字符串的内容,如果我可以在java端生成相同的签名并比较(如果结果是真正生成的是哈希)。

我在生产中使用JDK 1.5,因此我需要使用1.5来完成此操作。作为一个方面说明,Java中的很多示例需要在java端指定重复计数,但不在.NET端。是否有我需要在java端指定的标准迭代次数与默认的.NET输出相匹配。

+0

因为无论编程语言如何,它都应该解密为相同的值......您是否尝试用C#而不是Java解密?用另一种语言构建解密代码可能仅仅有助于查找任何实施差异。 –

+0

我不是C#程序员,所以我不知道从哪里开始。我只是想与这个平台互动。 – Dominic

+0

您可以使用任何其他语言来尝试此操作,只要它具有支持AES的加密API即可。另一个想法,也许问题是源机器和目标机器上的纯文本的不同编码?例如。 UTF-8与UTF-16。 –

回答

2

这一切都取决于如何使用加密的不同部分/参数。

AES用于加密字节。所以你需要将字符串转换为字节数组。所以你需要知道用于转换字符串的编码。 (UTF7,UTF8,...)。

AES中的密钥有一些固定的大小。所以你需要知道,如何使用正确的比特大小从密码到AES密钥。

既然你提供了盐和IV,我猜盐不是IV。在.Net中处理Salt没有标准的方法。据我记得,盐主要用来防止彩虹桌和哈希。 AES中盐的需求对我来说是未知的。

也许密码被哈希(你没有提供该方法)与盐来获得AES密钥。

四是不是秘密。最简单的方法是用IV预先加密数据。看到加密数据的长度,情况并非如此。

我不认为你对.NET的不熟悉是这里的问题。您需要知道加密的实施者做出的决定,从您的参数到加密的字符串。

+0

'我不知道AES中盐的需求'。也许我误解了它,但是AES确实和其他分组密码一样容易受到彩虹表的攻击? –

+0

散列函数总是导致相同数量的字节(散列)。一个独特的散列结果可以从多个输入中返回。所以有一组散列结果。如果你从这个集合中得到每个结果,你可以计算一个可能的输入。这样你可以建立一个彩虹桌。 (Salt用于创建无限数量的结果)对于AES,结果集的大小无限大,因为每个输入都会解析为一个唯一的加密结果。 – GvS

+1

+1。多米尼克需要问他的商业伙伴(即提供第三方网站的商业伙伴)使用了哪一种精确的算法组合。除了漫无目的的猜测之外,没有办法解决这个问题。 –

1

就我所见,它是导致问题的迭代计数。在所有事情都一样的情况下(salt,IV,迭代),.Net实现产生与Java实现相同的输出。我想你可能需要问第三方他们正在使用什么迭代