Trusted Design

アクセスカウンタ

zoom RSS Windows10はCryptoAPI 1.0が利用できます

<<   作成日時 : 2015/04/28 21:35   >>

ブログ気持玉 0 / トラックバック 1 / コメント 0

 Windowsで暗号機能を利用する場合は,CryptoAPIを利用します。Windows Vista以降ではCNG(Cryptography API : Next Generation)を利用することになっていますが,CryptoAPIは今でも主流として利用されています。Windows VistaからWindows10までで4世代のOSがあったので,そろそろCryptoAPIはサポートされなくなってしまうのではないかと心配していました。

 Windows10 Technical Previewを入れたので,CryptoAPIが利用できるかテストプログラムを作って動かしてみました。無事にCryptoAPI 1.0が利用できることが確認できました。こんなサンプルで確認しました。ちょっと長いサンプルですけど,全体を載せてみます。


#include "stdafx.h"
#include "windows.h"
#include "wincrypt.h"

#define KEYCONTAINER L"myKeyContainer"

int _tmain(int argc, _TCHAR* argv[])
{
HCRYPTPROV hProv = NULL; // CryptoAPIのコンテキストハンドル
HCRYPTKEY hKey = NULL; // 鍵ハンドル
HCRYPTHASH hHash = NULL; // ハッシュハンドル
DWORD dwSigLen = 0; // 署名データ長
BYTE* pbSig = NULL; // 署名データ用のバッファ
BYTE* pbHash = (BYTE*)"testhash";
DWORD dwHashLen = 9;

// CryptoAPIを利用して鍵を生成する
// 同じ名称の鍵コンテナがある場合はエラーになるから注意すること
printf("CryptAcquireContext (NEWKEYSET) call ...");
if (!CryptAcquireContext(&hProv, KEYCONTAINER, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET))
{
printf("Failed. Error = %#x\n", GetLastError());
goto FINISH;
}
printf("Success\n");

// RSA鍵ペアを生成する
printf("CryptGenKey call ...");
if (!CryptGenKey(hProv, AT_KEYEXCHANGE, 0x08000000, &hKey))
{
printf("Failed. Error = %#x\n", GetLastError());
goto FINISH;
}
printf("Success\n");

// 鍵ハンドルを解放する
printf("CryptDestroyKey call ...");
if (!CryptDestroyKey(hKey)) {
printf("Failed. Error = %#x\n", GetLastError());
goto FINISH;
}
printf("Success\n");

// コンテキストハンドルを解放する
printf("CryptReleaseContext call ...");
if (! CryptReleaseContext(hProv, NULL)) {
printf("Failed. Error = %#x\n", GetLastError());
goto FINISH;
}
printf("Suucess\n");
hKey = NULL;
hProv = NULL;

// 署名を実行する
// カギコンテナを指定してコンテキストハンドルを取得する
printf("CryptAcqireContext (NULL) call ...");
if (!CryptAcquireContext(&hProv, KEYCONTAINER, NULL, PROV_RSA_FULL, 0))
{
printf("Failed. Error = %#x\n", GetLastError());
goto FINISH;
}
printf("Success\n");

// ハッシュを生成する
printf("CryptCreateHash call ...");
if (!CryptCreateHash(hProv, CALG_SHA1, NULL, NULL, &hHash))
{
printf("Failed. Error = %#x\n", GetLastError());
goto FINISH;
}
printf("Success\n");

// ハッシュにデータを設定する
printf("CryptHashData call ...");
if (!CryptHashData(hHash, pbHash, dwHashLen, 0))
{
printf("Failed. Error = %#x\n", GetLastError());
goto FINISH;
}
printf("Success\n");

// 署名を実行する
printf("CryptSignHash call ...");
if (!CryptSignHash(hHash, AT_KEYEXCHANGE, NULL, NULL, NULL, &dwSigLen))
{
printf("Failed. Error = %#x\n", GetLastError());
goto FINISH;
}
printf("Success\n");

if (pbSig = (BYTE *)malloc(dwSigLen))
{
printf("Memory allocated for the signature.\n");
}
else
{
printf("Out of memory\n");
goto FINISH;
}
printf("CryptSignHash call ...");
if (!CryptSignHash(hHash, AT_KEYEXCHANGE, NULL, NULL, pbSig, &dwSigLen))
{
printf("Failed. Error = %#x\n", GetLastError());
goto FINISH;
}
printf("Success\n");

// ハッシュハンドルを解放する
printf("CryptDestroyHash call ...");
if (!CryptDestroyHash(hHash))
{
printf("Failed. Error = %#x\n", GetLastError());
goto FINISH;
}
printf("Success\n");

// コンテキストハンドルを解放する
printf("CryptReleaseContext call ...");
if (!CryptReleaseContext(hProv, NULL))
{
printf("Failed. Error = %#x\n", GetLastError());
goto FINISH;
}
printf("Success\n");

// 生成した鍵を削除する
printf("CryptAcquireContext (DELETE KEYSET) call ...");
if (!CryptAcquireContext(&hProv, KEYCONTAINER, NULL, PROV_RSA_FULL, CRYPT_DELETEKEYSET))
{
printf("Failed. Error = %#x\n", GetLastError());
}
printf("Success\n");

FINISH:
if (hHash) {
CryptDestroyHash(hHash);
}

if (hProv) {
CryptReleaseContext(hProv, NULL);
}
return 0;
}

------
 Trusted Design

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(1件)

タイトル (本文) ブログ名/日時
Visual Studio 2015 RC
 Visual Studio 2015 RCがリリースされました。私のPCに入れていたのはVisual Studio 2015 CTPだったので,さっそくバージョンアップしてみます。 ...続きを見る
Trusted Design
2015/05/04 05:43

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
Windows10はCryptoAPI 1.0が利用できます Trusted Design/BIGLOBEウェブリブログ
文字サイズ:       閉じる