MD5による署名の作成が出来ない

[戻る]
chida 2005/09/15(木) 17:08:19
度々失礼します。
実ファイル名からMD5で変換されたファイル名を取得するプログラムを作りたかったので
すが、CryptAcquireContext、CryptCreateHash、CryptHashDataは戻り値にTRUEが帰って
きているため正常に終了していると思うのですがCryptSignHashのところでFALSEが帰って
きて変換後のファイル名が取得できません。
検索をして見たのですがこれとほぼ同じ使い方で正常のケースしか見つからず原因がよく
分かりません。ご教授のほどをよろしくお願いします。
開発環境はWin2003Server、VC++6.0SDKです。
ソースは以下のようになっています。よろしくお願いします。
--------------------------------------------------------------------------------
int    chg_md5(char* hash_md5)
{
    HCRYPTPROV    hProv;
    HCRYPTHASH    hHash;
    HCRYPTKEY    hKey;
    BOOL        bResult;
    char        Buf[32+1];
    char        Signature[32+1];
    DWORD        SignLen;
    int            ret ;

    hProv    = 0 ;
    hHash    = 0 ;
    hKey    = 0 ;
    SignLen = 32;
    sprintf(Buf,"%s",hash_md5);

    ret = CryptAcquireContext( &hProv, NULL, NULL, PROV_RSA_FULL, 0 ) ;
    if(ret != TRUE )
    {
        if(!CryptAcquireContext( &hProv, NULL
       , NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET ))
        {
            return 1;
        }
    }

    ret = CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);
    ret = CryptHashData(hHash, Buf, 32, 0);

    ret = CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, NULL, &SignLen);
    ret = CryptSignHash(hHash, AT_SIGNATURE
            , NULL, 0, Signature, &SignLen);
    
    ret    = CryptGetUserKey(hProv, AT_SIGNATURE, &hKey);
    bResult = CryptVerifySignature(hHash, Signature
            , SignLen, hKey, NULL, 0);

    if(bResult){ ret = 0 ; }
    else       { ret = 1 ; }

    CryptDestroyKey(hKey);
    CryptDestroyHash(hHash);
    CryptReleaseContext(hProv, 0);
    return ret;
}
--------------------------------------------------------------------------------

PATIO 2005/09/15(木) 18:10:13
せめてGetLastErrorの結果どんなエラーが出ているのか位は添えるべきだと思うのですが。

PATIO 2005/09/15(木) 18:12:04
あと、

ret = CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, Signature, &SignLen);

このときのSignLenは、Signatureのサイズを渡すようにとMSDNには書いてあるようです。
確認されましたか?

chida 2005/09/15(木) 18:30:18
PATIOさんありがとうございます。
まずエラーNOですが、失念しておりました。
CryptSignHashの戻り値がNTE_BAD_KEYSET(鍵コンテナ生成は正常終了しているのに鍵コ
ンテナが存在していないと言われている?)でした。
SignLenについては調べてあったのですが修正漏れです。
修正して再実行してみましたが、エラーは同じものが帰ってきました。
この場合は署名の作成ではなく鍵の取得がおかしいのでしょうか?
以上です。よろしくお願いします。

PATIO 2005/09/16(金) 10:36:37
キーペアの取得を単純に行った時に取得できますか?
もし出来ないのであれば、そのPCに使用するべきキーペアが存在しないと言う事では
ないかと思うのですが。
CryptSignHashを呼び出した直後のGetLastErrorがNTE_BAD_KEYSETと言う事であれば、
それが原因ではないかと思います。
キーペアの生成というのがどうやればいいのかと言うのは私もわかりませんけれど。

chida 2005/09/17(土) 16:41:45
[[解決]]
キーペア取得が出来なかったのでキー自体が存在しないようです。
また、自分のやりたいこと違うことをやっている可能性が出てきましたので出直して調べ
なおします。
PATIO様ありがとうございました。
解決は出来ていないですが、調査の時間がほしいので解決に変更しておきます。

古いスレッドには追加発言できません。