반응형
해싱알고리즘의 하나인 SHA-256은 비트코인에서도 사용하고 있는 유명한 알고리즘이다.
개발시에서도 암호를 해싱알고리즘을 사용해 서버에 저장하는 등 많이 사용한다.
단방향 해싱의 장점은 복호화하는 기술이 어렵기 때문에 사용자의 비밀번호를 서버에서 저장하다고 하여도 관리자는 그비밀번호를 알수가없다.
메세지 전처리
SHA-256를 적용해야할 데이터를 메시지 라고 합니다. 이때 메시지 bit 의 길이가 512의 배수가 되도록 padding 을 추가하는 것이 전처리 단계에서 수행하는 작업입니다.
- 원본 메시지의 바로 뒤에 비트 ‘1’ 을 하나 추가한다.
- 메시지의 길이가 512의 배수가 되도록 메시지에 0을 추가한다.
- 메시지의 마지막 64bit에는 원본 메시지의 bit 길이를 적는다.
출처 : https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf
// Add padding to message.
void PreProcess(std::vector<uint8_t>& message)
{
auto L = static_cast<uint64_t>(message.size());
// Append single '1' bit and seven '0' bits.
message.push_back(0b10000000);
// Append (K * 8) '0' bits, where L + 1 + K + 8 is a multiple of 64.
auto K = 64 - (((L % 64) + 9) % 64);
if (K == 64) K = 0;
for (int i = 0; i < K; ++i)
{
message.push_back(0);
}
// Append the bit length of original message.
assert(L <= UINT64_MAX / 8);
uint64_t bitLengthInBigEndian = ChangeEndian(L * 8);
auto ptr = reinterpret_cast<uint8_t*>(&bitLengthInBigEndian);
message.insert(std::end(message), ptr, ptr + 8);
assert(message.size() % 64 == 0);
}
전처리된 메시지 해싱
메시지 전처리가 끝났다면 메시지의 bit 길이는 512의 배수 형태가 되어있을 것입니다.
이러한 전처리된 메시지를 512bit 단위로 쪼개서 여러 개의 chunk 를 만들게 됩니다.
그리고 이러한 chunk 들을 차례대로 순회하면서 특정 연산을 수행하여 최종적인 hash 값을 계산해내게 됩니다.
여기서 초기값 상수 (H0) 는 가장 작은 소수 8개 (2, 3, 5, 7, 11, 13, 17, 19) 에 대해 루트를 씌운 후 소수점 아래자리 32bit 를 추출하면 구할 수 있습니다.
초기값 상수 를 구하는 것을 코드로 작성하면 아래와 같습니다.
std::array<uint32_t, 8> Make_H0()
{
const double kPrimeList[] = { 2, 3, 5, 7, 11, 13, 17, 19 };
static_assert(sizeof(kPrimeList) / sizeof(*kPrimeList) == 8, "");
std::array<uint32_t, 8> H;
for (int i = 0; i < 8; ++i)
{
auto v = std::sqrt(kPrimeList[i]);
v -= static_cast<uint32_t>(v);
v *= std::pow(16, 8);
H[i] = static_cast<uint32_t>(v);
}
return H;
}
자바에서 활용
반응형
'개인공부' 카테고리의 다른 글
scss 자주쓰는 mixin (0) | 2021.05.04 |
---|---|
CSS 말줄임 후 더보기 버튼 (React) (0) | 2021.05.02 |
React : 자식에서 부모 컴포넌트로 값 전달 (0) | 2021.04.13 |
SSR , CSR 읽어볼만한 거 (0) | 2021.04.08 |
css관련 읽어볼만한 속성 (0) | 2021.03.25 |