对于正在工作的项目,我需要将字符串转换为字节数组,然后可以将其输入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方面进行。如果那不可能,那么我需要与我们的互联网安全人员一起启动整个过程,以更改该代码,这是我不希望看到的头疼问题。
您可以通过将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表示形式。因此,这不是程序不正确的原因。进行调试,如果有其他问题,请随时问另一个问题。