2017-11-11 2 views
1

https://en.wikipedia.org/wiki/SHA-2에 설명 된대로 SHA-2 암호화 기능을 수행하기 위해 노력하고 있습니다.SHA 2 해시 및 Java 문제

내가 말할 라인을 검토하고 있습니다 :

  • 는 길이 L 비트의 원래 메시지와 함께 시작 하나 '1'비트를 추가를;
  • K를 추가합니다. 여기서 K는 L + 1 + K + 64가 512의 배수가되도록 최소 수> = 0이므로, 64 비트 빅 엔디안 정수로 L을 추가합니다.
  • 총 사후 처리 길이는 512 비트의 배수입니다.

마지막 두 줄을 이해할 수 없습니다. 내 문자열이 짧은 경우 K '0'비트를 추가 한 후 길이가 512가 될 수 있습니다. 이것을 Java 코드에서 어떻게 구현해야합니까?

답변

1

우선, "문자열"은 자바 String이 아니고 비트 문자열이라는 것을 분명히해야합니다. 이러한 알고리즘은 바이너리/비트 기반입니다. 구현은 일반적으로 비트가 아니라 바이트를 처리하지 않습니다. 따라서 비트 대신 바이트가 표시되어야하는 변환 단계가 있습니다.

SHA-512는 512 비트 (SHA-224/256) 또는 1024 비트 (SHA-384/512) 블록 단위로 작동합니다. 그래서 기본적으로 64 또는 128 바이트의 버퍼를 가지고 있습니다. 또한 조작 된 단어 크기 인 32 비트 int 필드 (SHA-224/256) 또는 64 비트 long 필드에 데이터를 직접 캐시 할 수 있습니다.

이제 패딩은 비교적 간단한 절차입니다. 패딩을 비트 패딩이라고합니다. 빅 엔디안 모드에서 사용되기 때문에 (SHA-2는 SHA-3에서 braindead little endian 모드 대신에 이것을 사용합니다) 패딩은 바이트의 최상위 비트에 설정된 단일 비트로 구성되며 나머지는 제로. 이는 (byte) 0x80 값을 버퍼에 저장해야합니다.

버퍼가 가득 차서이 패딩을 만들 수없는 경우 이전 블록을 처리 한 다음 현재 사용 가능한 버퍼의 첫 번째 비트를 (byte) 0x80으로 설정해야합니다. 최신 Java에서는 (byte) 0b1_0000000 바이트를 사용할 수도 있습니다. 이는 더 명확합니다.

사용 된 해시 출력 크기에 따라 8-16 바이트가 남을 때까지 단순히 0을 더하면됩니다. 충분한 바이트가 없으면 끝까지 채우고 블록을 처리 한 다음 8 또는 16 바이트가 다시 남을 때까지 0 바이트로 채우기를 다시 시작하십시오.

이제 마지막으로 남은 8 바이트 또는 16 바이트에 비트의 숫자를 인코딩해야합니다. 따라서 입력을 8 배로 늘리십시오. 그리고 가능한 한 가장 중요한 비트가 가장 적은 Java에서 예상하는 것과 같은 방식으로 해당 바이트를 인코딩하십시오. 직접 프로그래밍하지 않으려면 https://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html#putLong-long-을 사용하는 것이 좋습니다. 어쨌든 2^56 바이트 이상은 잊어 버릴 수 있습니다. 따라서 SHA-384/SHA-512를 사용한다면 처음 8 바이트를 0으로 설정하면됩니다.

마지막 블록을 처리 한 다음 특정 출력 크기에 필요한만큼 왼쪽에서부터 많은 바이트를 사용해야한다는 점을 제외하면 모든 것이 가능합니다.

+0

Bouncy Castle과 Java 소스 코드를 쉽게 사용할 수 있습니다. 때로는 읽기가 쉽지 않아서 좋았고 대신 설명했습니다. –