回答ありがとうございます。
早速やってみたのですが、
#include "stdafx.h"
#include <Windows.h>
#include <Wincrypt.h>
#pragma comment(lib, "Crypt32.lib")
#define PASSWORD "password"
int _tmain(int argc, _TCHAR* argv[/url])
{
// キーコンテナの取得
HCRYPTPROV hProv;
if(!CryptAcquireContext(&hProv, NULL, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, 0)) {
if(!CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_AES, CRYPT_NEWKEYSET)) {
wprintf(_T("CryptAcquireContext error\n"));
return 1;
}
}
// ハッシュのインスタンス
HCRYPTHASH hHash;
if(!CryptCreateHash(hProv, CALG_SHA1, 0,0,&hHash)) {
wprintf(_T("CryptCreateHash error\n"));
return 2;
}
if(!CryptHashData(hHash, (BYTE*)PASSWORD, (DWORD)strlen(PASSWORD), 0)) {
wprintf(_T("CryptHashData error"));
return 3;
}
// 鍵の生成
#define KEYLENGTH_256 256 * 0x10000
HCRYPTKEY hKey;
if(!CryptDeriveKey(hProv, CALG_AES_256, hHash, KEYLENGTH_256, &hKey)) {
wprintf(_T("CryptDeriveKey error\n"));
return 4;
}
// ブロック暗号化のパディングを設定
DWORD padding_mode=PKCS5_PADDING;
if(!CryptSetKeyParam(hKey, KP_PADDING, (BYTE*)&padding_mode, 0)) {
wprintf(_T("CryptSetKeyParam error\n"));
return 5;
}
/*
// ブロックサイズを取得
{
DWORD blkLen;
DWORD dwDataLen=(DWORD)sizeof(DWORD);
if(!CryptGetKeyParam(hKey, KP_BLOCKLEN, (BYTE*)&blkLen, &dwDataLen, 0)) {
wprintf(_T("CryptGetKeyParam error"));
return 97;
} else {
wprintf(_T("Bolock length is %d bytes.\n"), blkLen / 8);
}
}
/**/
// 初期化ベクタ
BYTE iv[/url]={0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
if(!CryptSetKeyParam(hKey, KP_IV, iv, 0)) {
wprintf(_T("CryptSetKeyParam error\n"));
return 98;
}
// Cipherモードを設定
DWORD mode = CRYPT_MODE_CFB;
if(!CryptSetKeyParam(hKey, KP_MODE, (BYTE*)&mode, 0)) {
wprintf(_T("CryptSetKeyParam error\n"));
return 99;
}
// 復号用にキーを複製
HCRYPTKEY hdKey;
if(!CryptDuplicateKey(hKey, NULL, 0, &hdKey)) {
wprintf(_T("CryptDuplicateKey error\n"));
return 6;
}
// 暗号化
#define BUF_LEN 100
BYTE pbData[BUF_LEN]="This is a palin text data.";
DWORD dwDataLen=(DWORD)(strlen((char*)pbData)+1);
if(!CryptEncrypt(hKey, 0, TRUE, 0, pbData, &dwDataLen, (DWORD)BUF_LEN)) {
wprintf(_T("CryptEncrypt error\n"));
return 7;
} else {
WCHAR str[1000];
DWORD strLen=1000;
CryptBinaryToString(pbData, dwDataLen, CRYPT_STRING_HEXASCIIADDR, str, &strLen);
wprintf(str);
wprintf(_T("Encrypted data length is %d bytes\n"), dwDataLen);
}
// 復号
if(!CryptDecrypt(hdKey, 0, TRUE, 0, pbData, &dwDataLen)) {
wprintf(_T("CryptDecrypt error\n"));
return 8;
} else {
WCHAR str[1000];
DWORD strLen=1000;
CryptBinaryToString(pbData, dwDataLen, CRYPT_STRING_HEXASCIIADDR, str, &strLen);
wprintf(str);
wprintf(_T("Decrypted data length is %d bytes\n"), dwDataLen);
}
// 後始末
CryptDestroyKey(hKey);
CryptDestroyKey(hdKey);
CryptDestroyHash(hHash);
CryptReleaseContext(hProv, 0);
return 0;
}
でどうしても、wprintf(_T("CryptAcquireContext error\n"));で止まってしまいます。
どうしたらよいでしょうか?