使用.NET创建复制Java代码的基本64字节数组

使用.NET创建复制Java代码的基本64字节数组,java,c#,.net,encryption,core,Java,C#,.net,Encryption,Core,对于正在工作的项目,我需要将字符串转换为字节数组,然后将其输入AES/CBC/PKCS5解密算法。在本例中,我需要使用现有的Java代码来完成这项工作,并将其转换为.NET核心代码 Java代码中的第一步是这样一行: 字节[]decodedBytes=Base64.getDecoder.decode Utils.getBytesmasterKey 从我在谷歌搜索时发现的情况来看,C中的这一行应该复制了该功能 var masterKeyBytes=Convert.FromBase64Stringm

对于正在工作的项目,我需要将字符串转换为字节数组,然后将其输入AES/CBC/PKCS5解密算法。在本例中,我需要使用现有的Java代码来完成这项工作,并将其转换为.NET核心代码

Java代码中的第一步是这样一行:

字节[]decodedBytes=Base64.getDecoder.decode Utils.getBytesmasterKey

从我在谷歌搜索时发现的情况来看,C中的这一行应该复制了该功能

var masterKeyBytes=Convert.FromBase64StringmasterKey

它们返回非常相似的字节数组

c生成的数组的前10个字节是:68 163 160 50 213 109 12 103

Java生成的数组的前10个字节是:68-93-9650-4310912103

所以它们非常相似,但是Java数组有负数,c数组有相同的值,但是加了256

这些差异是否足以使以后的解密代码AES/CBC/PKCS5P在Java中添加密码,以及AES/CBC/PKCS7P在.NET Core中管理。我面临的最终问题是,Java代码返回解密值,而.NET Core代码返回垃圾。所以我逐行检查代码,试图找出输出中的差异,这是我第一次找到的


我无法控制Java代码,也无法编辑它,因此任何解决方案都应该只在.NET核心端。如果这是不可能的,我需要与我们的互联网安全人员开始一个完整的过程来更改代码,这是一个我并不期待的头痛问题。

默认情况下,C中的字节是无符号的,因为它们往往表示原始二进制数据,而不是实际的数字。如果要将字节视为有符号的数字,则有sbyte类型

在Java中,签名是所有数字的默认值,没有未签名的替代值,如果您有可靠的来源,请随意评论

通过将字节数组强制转换为sbyte数组,可以验证C中的值是否与Java中的值相同:

byte[]bytes=新字节[]{68163160,50213,109,12103}; foreach变量b(字节) { Console.WriteLinesbyte; } 印刷品:

68
-93
-96
50
-43
109
12
103
这与Java中的值相同

如果您对如何将相同的8位解释为无符号或有符号值感兴趣,请阅读有关表示的内容


因此,这不是您的程序不正确的原因。继续调试,如果出现其他问题,请随意提问。

根据对原始帖子的评论,这是预期的行为,不应成为我更大问题的原因。我将发表另一篇文章,描述我在解密方面遇到的更大问题。感谢您的评论。

Java没有无符号字节,因此您可以看到等效的8位有符号数字。这不太可能是问题的原因。这只是有符号值与无符号值之间的差异。它们是相同的值,只是显示方式不同,因为Java没有无符号值。数据是一样的,所以到目前为止一切都很好。好的,很酷,谢谢。我想我需要发布另一个关于代码其余部分的问题:它们在十六进制中是相同的!