// EncData541.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" #include int _tmain(int argc, _TCHAR* argv[]) { HCRYPTPROV hProv = NULL; HCERTSTORE hStore = NULL; PCCERT_CONTEXT pcCert = NULL; // 電子証明書選択 if(OpenAndGetCertificate(&hProv, &hStore, &pcCert) < 0) return 1; // 暗号化の準備 PCCERT_CONTEXT recipients[1]; // 受取人の電子証明書 CRYPT_ALGORITHM_IDENTIFIER encAlg; // 暗号化のアルゴリズム CRYPT_ENCRYPT_MESSAGE_PARA encPara; // 暗号化のパラメーター recipients[0] = pcCert; // 受取人リストに電子証明書をセットする memset(&encAlg, 0, sizeof(encAlg)); encAlg.pszObjId = szOID_RSA_RC4; // 暗号化の方式として、RC4を設定 memset(&encPara, 0, sizeof(encPara)); encPara.cbSize = (DWORD)sizeof(encPara); encPara.dwMsgEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING; encPara.hCryptProv = hProv; // CSPのハンドル encPara.ContentEncryptionAlgorithm = encAlg; // データを暗号化するアルゴリズム // 暗号化 BYTE *pbCont = (BYTE*)"このデータを暗号化します。"; // 暗号化されるデータ DWORD cbCont = (DWORD)strlen((char*)pbCont) + 1; // データのサイズ BYTE *pbEncBlob; // 暗号化データの格納域 DWORD cbEncBlob; // 暗号化データのサイズ if(!CryptEncryptMessage( &encPara, // 暗号化パラメーター 1, // 受取人の数 recipients, // 受取人の証明書アレー pbCont, // 暗号化されるデータ cbCont, // そのサイズ NULL, // 暗号化データのサイズがわからないのでNULLを指定 &cbEncBlob)) // 暗号化データのサイズが戻される { fprintf(stderr, "暗号化に失敗しました1。\n"); return 2; } // 暗号化データの格納領域を確保してから再度暗号化を実施 pbEncBlob = new BYTE [cbEncBlob]; if(!CryptEncryptMessage( &encPara, // 暗号化パラメーター 1, // 受取人の数 recipients, // 受取人の証明書アレー pbCont, // 暗号化されるデータ cbCont, // そのサイズ pbEncBlob, // 暗号化データの格納域ポインター &cbEncBlob)) // 暗号化データのサイズが戻される { fprintf(stderr, "暗号化に失敗しました2。\n"); return 3; } // データの表示 char pstr[2000]; DWORD cstr = 2000; CryptBinaryToString(pbEncBlob, cbEncBlob, CRYPT_STRING_HEXASCIIADDR, pstr, &cstr); printf("Value =\n%s\n", pstr); // 後始末 CertFreeCertificateContext(pcCert); CertCloseStore(hStore, 0); CryptReleaseContext(hProv, 0); return 0; }