/* ** 暗号化/複合 サンプルアプリケーション ** ** Copyright(c) 2005, Trust Software System, All Rights Reserved. */ #include "stdafx.h" #include #include int _tmain(int argc, _TCHAR* argv[]) { HCRYPTPROV hProv; HCRYPTHASH hHash; HCRYPTKEY hKey; // CSPのハンドル if(!CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0)) if(!CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET)) { fprintf(stderr, "CryptAcquireContext error\n"); return 1; } // ハッシュ計算のインスタンス if(!CryptCreateHash(hProv, CALG_SHA, 0, 0, &hHash)) { fprintf(stderr, "CryptCreateHash error\n"); return 2; } // ハッシュ値の計算 #define PASSWORD "password" if(!CryptHashData(hHash, (BYTE*)PASSWORD, (DWORD)strlen(PASSWORD), 0)) { fprintf(stderr, "CryptHashData error\n"); return 3; } // 鍵生成 #define KEYLENGTH_128 0x0080 * 0x10000 // 128-bit長 if(!CryptDeriveKey(hProv, CALG_RC4, hHash, KEYLENGTH_128, &hKey)) { fprintf(stderr, "CryptDeriveKey error\n"); return 4; } // 暗号化 BYTE pbData[100] = "This is a test data."; DWORD dwDataLen = (DWORD)strlen((char*)pbData) + 1; if(!CryptEncrypt(hKey, 0, TRUE, 0, pbData, &dwDataLen, 100)) { fprintf(stderr, "CryptEncrypt error\n"); return 5; } // 復号 if(!CryptDecrypt(hKey, 0, TRUE, 0, pbData, &dwDataLen)) { fprintf(stderr, "CryptDecrypt error\n"); return 6; } printf("データは、「%s」です。\n", pbData); // 後始末 CryptDestroyHash(hHash); CryptReleaseContext(hProv, 0); return 0; }