2015-01-26 1 views
1

이 질문은 바이트 배열이 java에서 해시되기 전에 수행중인 작업에 대한 것입니다.해시하기 전에 Java 바이트 배열의 모든 0을 맨 앞에 놓는 이유

여러 srp 암호화 라이브러리에서 선행 0 바이트 (있는 경우)가 해시되기 전에 삭제되는 이유를 이해하려고합니다. 예

:이 탄력 성

/** 
* Return the passed in value as an unsigned byte array. 
* 
* @param value value to be converted. 
* @return a byte array without a leading zero byte if present in the signed encoding. 
*/ 
public static byte[] asUnsignedByteArray(int length, BigInteger value) 
{ 
    byte[] bytes = value.toByteArray(); 
    if (bytes.length == length) 
    { 
     return bytes; 
    } 

    int start = bytes[0] == 0 ? 1 : 0; 
    int count = bytes.length - start; 

    if (count > length) 
    { 
     throw new IllegalArgumentException("standard length exceeded for value"); 
    } 

    byte[] tmp = new byte[length]; 
    System.arraycopy(bytes, start, tmp, tmp.length - count, count); 
    return tmp; 
} 

에서 또는이 후광 SRP 내지 :

public static byte[] toUnsignedByteArray(final BigInteger bigInteger) { 

    byte[] bytes = bigInteger.toByteArray(); 
    byte[] result = toUnsignedByteArray(bytes); 

    // remove leading zero if any 
    if (bytes[0] == 0) { 

     byte[] tmp = new byte[bytes.length - 1]; 

     System.arraycopy(bytes, 1, tmp, 0, tmp.length); 

     return tmp; 
    } 
    return bytes; 
} 

구매로서는 기본적으로 제할 제로 선도. 그 라이브러리의 메소드는 "toUnsignedByteArray"라고하는데, 비록 선행 0을 없애면 왜 바이트 배열이 서명되지 않는지 이해할 수 없지만. 나는. 그것은 오직 0 바이트를 떨어 뜨린다. 다음 바이트는 음수 일 수있다. 즉, 다음 바이트는 빅 인디언에서 가장 왼쪽 바이트가되고, 바이트의 가장 왼쪽 비트는 바이트에 따라 설정되거나 해제 될 수있는 부호 비트이다. 만약 내가 바이트 배열의 구조를 올바르게 이해한다면 그 메소드들은 처음부터 "toUnsignedByteArray"에 호출되어서는 안된다. 그러나 가장 중요한 질문은 모든 것이 0 인 경우 0 바이트를 삭제해야하는 이유입니다.

다음은 srp rfc 5054 부록 A의 테스트 벡터의 예입니다. 우리는 A와 B에서 U를 계산합니다. 여기서 0 B의 바이트 우리는 다음과 같은 값을 얻을 것이다 바이트 배열로서 B를 인쇄하면 이진 즉 모두 제로 우연히

public static final B = new BigInteger("BD0C61512C692C0CB6D041FA01BB152D4916A1E77AF46AE105393011BAF38964DC46A0670DD125B95A981652236F99D9B681CBF87837EC996C6DA04453728610D0C6DDB58B318885D7D82C7F8DEB75CE7BD4FBAA37089E6F9C6059F388838E7A00030B331EB76840910440B1B27AAEAEEB4012B7D7665238A8E3FB004B117B58", 16); 

[0, -67, 12, 97, 81, 44, 105 , 44, 12, -74, -48, 65, -6, 1, -69, 21, 45, 73, 22, -95, -25,122, -12, 106, 48, 17, -70, -13, -119, 100, -36, 70, -96, 103, 13, -47, 37, -71, 90, -104, 22,82,35,111, 103, - 39, -74, -127, -53, -8, 120, 55, -20, -103, 108, 109, -96, 68, 83, 114, -122, 16, -48, 35, -75, -117, 49, -120, -123, -41, -40, 44, 127, -115, -21, 117, -50, 123, -44, -5, -86, 55 , 8, -98, 111, -100, 96, 89, -13, -120, -125, -114, 122, 0, 3, 11, 51, 30, -73, 104, 64, -111,4 , 64, -79, -78, 122, -82, -82, -21, 64, 18, -73, -41, 102, 82, 56, -88, -29, -5, 0, 75, 17, 123, 88]

바이트 제로 바이너리 인쇄 : 00000000

