2015-10-15 39 views
0

我需要使用Java的SecretKeySpec()與數字陣列超過127如何將無符號字節傳遞給SecretKeySpec()?

更大。如果我執行以下操作:

new byte[] { (byte)0xD9, (byte)0xDF, (byte)0x85 } 

的號碼來獲得轉換爲字節,他們會是負的。

我當然可以用0xFF&它們,並將它們保存在一個short陣列和保存自己的價值,但我不能給這個數組傳遞給SecretKeySpec(),因爲它僅僅接收bytes[]陣列。

任何想法?

+1

如果SecretKeySpec需要一個字節[],則必須假定它正確處理值> 127。你真正的問題是什麼? – matt

+0

寫這個:'new byte [] {0xD9,0xDF,0x85}'產生一個錯誤。它需要像這樣:'new byte [] {(byte)0xD9,(byte)0xDF,(byte)0x85}'。如果是這樣的話,那麼這些數字將被轉換爲有符號數字。所以我已經通過了一個錯誤的數組... –

+0

你不能有一個等於128的字節,因爲沒有無符號字節。所以SecretKeySpec必須相應地處理它。你爲什麼說它是錯誤的數組? – matt

回答

0

似乎沒有必要這樣做。 我用Java編寫了byte[]數組的簽名值,並且在C#中以無符號形式讀取它們(例如Java的-16在C#中讀取240)。但解密仍然有效。似乎這是在Rijndael算法中處理的。

0

這實際上只是一個渲染問題。 SecretKeySpec與字節數組一起工作,並且您在構造字節數組時沒有問題。唯一的問題是如何將大(> 127)整數表示爲java字節,或者等同於'217'作爲字節表示的意思。

你可以使用任何你想要的映射,但Java有一個很自然的選擇 - 一個整數轉換爲字節,使用強制,(byte)i,並轉換回,使用Byte.toUnsignedInt(b)。正如你所看到的,這恢復了原始值:

public static void main(String[] args) 
{ 
    for (int count = 0; count<256; count++){ 
     System.out.println(count+" : "+(byte)count+" => "+Byte.toUnsignedInt((byte)count)); 
    } 
} 
+0

問題是我傳遞給'SecretKeySpec()'什麼?從文檔中:*爲指定的密鑰數據和算法名稱創建一個新的SecretKeySpec *因此它對217號和-39號的工作方式會有所不同。我需要它在217 –

+0

上工作我看到*「這個類只對可以表示爲字節數組的原始密鑰有用......」*。而且我的例子中的數字不能表示爲一個字節數組,所以我猜這只是不可能的。 –

+0

你*可以*表示217作爲一個字節,唯一的問題是哪個字節,並且有一個自然的規範方法來做到這一點。另外,如果您試圖重現從另一個源創建的'SecretKeySpec',映射只是很重要的 - 您正在嘗試做什麼? – hugh

相關問題