이 질문은 바이트 배열이 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 바이트를 버리면 나에게 어떤 장면도 만들어 내지 않습니다. 모든 설명을 환영합니다.
숫자 1과 2를 수락하지만 숫자 3에 대한 질문이 있습니다. 제로 바이트를 놓아도 값이 변경되지 않는다는 것에 동의하지 않습니다. 내가 볼 문제는 0 바이트를 버리고 바이트 배열을 가져 와서 다시 BigInteger로 변환하려고하면 같은 값을 가지지 않으므로 변경되지 않는다는 것입니다. 또한 내가 만약 당신이 어떤 개체 (ie 정수 파일 등)에서 해시를 가져다 주면 정확히 같은 개체가 될 것이라고 기대할 것입니다. 즉, 엔디안의 종속성에 대해 언급 한 것과 같은 실제로 몇 가지 규칙이 있다는 것을 제외하면 처음에있었습니다. – Tito
너는 endianness에 더 많은 것을 정교하게 주시겠습니까, 위키피디아는 그것을 언급하는 것 같지 않습니다. – Tito
2 개의 댓글에있는 포인트에 대한 설명이 업데이트되었습니다. – softwariness