C++에서 파일의 MD5 해시 가져오기

Zeeshan Afridi 2023년10월12일
  1. 해시 기능이란 무엇입니까
  2. MD5란?
  3. 결론
C++에서 파일의 MD5 해시 가져오기

MD5는 이전에 암호화에 사용되었지만 지금은 인증에 일반적으로 사용되는 암호화 프로토콜입니다. 일부 일반 텍스트에 대해 암호화된 해시 값을 생성하는 hash 함수의 해싱 프로세스를 기반으로 합니다.

해시 기능이란 무엇입니까

MD5(메시지 다이제스트 알고리즘)를 탐색하기 전에 해시 기능을 이해하는 것이 중요합니다. 해싱은 일반 텍스트를 해시 값이 있는 일부 암호문으로 변환하는 데 사용되는 해시 함수 프로세스입니다.

일반 텍스트를 암호문 및 일반적으로 압축된 해시 값으로 변환하는 데 도움이 되는 수학 함수를 기반으로 합니다.

해시 함수

이 다이어그램은 해시 기능의 작동을 보여줍니다. 메시지가 해시 기능에 대한 입력이라는 몇 가지 기본 메시지를 제공합니다. 일부 프로세스를 수행하고 암호문으로 알려진 암호화된 임의 값으로 출력을 제공합니다.

hash 기능의 특징

  1. 출력은 일반 텍스트의 크기에 관계없이 항상 동일한 길이인 128비트입니다.
  2. 128비트 이상이라도 원본 메시지를 압축한다.
  3. 데이터(메시지)를 소화하여 데이터를 더 작은 해시 값 표현으로 나타냅니다.
  4. 해시 값은 모든 다른 메시지에 대해 고유해야 합니다.
  5. 동일한 메시지에 대해 해시 값은 항상 동일해야 합니다.

MD5란?

MD5(Message-digest algorithm)는 메시지 인증, 콘텐츠 확인 및 디지털 서명에 사용되는 암호화 프로토콜입니다. Ronald Rivest는 [1991](https://en.wikipedia.org/wiki/MD5#:~:text=Ronald Rivest in-,1991 to,-replace an earlier)에 MD4의 고급 버전으로 설계했습니다. 주고받은 파일을 검증하는 hash 기능을 기반으로 합니다.

MD5는 현재 데이터 인증에 사용되지만 처음에는 데이터 암호화에 사용되었습니다. 인증은 인증 및 데이터 무결성 달성에 도움이 되는 암호화의 핵심 속성 중 하나입니다.

MD5는 파일이나 암호의 해시 값을 비트 단위로 확인하기 때문에 암호의 진위나 파일의 독창성을 확인하는 데 효율적인 알고리즘입니다.

MD5 알고리즘에는 4가지 중요한 단계가 있습니다.

  1. 패딩 비트
  2. 길이 추가
  3. MB 버퍼 초기화
  4. 각 블록 처리

패딩 비트

초기 메시지의 크기는 4000비트, 1231비트 또는 기타 임의의 비트 수일 수 있습니다. 그런 다음 패딩 비트를 추가합니다. 마지막으로 64비트의 크기가 512의 배수인지 확인해야 합니다.

시작 부분에 1을 추가하고 패딩에 나머지 0을 추가합니다.

길이 추가

이 단계에서 최종 메시지를 512의 배수로 만들려면 문자를 몇 개 더 추가해야 합니다. 이렇게 하려면 원본 메시지의 길이를 가져와 64비트 형식으로 표현합니다.

그리고 이 조합은 우리에게 해싱할 읽기의 최종 메시지를 제공합니다.

MB 버퍼 초기화

버퍼 A, B, CD를 초기화할 시간입니다. 각 버퍼는 메시지 다이제스트의 값을 계산하는 데 사용됩니다. 각 버퍼는 32비트이며 다음과 같이 초기화됩니다.

A = 01 23 45 67
B = 89 ab cd ef
C = fe dc ba 98
D = 76 54 32 10

각 블록 처리

각 512비트 블록은 16개 블록의 더 작은 덩어리로 나뉩니다. 각 하위 블록의 크기는 32비트입니다. 전반적으로 4라운드는 각 블록을 처리하고 몇 가지 특정 작업을 수행합니다.

각 라운드는 16개 블록을 모두 활용하며 버퍼는 상수 배열 값입니다.

상수 배열은 T[1] -> T[64]로 표시되고 모든 하위 블록은 M[0] -> m[15]로 표시됩니다.

MD5의 작동

이 다이어그램에 따르면 모든 단일 버퍼에 대해 값이 실행되고 있음을 알 수 있습니다.

void print_MD5(unsigned char* md, long size = MD5_DIGEST_LENGTH) {
  for (int i = 0; i < size; i++) {
    cout << hex << setw(2) << setfill('0') << (int)md[i];
  }
}

이 기능은 MD를 올바르게 인쇄하는 데 사용됩니다.

#include <iostream>

#include "md5.h"  // This is an external library that you need to import for MD5 algorithm

using namespace std;  // for cout

int main() {
  cout << "md5 of 'grape' : " << md5("grape") << endl;
  return 0;
}

출력:

md5 of 'grape' : b781cbb29054db12f88f08c6e161c199

이 코드에는 MD5 알고리즘을 사용하고 일반 텍스트의 해시 값을 생성할 수 있는 외부 라이브러리 md5.h가 포함되어 있습니다. 파일의 해시 값을 반환하는 md5 함수에 문자열 grape를 인수로 전달합니다.

fileSize = file.tellg();
cout << "File size \t" << fileSize << endl;
memBlock = new char[fileSize];
file.seekg(0, ios::beg);
file.read(memBlock, fileSize);
file.close();

파일 크기를 가져와서 메모리에 복사합니다.

결론

MD5 해싱 알고리즘은 일반 텍스트의 암호 해시 값에 대한 복잡한 수학 공식을 기반으로 합니다. MD5 알고리즘 작업에서 본 것처럼 일반 텍스트를 특정 크기의 블록으로 변환하고 다른 작업을 수행합니다.

그리고 마지막에는 텍스트에 대해 128비트 값을 압축합니다. 알파벳 a에 대한 MD5 알고리즘 해시 값은 0cc175b9c0f1b6a831c399e269772661과 같습니다.

Zeeshan Afridi avatar Zeeshan Afridi avatar

Zeeshan is a detail oriented software engineer that helps companies and individuals make their lives and easier with software solutions.

LinkedIn