2017-05-17 75 views
1

現在我明白了java沒有無符號字節,但我不知道如何解決這個如果不是。 我想在java中實現SHA256散列,並且我正在處理將消息轉換爲512位。Java整數/雙無符號字節

int l = bytes.length; //total amount of bytes in the original message 
int k = 0; 
while((l+1+k) % 512 != 448) { 
     k++; 
} 
//k is the total amount of 0's to be padded 
int rest = k % 8; //get the amount of 0's to be added in the byte with the 1 
byte tmp =(byte) Math.pow(2, rest); 

所以關鍵是指令中的最後一行,如果其餘= 7所得int是128,但字節在Java簽署並因此變得字節0x80的代替0XF0。 我如何在Java中實現這一點?

如果任何人有關於如何實現這個部分的想法請讓我知道。

+1

爲什麼128會是'0xF0'? – khelwood

+0

正確的,「休息」應該是一個從0到7的數字,它們都已經是正數,並且適合在「字節」範圍內。我想你可能有另一個問題。 – markspace

+4

只是爲了記錄:這是爲了學習的目的?你知道在現實世界中實現你自己的密碼學通常是非常糟糕的主意嗎? – GhostCat

回答

1

從假設你的消息包含字節開始,填充總是作爲8位的字節,也就是字節。這確保了最重要的填充位總是位於消息之後的第一填充字節的位7中,因此填充(如果有的話)始終由0x80開始,隨後按需要填充0x00。

這可以以非常簡單的方式來實現:

public static byte[] padMsg(byte[] rawMsg) { 
    int rawLen = rawMsg.length; 
    int padLen = (64 - (rawLen & 0x3F)) & 0x3F; 
    if (padLen == 0) 
     return rawMsg; 
    // all extra bytes in padded msg are zeros. 
    byte[] paddedMsg = Arrays.copyOf(rawMsg, rawLen + padLen); 
    // ensure topmost pad bit is a one 
    paddedMsg[rawLen] = (byte) 0x80; 
    return paddedMsg; 
} 

這需要消息長度,並得到的餘數。 2的冪的餘數(在這種情況下爲64)最有效的方法是通過(power-1)進行簡單掩碼和屏蔽,這就是代碼中的0x3F來自(= 64 - 1)的地方。 在計算(64-餘數)作爲prelimary填充長度後,再次採用餘數來捕獲餘數爲0的特殊情況,導致錯誤的填充長度爲64字節(應爲0填充)。

一旦以字節爲單位的填充長度已知,就會捕獲大小寫padding = 0。在任何其他情況下,消息長度會增加(0x00字節,Arrays.copyOf會自動執行此操作)。然後將第一個填充字節替換爲0x80,並返回現在保證爲64字節長的倍數的填充消息。

相關問題