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

问题描述 投票:0回答:2

对于正在工作的项目,我需要将字符串转换为字节数组,然后可以将其输入AES / CBC / PKCS5解密算法。在这种情况下,我需要采用可以完成工作的现有Java代码,然后将其转换为.NET Core代码。

Java代码中的第一步是此行:

byte[] decodedBytes = Base64.getDecoder().decode( Utils.getBytes(masterKey) );

根据我在谷歌搜索时发现的内容,C#中的这一行应该复制该功能。

var masterKeyBytes = Convert.FromBase64String(masterKey);

并且它们确实返回非常相似的字节数组。

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

Java生成的数组的前10个字节是:68 -93 -96 50 -43 109 12 103

因此它们非常相似,但是在Java数组具有负数的情况下,c#数组具有相同的值,但是添加了256。

这些差异足以触发以后的解密代码(Java中的AES / CBC / PKCS5Padding密码和.NET Core中的AES / CBC / PKCS7Padding AESManaged)我遇到的最终问题是Java代码返回解密后的代码。值,我的.NET Core代码返回垃圾。因此,我逐行浏览了代码以尝试查找输出差异,这是我遇到的第一个代码。

我无法控制Java代码,也无法对其进行编辑,因此任何解决方案都应仅在.NET Core方面进行。如果那不可能,那么我需要与我们的互联网安全人员一起启动整个过程,以更改该代码,这是我不希望看到的头疼问题。

java c# .net encryption core
2个回答
0
投票
在Java中,所有数字均默认使用带符号,由于我不知道的原因,没有其他无带符号的选择(如果您有可靠的消息来源,请随时发表评论)。

您可以通过将byte数组转换为sbyte数组来验证C#中的值与Java中的值相同:

byte[] bytes = new byte[] { 68, 163, 160, 50, 213, 109, 12, 103 }; foreach (var b in bytes) { Console.WriteLine((sbyte) b); }

打印:

68
-93
-96
50
-43
109
12
103

与您在Java中的值相同。

如果您对如何将相同的8位解释为无符号或有符号值感兴趣,请阅读two's complement表示形式。

因此,这不是程序不正确的原因。进行调试,如果有其他问题,请随时问另一个问题。


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.