- ベストアンサー
署名と検証方法の切り替えに関する資料の調査
- 質問文章のコードにある署名と検証方法を切り替えたい場合の方法について調査しています。
- BCryptOpenAlgorithmProvider関数を使用して、BCRYPT_RSA_SIGN_ALGORITHMとBCRYPT_RSAPRIVATE_BLOBまたはBCRYPT_RSAPUBLIC_BLOBを指定することで、署名と検証の方法を切り替えることができます。
- 詳細な手順やサンプルコードなどの資料を検索して、ご自身のコードに適用してみてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>デバッグでは、status の内容を確認できません。 statusの型は… typedef __success(return >= 0) LONG NTSTATUS, *PNTSTATUS; となっていますね。 # むぅ? よく判らん…。 http://msdn.microsoft.com/en-us/library/windows/desktop/aa375515%28v=vs.85%29.aspx によると、戻り値が書かれているので…… if文で列挙して調べてみる。 というのもアリかも知れません。 # Return Valueに書かれている以外のものが返されるとアレですが…。 あとは……直前の BCryptSignHash(hKey, NULL, (LPBYTE)lpHashData, dwHashDataSize, NULL, 0, &dwSignatureSize, 0); lpSignature = (LPBYTE)HeapAlloc(GetProcessHeap(), 0, dwSignatureSize); が失敗していないか?を確認ですかねぇ。 念のため、dwSignatureSizeは0に初期化しておいた方がいいかも知れません。 # APIが失敗した結果、なにも値を設定してくれていなかった場合は不定値が入っていますしね。(Debugビルドならある意味固定値ですが…) >The RSA signature algorithm. This algorithm is not currently supported. You can use the >BCRYPT_RSA_ALGORITHM algorithm to perform RSA signing operations. >との説明があるので、利用できないのでしょうか? そんな感じもしますね。 ソレならソレでBCryptOpenAlgorithmProvider()でエラーなら返却して欲しいような気もしますが……。
その他の回答 (1)
- Wr5
- ベストアンサー率53% (2173/4061)
「動きません」だけでなく、どっかでAPIがエラー返却しているのならそれの内容を確認する。 とかでは? 掲示されているURLで作られているSignData()やImportKeyData()、SignData()、VerifyData()等がRSA暗号に対応しているかどうか…というのもあるでしょうし。 まあ、実際にはその中で呼ばれている各種APIが対応しているか? というのと、その際に渡している引数などが正しいか? ということになりますが。
補足
ありがとうございます。 VS2005を使っているのですが、デバッグのときの値が見れない所があります。 エラーが起きて終了してしまうのは、 関数 BOOL SignData(BCRYPT_KEY_HANDLE hKey, LPTSTR lpszFileName, LPBYTE lpData, DWORD dwDataSize) のなかの、 status = BCryptSignHash(hKey, NULL, (LPBYTE)lpHashData, dwHashDataSize, lpSignature, dwSignatureSize, &dwSignatureSize, 0); if (!NT_SUCCESS(status)) { HeapFree(GetProcessHeap(), 0, lpHashData); HeapFree(GetProcessHeap(), 0, lpSignature); return FALSE; } の部分で、ここで return FALSE; となっています。 デバッグでは、status の内容を確認できません。 また、 BCRYPT_RSA_SIGN_ALGORITHM "RSA_SIGN" ですが、 The RSA signature algorithm. This algorithm is not currently supported. You can use the BCRYPT_RSA_ALGORITHM algorithm to perform RSA signing operations. Standard: PKCS #1 v1.5 and v2.0. との説明があるので、利用できないのでしょうか?
補足
>The RSA signature algorithm. This algorithm is not currently supported. You can use the >BCRYPT_RSA_ALGORITHM algorithm to perform RSA signing operations. >との説明があるので、利用できないのでしょうか? そんな感じもしますね。 ソレならソレでBCryptOpenAlgorithmProvider()でエラーなら返却して欲しいような気もしますが……。 コンパイルエラーにはなりません。 他の変な文字列を入れるとコンパイルエラーになります。 あわてないで資料をゆっくり読みながら考えて見ます。 ありがとうございました。