지금 내가 (나는 확실하지 오전하지만) 내가 뭘 의미하는 것은 그 테스트 벡터부터입니다 바이트 떨어지고 몇 가지 이유로 중요하다는 것을 이해 그 두 라이브러리와 올바르게 계산하십시오. 올바르게 올바르게 프로그램해야합니까? 그러나 왜 우리가 그 앞에 0 바이트를 드롭해야 이해가 안 돼요. 그게 무슨 문제 야? 그 선두의 제로 바이트를 드롭 해, 선두의 제로 바이트가없는 바이트 배열로부터 다른 BigInteger를 작성하려고하면 (자),이 경우는 완전히 다른 수를 돌려줍니다. 0 바이트를 버리면 나에게 어떤 장면도 만들어 내지 않습니다. 모든 설명을 환영합니다.

답변

2

"서명되지 않은"이름은 아마도 오해의 소지가 있습니다. 부호없는 0 바이트를 버리는 것이 아니라 단지 BigInteger에 부호없는 숫자가 있다고 가정합니다.

이 경우 0 바이트가 누락 되어도 01 또는 0011과 같은 값입니다.

여러 가지 이유로 제로를 드롭하는 것이 중요 할 것입니다 :

  1. 불필요한 0 바이트 공간을 낭비하지 않습니다.
  2. 바이트 배열의 비교를 수행 할 때 표현을 일관되게 만듭니다.
  3. (앞에서 언급 한 내용과 가장 관련이 있습니다) 앞에 0이 추가 된 바이트 배열의 해시는 여분의 0이없는 바이트 배열의 해시와 같지 않습니다. 해시 함수는 ' 결국 이것은 숫자이고이 경우 0은 의미가 없다는 것을 알 수 있습니다. 바이트가 0:1:2:3이고 파일이 1:2:3 인 파일을 상상해보십시오. 길이가 다른 파일의 해시가 같지 않을 것이라고 기대할 수 있습니다.

0 바이트가 시작 또는 끝에서 제거되는지 여부는 정수 표현의 endianness에 따라 달라집니다.

업데이트 : 0 바이트의 제거의 명확한 설명 : 값을 변경 할 시작 또는 오래된 바이트 배열 의 끝에서 0 바이트를 제거 하다니

의 경우에 당신은 우리를 참조하고 정수 표현에 대해 이야기하고 있습니다. 0 바이트가 중요성을 갖는 경우, 예를 들어. 일부 이진 데이터를 왕복 이동하려는 경우 해당 이진 데이터를 BigInteger 클래스로로드하는 것은 적절하지 않습니다. 내 원래의 예제를 참조하십시오, 당신은 101 다른 숫자가 될 것이라고 생각하지 않겠지 만 (당신은 그들을 다른 문자열로 생각 하겠지만)?

UPDATE : 엔디 언에 대한 설명 :

정수가 메모리에 다른 방식으로 표현 될 수있다. 숫자 20 (일반 십진수로)을 보았다면, 2은 수십의 숫자를 의미하지만, 이는 단지 규칙 일뿐입니다. 우리는 스물 후자를 02으로 쓰고 숫자의 끝에 가장 큰 단위를 둡니다. 마찬가지로 컴퓨터에서 숫자의 순서는 우리가 일반적으로 익숙한 방식 일 수도 있고 "거꾸로"지정할 수도 있습니다. 주어진 숫자의 값에 영향을 미치지 않는 0은 바이트 배열의 시작 또는 끝에있을 수 있으며, 바이트의 배열을 처리 할 때는 바이트의 수를 알아야합니다 "독서".

+0

숫자 1과 2를 수락하지만 숫자 3에 대한 질문이 있습니다. 제로 바이트를 놓아도 값이 변경되지 않는다는 것에 동의하지 않습니다. 내가 볼 문제는 0 바이트를 버리고 바이트 배열을 가져 와서 다시 BigInteger로 변환하려고하면 같은 값을 가지지 않으므로 변경되지 않는다는 것입니다. 또한 내가 만약 당신이 어떤 개체 (ie 정수 파일 등)에서 해시를 가져다 주면 정확히 같은 개체가 될 것이라고 기대할 것입니다. 즉, 엔디안의 종속성에 대해 언급 한 것과 같은 실제로 몇 가지 규칙이 있다는 것을 제외하면 처음에있었습니다. – Tito

+0

너는 endianness에 더 많은 것을 정교하게 주시겠습니까, 위키피디아는 그것을 언급하는 것 같지 않습니다. – Tito

+0

2 개의 댓글에있는 포인트에 대한 설명이 업데이트되었습니다. – softwariness

관련 문제