Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NET和Java之间的对称加密_Java_.net_Encryption_Aes_Encryption Symmetric - Fatal编程技术网

NET和Java之间的对称加密

NET和Java之间的对称加密,java,.net,encryption,aes,encryption-symmetric,Java,.net,Encryption,Aes,Encryption Symmetric,我正在使用第三方平台创建登录页,这是我使用此特定平台的业务需求 在他们的页面上,我可以加密数据,并在调用站点上的资源时通过请求参数将其发送到服务器。这是通过AES对称加密完成的 我需要指定密码、salt(必须是十六进制值)和初始化向量(但必须是16个字符) 他们的后端是一个.NET平台。我之所以知道这一点,是因为如果我指定的IV比预期的长,则基本异常是: System.Security.Cryptography.Cryptography异常:指定的初始化向量(IV)与此算法的块大小不匹配。 来源

我正在使用第三方平台创建登录页,这是我使用此特定平台的业务需求

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

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

他们的后端是一个.NET平台。我之所以知道这一点,是因为如果我指定的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或意外值来探测它,并从引发的异常中查看堆栈跟踪。