NET和Java之间的对称加密
我正在使用第三方平台创建登录页,这是我使用此特定平台的业务需求 在他们的页面上,我可以加密数据,并在调用站点上的资源时通过请求参数将其发送到服务器。这是通过AES对称加密完成的 我需要指定密码、salt(必须是十六进制值)和初始化向量(但必须是16个字符) 他们的后端是一个.NET平台。我之所以知道这一点,是因为如果我指定的IV比预期的长,则基本异常是:NET和Java之间的对称加密,java,.net,encryption,aes,encryption-symmetric,Java,.net,Encryption,Aes,Encryption Symmetric,我正在使用第三方平台创建登录页,这是我使用此特定平台的业务需求 在他们的页面上,我可以加密数据,并在调用站点上的资源时通过请求参数将其发送到服务器。这是通过AES对称加密完成的 我需要指定密码、salt(必须是十六进制值)和初始化向量(但必须是16个字符) 他们的后端是一个.NET平台。我之所以知道这一点,是因为如果我指定的IV比预期的长,则基本异常是: System.Security.Cryptography.Cryptography异常:指定的初始化向量(IV)与此算法的块大小不匹配。 来源
System.Security.Cryptography.Cryptography异常:指定的初始化向量(IV)与此算法的块大小不匹配。
来源:mscorlib
因此,例如,在其一端,我指定:
EncryptSymmetric(“你好世界”、“AES”、“P4ssw0rD”、“00010203040506070809”、“000102030405060708090A0B0C0D0E0F”)
其中输入分别为:纯文本、算法、通行短语、salt和IV
我得到值:eg/t9NIMnxmh412jTGCCeQ==
如果我尝试使用JCE或BouncyCastle提供程序对其进行解密(相同的算法、密码短语、salt和IV,经过1000次迭代):2rrdhwpkgrenw8hkg1dsa==
,这是完全不同的
关于如何解密AES,我在网上看过许多不同的Java示例。其中一个演示如下:
如何解密使用密码短语salt和IV的AES对称加密,这是由Java平台上的.NET framework生成的
如果我可以在java端生成相同的签名并进行比较(如果这里真正生成的是散列),那么我不一定需要解密加密字符串的内容
我在生产中使用JDK1.5,所以我需要使用1.5来实现这一点
作为旁注,Java中的许多示例都需要在Java端指定重复计数,而不是在.NET端。是否需要在java端指定与默认.NET输出匹配的标准迭代次数。据我所知,是迭代次数导致了问题。在所有事情都相同(salt、IV、迭代)的情况下,.Net实现生成与Java实现相同的输出。我认为您可能需要询问第三方他们使用的迭代次数,这完全取决于加密的不同部分/参数是如何使用的 AES用于加密字节。因此需要将字符串转换为字节数组。因此,您需要知道用于转换字符串的编码。(UTF7,UTF8,…) AES中的密钥有一些固定大小。因此,您需要知道如何从密码短语转换为具有正确位大小的AES密钥 由于您同时提供了salt和IV,我想salt不是IV。在.Net中没有处理salt的标准方法。据我记忆所及,salt主要用于防止彩虹表和散列。我不知道AES中是否需要盐 可能密码短语是用salt散列的(您没有提供该方法),以获得AES密钥 静脉注射不是秘密。最简单的方法是在加密数据前面加上IV。从加密数据的长度来看,情况并非如此
我不认为你对.Net的不熟悉是这里的问题。您需要知道加密的实现者做出了什么决定,才能将参数转换为加密字符串。因为不管编程语言如何,它都应该解密为相同的值。。。你试过用C#而不是Java来解密它吗?用另一种语言构建解密代码可能有助于找到任何实现差异。我不是C#程序员,所以我不知道从哪里开始。我只是在尝试与其他平台交互。你可以使用任何其他语言来尝试,只要它有一个支持AES的加密API。另一种想法是,可能问题在于源机器和目标机器上的明文编码不同?例如UTF-8与UTF-16。“我不知道AES中是否需要盐”。也许我误解了这一点,但肯定AES和其他分组密码一样容易受到彩虹表的攻击?哈希函数总是产生相同的字节数(哈希)。可以从多个输入返回一个唯一的哈希结果。因此,散列的结果集是有限的。如果从该集合中获取每个结果,则可以计算可能的输入。这样你可以建立一个彩虹表。(Salt用于创建无限多的结果)对于AES,结果集的大小是无限的,因为每个输入将解析为一个唯一的加密结果。+1。Dominic需要询问其业务合作伙伴(即提供第三方站点的合作伙伴)使用了哪种精确的算法组合。除了漫无目的的猜测之外,没有其他方法可以解决这个问题。我猜他们正在使用salt散列从密码短语生成密钥,这就是salt的作用。您可能能够通过传递NULL或意外值来探测它,并从引发的异常中查看堆栈跟踪。