我正在使用 3rd 方平台来创建登录页面,这是我使用这个特定平台的业务需求。
在他们的页面上,当调用我网站上的资源时,我可以加密数据并通过请求参数将其发送到我的服务器。这是通过 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==
这是完全不同的。
我在网上查看了许多关于如何解密 AES 的不同 Java 示例。一个这样的演示如下:http: //blogs.msdn.com/b/dotnetinterop/archive/2005/01/24/java-and-net-aes-crypto-interop.aspx
如何解密使用密码短语、salt 和 IV(由 Java 平台上的 .NET 框架生成)的 AES 对称加密?
如果我可以在 java 端生成相同的签名并进行比较(如果事实证明这里真正生成的是哈希),我不一定需要能够解密加密字符串的内容。
我在生产中使用 JDK 1.5,所以我需要使用 1.5 来执行此操作。
作为旁注,Java 中的许多示例需要在 java 端指定重复计数,但在 .NET 端不需要。是否有我需要在与默认 .NET 输出匹配的 java 端指定的标准迭代次数。