2017-05-17 1 views
1

이제 Java에 부호없는 바이트가 없다는 것을 알았지 만,이 문제를 해결할 방법이 확실하지 않습니다. java에서 SHA256 해시를 구현하려고하는데 메시지를 512 비트로 변환하는 중입니다. 나머지 = 7 결과 INT는 128이지만,이 자바 바이트에 로그인 그래서 바이트 대신의 0xF0의 0x80으로 될 경우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); 

따라서 키 명령은 마지막 행이다. Java에서 어떻게 이것을 수행 할 수 있습니까?

누구든지이 부분을 구현하는 방법에 대한 아이디어가 있으면 알려 주시기 바랍니다.

+1

128은 왜 '0xF0'입니까? – khelwood

+0

똑같이'rest'는 0부터 7까지의 숫자 여야합니다. 모두 양수이며'byte' 범위 안에 들어갑니다. 나는 너에게 또 다른 문제가 있다고 생각한다. – markspace

+4

단지 기록 용입니다. 이것은 학습 목적을위한 것입니까? 당신은 자신의 암호를 구현하는 것이 현실 세계에서 가장 나쁜 생각 일 가능성이 가장 높습니다. – GhostCat

답변

1

메시지가 바이트로 구성된다는 가정에서 시작하여 패딩은 항상 8 비트의 mupltiple, 일명 바이트로 작동합니다. 이것은 가장 중요한 패드 비트가 메시지 다음의 첫 번째 패딩 바이트의 비트 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 바이트 (0 패딩이어야 함)로 이어지는 특별한 경우를 포착하기 위해 예비 패딩 길이로 (64 - 나머지)를 계산 한 후 다시 취합니다.

바이트 단위의 패딩 길이를 알고 나면 패딩 = 0이 캐치됩니다. 다른 경우에는 메시지 길이가 증가합니다 (0x00 바이트로 Arrays.copyOf가 자동으로이를 수행함). 그런 다음 첫 번째 패딩 바이트가 0x80으로 대체되고 패딩 된 메시지가 이제 64 바이트 길이의 배수가되도록 보장됩니다.