2011-09-15 63 views
12

ここに私のコードです。「無効なアルゴリズムが指定されました」例外が発生するのはなぜですか

私は例外を取得しています最後の行に
X509Certificate pXCert = new X509Certificate2(@"keyStore.p12", "password"); 
RSACryptoServiceProvider csp = (RSACryptoServiceProvider)pXCert.PrivateKey; 
string id = CryptoConfig.MapNameToOID("SHA256"); 
return csp.SignData(File.ReadAllBytes(filePath), id); 

: "無効なアルゴリズムが指定されている"

System.Security.Cryptography.CryptographicException

私は間違っていますか?

UPDATE:

ID = 2.16.840.1.101.3.4.2.1

+0

'id'の値は何ですか? – dtb

+0

私はidの値で質問を更新しました。 – scott

答えて

9

.NETコードまたは指定したCSPコードと全く問題はありません。

あなたの問題は、CSPがちょうどSHA 256をサポートしていないことをあなたはより詳細な情報私はSHA512を使用here

+0

この作業を行う方法はありますか?私はこれをjavaから移植しており、同じアルゴリズムを使用する必要があります。限り、私はそれがrsa + sha – scott

+0

を使用していると言うことができると言うことができますhttp://msdn.microsoft.com/en-us/library/system.security.cryptography.sha256.aspxのSHA256クラスを確認することがあります。ネットフレームワーク。しかし、私はそれを使用していません。 –

+0

SHA256CryptoServiceProviderは非対称キーを受け入れません – scott

2

注意を得ることができますですが、SHA256、以下の例で動作します:

「指定された無効なアルゴリズム」私を永遠に理解することができました。私は事実上すべてを試しました。 Gonzalo Gallottiの小道具で、私を助けたコードへのリンクを投稿しました。私は各ステップが何をしているのかを示すために自分のコードにコメントしました。注:このコードは、コードサンプルの下に掲載されて適切に生成された証明書なしでは動作しません。

 public void GetCertificate() { 

     // Get the Machine Cert Store 
     var store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 

     string alg = CryptoConfig.MapNameToOID("SHA512"); 

     // Open the cert store 
     store.Open(OpenFlags.ReadWrite); 

     // Loop through each certificate within the store 
     foreach (X509Certificate2 myCert in store.Certificates) 
     { 
      // Get the certificate we are looking for 
      if (myCert.IssuerName.Name.Contains("CN=YourSite")) 
      { 
       // Check if the certificate has a private key 
       if (myCert.HasPrivateKey) 
       { 
        // Get your custom signature as a string 
        string mySignature = GetSignatureString(); 

        // Convert signature to byte array 
        byte[] originalData = Encoding.UTF8.GetBytes(mySignature); 

        // Create RSA provider from private key 
        RSACryptoServiceProvider rsaProvider = (RSACryptoServiceProvider)myCert.PrivateKey; 

        // Sign the signature with SHA512 
        byte[] signedSignature = signedSignature = rsaProvider.SignData(originalData, alg); 

        if (rsaProvider.VerifyData(originalData, alg, signedSignature)) 
        { 
         // Signature is verified Do Stuff 
        } 
        else 
        { 
         throw new Exception("The data does not match the signature."); 
        } 
       } 
      } 
     } 
    } 

次 - 証明書は、SHA512を可能とSHA512ことが可能であることをCSP(暗号化サービスプロバイダ)を使用する必要があります。ここにCSPとその機能のリストがあります。 SHA512を探す場合は、「Microsoft Enhanced RSA and AES Cryptographic Provider」があります。デフォルトでは、証明書を生成する際に(少なくともWindowsでは)これを使用しないので、証明書を作成するときに証明書を指定する必要があります。

秘密鍵と証明書を作成する - このステップはあなたに質問をします、状態、地域をなどなど

openssl req -x509 -nodes -sha512 -newkey rsa:2048 -keyout 512key.pem -out 512cert.pem -days 3650 

Microsoft拡張RSAとAES暗号化プロバイダを使用して、証明書ストアにインポートするPFXファイルを作成します。

openssl pkcs12 –export –in 512cert.pem –inkey 512key.pem –CSP “Microsoft Enhanced RSA and AES Cryptographic Provider” –out 512pfx.pfx 
+0

これについてのdownvoteが何だったかわからない。それは確かに私を助けた、ありがとう! +1 +1 –

1

同様の問題がありましたが、ただ解決しました。 X509を使用せず、単純なRSACryptoServiceProviderだけでキーを取得する場合は、SHA1だけがサポートされます。

関連する問題