CryptoApi を使用して、SHA1 ハッシュでメッセージに署名して検証するアプリケーションがあります。Windows XP から Windows 8 まで、何年にもわたって完全に機能していましたが、Windows 8.1 では機能しなくなりました。CryptSignHash がエラー コード 87 (無効なパラメーター) で失敗します。CryptVerifySignature は失敗しませんが、NTE_BAD_SIGNATURE を返します (Windows 8 で作成された有効な署名の場合)。Windows 8 以下で動作し、Windows 8.1 では失敗します。
これをさらにデバッグする方法についてのアイデアはありますか? インポートした公開鍵と秘密鍵を再度エクスポートし、それらが正しいことを確認しました。「私たちの」キーの使用をスキップし、新しいキーを生成しました -> 署名もエラー 87 で失敗しました 新しいキーを生成し、RSA_FULL と DES を使用してメッセージを暗号化/復号化しました -> 問題なく、期待どおりに動作します。RSA_FULL プロバイダーのバージョンを確認しました。Windows 8 と Windows 8.1 の両方で 2.0 です。プロバイダー名を明示的に指定してみました: Microsoft Base Cryptographic Provider v1.0
Windows 8.1 で署名が機能する人はいますか?
Windows 8.1 の新機能は他にありますか。署名が機能しなくなる可能性がありますか?知っておくべきプロバイダーやアルゴリズムに関して何か変更はありましたか?
アプリケーションは Delphi で記述されており、ほぼ次のフローを使用します。
//Setup crypto provider
CryptAcquireContext(@fhCryptProv, nil, nil, cptRSAFull, [ccVerify, ccMachineKeySet]);
//Create a hash structure
CryptCreateHash( fProvider.GetProviderHandle, chtSHA1, 0, 0, @fhHash);
//Import the private key for signing
CryptImportKey( fProvider.GetProviderHandle, @buff[0], len, 0, CRYPT_EXPORTABLE, @fKey);
//Hash the message
CryptHashData(fhHash, @aPlainText[1], length(aPlainText) * 2, 0);
//Sign the message
CryptSignHash(fhHash, AT_SIGNATURE, nil, CRYPT_NOHASHOID OR CRYPT_X931_FORMAT, @buff, @len);