2011-02-07 9 views
8

AquaticPrimeフレームワークをMacに移植しようとしています。CryptoAPI:公開鍵を使用してCryptVerifySignatureを使用してopensslから署名を検証する

Macでは、opensllライブラリを使用しています。これをWindowsに移植する方法を理解しようとしています.CryptoAPIを使用する必要があります。

私は主に、生成された署名を特定の公開鍵で検証するコードが必要です。

はここで検証はopensslので行われている方法は次のとおりです。

  1. 入力:ライセンスデータ、公開鍵と署名、両方の128バイト長。
  2. SHA1ダイジェストは、ライセンスデータから計算されます。
  3. RSAコンテキストが公開鍵データで設定されている
  4. RSA鍵と20バイトの長さのSHA1ダイジェストを返す署名を指定すると、RSA_public_decrypt()が呼び出されます。このダイジェストはステップ2のものと等しく、署名は有効です。

CryptoAPIでこれを行うにはどうすればよいですか?私はこれまでのところ得ている:

  1. スタートをCryptAcquireContext(CTX、0、0、PROV_RSA_FULL、CRYPT_VERIFYCONTEXT)this投稿の助けを借りて
  2. 使用CryptImportKeyで、pubexp = 3とbitlen = 1024で。それはすべて動作します。つまり、エラーは発生しません。バイナリデータを参照して、MSDN記事の内容と一致することを確認します。
  3. ライセンスデータからSHA1ダイジェストを作成します。結果の20バイトのハッシュ値を取得し、Mac上のopensslと一致することを確認しました。この時点で

、私が呼ん:

CryptVerifySignature (hashHdl, sig, sigLen, keyHdl, 0, 0) 

これは、エラーコードERROR_INVALID_PARAMETERで失敗します。

奇妙なことは、私が誤ってPUBLICKEYBLOB構造体に2倍の大きさの公開鍵を格納してしまったときに、代わりにNTE_BAD_SIGNATUREエラーが発生したことです。これは、私が渡している公開鍵が正しいことを示唆するかもしれません。

なぜERROR_INVALID_PARAMETERエラーが発生しましたか?私は、ハッシュ値が正しいことを確認し、鍵も受け入れられるように見えます。 "sig"パラメータは128バイトの署名のポインタにすぎず、sigLenは128です。

ここで私は何が分かりませんか?

+1

質問:あなたはいくつかの[Windows移植](http://www.slproweb.com/products/Win32OpenSSL.html)バージョンのOpenSSLを使用してみませんか?私はCryptoAPIの使用に間違いはないが、openSSLは既に存在しているため、作業が少なくて済むことを意味する。 – erloewe

+0

私は新しいシステムコンポーネントをインストールするだけでインストーラを必要としないアプリケーションを実行する必要はない。 –

答えて

9

OK、私は多くの試行錯誤の後で問題を解決しました。

純粋なバイト文字列形式である場合には、署名と公開鍵の両方のデータを逆にする必要があります。 それから上記はうまくいきます。

+1

私は同様の問題に遭遇していると思います。署名と公開鍵のデータを逆にする必要があるのはどうでしたか? –

+0

入手!CryptoAPIの署名と暗号化機能の出力はリトルエンディアン形式です! –

+0

私の調査結果を確認できることを嬉しく思っています。ここで私の投稿は無駄ではありません:) –

-3

OpenSSL libCryptoを静的にコンパイルしてリンクします。それはできます、私はこれを以前の雇用主に見ました。