#include #include #include // SHA-1ハッシュを計算する関数 void CalculateSHA1(const char* input, DWORD inputLength, BYTE* hashBuffer, DWORD hashBufferLength) { HCRYPTPROV hProv = 0; HCRYPTHASH hHash = 0; // 暗号サービスプロバイダを初期化 if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { fprintf(stderr, "CryptAcquireContext failed, error %lx\n", GetLastError()); return; } // ハッシュオブジェクトを作成 if (!CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash)) { fprintf(stderr, "CryptCreateHash failed, error %lx\n", GetLastError()); CryptReleaseContext(hProv, 0); return; } // 入力データに対してハッシュを計算 if (!CryptHashData(hHash, (const BYTE*)input, inputLength, 0)) { fprintf(stderr, "CryptHashData failed, error %lx\n", GetLastError()); CryptDestroyHash(hHash); CryptReleaseContext(hProv, 0); return; } // 計算されたハッシュ値を取得 DWORD hashSize = hashBufferLength; if (!CryptGetHashParam(hHash, HP_HASHVAL, hashBuffer, &hashSize, 0)) { fprintf(stderr, "CryptGetHashParam failed, error %lx\n", GetLastError()); } // ハッシュオブジェクトを解放 CryptDestroyHash(hHash); // 暗号サービスプロバイダを解放 CryptReleaseContext(hProv, 0); } int main() { // ハッシュを計算する文字列 const char* input = "Hello, World!"; DWORD inputLength = (DWORD)strlen(input); // SHA-1ハッシュを格納するバッファ BYTE hashBuffer[20]; // SHA-1 produces a 160-bit (20-byte) hash // SHA-1ハッシュを計算 CalculateSHA1(input, inputLength, hashBuffer, sizeof(hashBuffer)); // 計算されたSHA-1ハッシュを表示 printf("SHA-1 Hash: "); for (int i = 0; i < sizeof(hashBuffer); ++i) { printf("%02x", hashBuffer[i]); } printf("\n"); return 0; }