簡體   English   中英

使用 .NET 創建復制 Java 代碼的 Base 64 字節數組

[英]Using .NET to create a Base 64 byte array replicating Java code

對於工作中的項目,我需要將字符串轉換為字節數組,然后可以將其輸入 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 方面進行。 如果這是不可能的,我需要與我們的互聯網安全人員一起開始一個完整的過程來更改代碼,這是我不期待的頭痛。

C# 中的字節默認是無符號的,因為它們傾向於表示原始二進制數據,而不是實際數字。 如果您想將字節視為有符號數字,則可以使用sbyte類型。

在 Java 中,signed 是所有數字的默認值,並且沒有 unsigned 替代,原因我不知道(如果你有可靠的來源,請隨時發表評論)。

您可以通過將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 位解釋為無符號或有符號值感興趣,請閱讀二進制補碼表示。

因此,這不是您的程序不正確的原因。 繼續調試,如果出現其他問題,請隨時提出另一個問題。

根據對原始帖子的評論,這是預期的行為,不應成為我更大問題的原因。 我會再寫一篇文章來描述我在解密時遇到的更大問題。 感謝那些評論的人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM