2017-07-20 6 views
0

"Microsoft RSA SChannel Cryptographic Provider"を使用してデジタル署名を生成しようとしています。コンテナへのハンドルを取得した後、CryptGenKey()を使用してシグネチャを生成しています。しかし、この関数はFALSEを返します。CryptoAPI RSA Schannelプロバイダエラー

CryptGenKeyためdwError()は、他のプロバイダ・タイプの80090008.

同じ作品を返します。また、私は同じプロバイダのための鍵交換ペアを作成しようとしているとき、それは正常に動作しています。私は間違って何をしていますか?

#include <Windows.h> 
#include <wincrypt.h> 

int main() 
{ 
    HCRYPTPROV phProv = 0; 
    LPTSTR pszContainer = NULL; 
    DWORD dwFlags = 0; 
    bool flag; 
    DWORD_PTR dwError; 
    HCRYPTKEY phKey; 

    flag = CryptAcquireContext(&phProv, pszContainer, 
     MS_DEF_RSA_SCHANNEL_PROV, PROV_RSA_SCHANNEL, dwFlags); 
    if (!flag) 
    { 
     flag = CryptAcquireContext(&phProv, pszContainer, 
      MS_DEF_RSA_SCHANNEL_PROV, PROV_RSA_SCHANNEL, CRYPT_NEWKEYSET); 
    } 
    dwError = GetLastError(); 

    flag = CryptGenKey(phProv, AT_SIGNATURE, CRYPT_EXPORTABLE, &phKey); 
    dwError = GetLastError(); 

    flag = CryptGetUserKey(phProv, AT_SIGNATURE, &phKey); 
    dwError = GetLastError(); 

    return 0; 
} 

ありがとうございます。

答えて

1

SChannelプロバイダはAT_SIGNATURE RSAキーをサポートしていません。AT_EXCHANGEのみです。これは主に、RSA署名で署名されたDiffie-Hellman Key Agreementを使用して合意したのではなく、RSA暗号化を使用して鍵を交換した初期のTLS(まだSSLだった時代)からのホールドオーバーです。 SChannelプロバイダは動作し、なぜそれを変更するのですか? " CAPIでAT_EXCHANGEキー暗号化と署名の両方を行うことができ、かつAT_SIGNATUREキーのみが署名を行うことができますが

(最も近い私はCALG_RSA_KEYXを示し、CALG_RSA_SIGNの話をしない、https://msdn.microsoft.com/en-us/library/windows/desktop/aa387690(v=vs.85).aspxです。ダウン書かれていることを参照してください)。

一般に、Windows暗号化チームはCAPIで書かれた新しいコードを駄目にしています(私が書いたものよりも書かれた証拠はありません;主にこれは彼らとの会議に由来しています)。 CNGは開発者にとって使いやすいAPIを備えており、より強力です。 CNGはWindows Vistaで出荷されているため、サポートされているすべてのWindowsバージョンで利用できます。 CAPIは、もはや「もっとカバレッジがある」という目的を果たさず、(XPのようなサポート外のOSのコードを書いているのでない限り)「古くて難解なレガシーAPI」に過ぎません。

CAPIを使用している場合は、SCチャネルプロバイダを使用する理由がわかりません。 MS_ENH_RSA_AES_PROVを介したPROV_RSA_AESは、CAPIが持つ最も機能的なRSA(SHA-2ベースのPKCSシグネチャ)です。しかし、CNGのソフトウェアプロバイダ(PSS署名、SHA-2のOAEP)に比べて古く、2^32より大きい公開指数値をサポートしています(これは一般的な必要性ではありませんが、CNGが修正したものです)。

関連する問題