8

Mac用のAquaticPrimeフレームワークをWindowsに移植しようとしています。

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

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

opensslを使用して検証を行う方法は次のとおりです。

  1. 入力:ライセンスデータ、公開鍵、署名、どちらも128バイト長。
  2. SHA1ダイジェストは、ライセンスデータから計算されます。
  3. RSAコンテキストは公開鍵データで設定されます
  4. RSAキーと署名が与えられるとRSA_public_decrypt()が呼び出され、20バイト長のSHA1ダイジェストが返されます。このダイジェストはステップ2のダイジェストと同じであり、署名は有効です。

では、CryptoAPIでこれを行うにはどうすればよいですか?私はこれまでに得ました:

  1. CryptAcquireContext(ctx、0、0、PROV_RSA_FULL、CRYPT_VERIFYCONTEXT)で開始します
  2. この投稿を利用して、pubexp=3およびbitlen=1024でCryptImportKeyを使用します。それはすべて機能します。つまり、エラーは発生しません。バイナリデータを調べて、MSDNの記事に示されているものと一致することを確認しました。
  3. ライセンスデータからSHA1ダイジェストを作成します。結果の20バイトのハッシュ値を取得し、Macのopensslで取得したものと一致することを確認しました。

この時点で、私は次のように呼びます。

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

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

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

では、なぜ今ERROR_INVALID_PARAMETERエラーが発生するのでしょうか。ハッシュ値が正しいことを確認しましたが、キーも受け入れられているようです。また、「sig」パラメータは署名の128バイトへの単なるポインタであり、sigLenは128です。

だから、私はここで何が欠けていますか?

4

2 に答える 2

9

OK、試行錯誤の末に問題を解決しました。

純粋なバイト文字列形式の場合、署名と公開鍵データの両方を逆にする必要があります。つまり、最初のバイトから最後の位置へ、などです。その後、上記が機能します。

于 2011-02-08T16:56:11.720 に答える
-3

OpenSSL libCrypto を静的にコンパイルおよびリンクします。それは可能です、私はこれを元雇用主で見ました。

于 2011-02-08T11:04:09.817 に答える