【问题标题】:Symmetric Encryption between .NET and Java.NET 和 Java 之间的对称加密
【发布时间】:2011-10-24 17:04:57
【问题描述】:

我正在使用第 3 方平台创建登录页面,我使用此特定平台是业务需求。

在他们的页面上,当调用我网站上的资源时,我可以加密数据并通过请求参数将其发送到我的服务器。这是通过 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 端不需要。我需要在 java 端指定与默认 .NET 输出匹配的标准迭代次数吗?

【问题讨论】:

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

标签: java .net encryption aes encryption-symmetric


【解决方案1】:

这完全取决于如何使用加密的不同部分/参数。

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

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

由于您同时提供盐和静脉注射,我想盐不是静脉注射。在 .Net 中没有处理 Salt 的标准方法。据我所知,盐主要用于防止彩虹表和散列。我不知道 AES 中是否需要 Salt。

也许密码短语已使用盐进行哈希处理(您没有提供该方法)以获得 AES 密钥。

IV 不是秘密。最简单的方法是在加密数据前面加上 IV。看到加密数据的长度,不是这样的。

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

【讨论】:

  • '我不知道 AES 中是否需要盐'。也许我误解了它,但 AES 肯定和任何其他分组密码一样容易受到彩虹表的攻击?
  • 散列函数总是产生相同的字节数(散列)。一个唯一的哈希结果,可以从多个输入中返回。因此,哈希的结果集是有限的。如果你从这个集合中获取每个结果,你可以计算一个可能的输入。这样你就可以建立一个彩虹表。 (Salt 用于创建无限数量的结果)对于 AES,结果集的大小是无限的,因为每个输入都将解析为一个唯一的加密结果。
  • +1。 Dominic 需要询问他的业务合作伙伴(即提供第三方网站的合作伙伴)使用了哪种确切的算法组合。除了漫无目的的猜测之外,没有其他办法。
  • 我猜他们正在使用加盐哈希从密码短语中生成密钥,这就是加盐的地方。您可以通过传递 NULL 或意外值来探测它并从抛出的异常中查看堆栈跟踪。
【解决方案2】:

据我所知,导致问题的是迭代计数。在所有东西都相同(盐、IV、迭代)的情况下,.Net 实现生成与 Java 实现相同的输出。我认为您可能需要询问第 3 方他们正在使用哪些迭代

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 2018-02-04
    • 2011-01-10
    • 1970-01-01
    相关资源
    最近更新 更多