C#と.NetCFを使用してX.509証明書を検証しようとしています。私はCA証明書を持っています。正しく理解している場合は、このCA証明書の公開鍵を使用して、信頼できない証明書の署名を復号化する必要があります。これにより、信頼できない証明書の計算されたハッシュ値が得られるはずです。次に、証明書のハッシュを自分で計算し、2つの値が一致することを確認する必要があります。
私はこれで数日間遊んでいますが、それほど遠くはありません。X509CertificateクラスとRSACryptoServiceProviderクラスを使用しています。まず、X509Certificateクラスから公開鍵と署名を取得しようとしました。公開鍵は取得できましたが、署名は取得できませんでした。次に、証明書を構成するバイナリデータを解析して、署名(およびその他の必要なデータ)を取得できるようにしましたが、RSACryptoServiceProviderを使用して署名を復号化できませんでした。私はこのようなことを試みましたが、復号化しようとすると「不正なキー」という例外が発生し続けました。
RSAParameters rsaParams = new RSAParameters();
rsaParams.Exponent = exp;
rsaParams.Modulus = mod;
RSACryptoServiceProvider rsaServ = new RSACryptoServiceProvider();
rsaServ.ImportParameters(rsaParams);
byte[] decryptedSig = rsaServ.Decrypt(encryptedSig, false);
アドバイスをいただければ幸いです。
編集:私はより良いように見えるが奇妙な結果を返している何かを試しました。テストが少し簡単なため、ここではX509Certificate2クラスを使用していますが、後で.NetCF用にX509Certificateに切り替える必要があります。RSACryptoServiceProvider.VerifyDataが必要なものかもしれないと思います。次のコードを試しました。
X509Certificate2 cert = new X509Certificate2(certBytes);
X509Certificate2 certCA1 = new X509Certificate2(@"C:\certs\certCA1.cer");
byte[] encryptedSig = new byte[256];
Array.Copy(certBytes, certBytes.Length - 256, encryptedSig, 0, 256);
RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)certA1.PublicKey.Key;
bool good = rsa.VerifyData(cert.RawData, "1.3.14.3.2.26", encryptedSig);
私が言ったように、私は証明書のバイナリデータを手動でデコードして解釈することができるので、cert.RawDataは証明書の署名されたデータであり、最後の256バイトは暗号化された署名であると確信しています。文字列は、証明書から取得したハッシュアルゴリズムのOIDですが、100%正しいかどうかはわかりません。VerificationDataはfalseを返しますが、理由はまだわかりません。
考え?