2011-09-15 35 views
12

Đây là mã của tôi.Tại sao tôi nhận được "Ngoại lệ được chỉ định cho thuật toán không hợp lệ" ngoại lệ

X509Certificate pXCert = new X509Certificate2(@"keyStore.p12", "password"); 
RSACryptoServiceProvider csp = (RSACryptoServiceProvider)pXCert.PrivateKey; 
string id = CryptoConfig.MapNameToOID("SHA256"); 
return csp.SignData(File.ReadAllBytes(filePath), id); 

Trên dòng cuối cùng tôi nhận được ngoại lệ: "Thuật toán không hợp lệ theo quy định"

System.Security.Cryptography.CryptographicException

Tôi đang làm gì sai?

UPDATE:

id = 2.16.840.1.101.3.4.2.1

+0

Giá trị của 'id' là gì? – dtb

+0

Tôi đã cập nhật câu hỏi với giá trị của id. – scott

Trả lời

9

Không có vấn đề với mã NET hoặc mã CSP mà bạn cung cấp.

Vấn đề của bạn là CSP chỉ không hỗ trợ SHA 256. Bạn có thể nhận được thêm thông tin here

+0

Có cách nào để thực hiện công việc này không? Tôi đang chuyển này từ java và nó cần phải sử dụng các thuật toán tương tự. Theo như tôi có thể nói nó là sử dụng rsa + sha – scott

+0

Bạn có thể muốn kiểm tra http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha256.aspx đó là một lớp SHA256 trong. Nền tảng NET. Nhưng, tôi đã không sử dụng nó. –

+0

SHA256CryptoServiceProvider không chấp nhận khóa Asymetrical – scott

2

Lưu ý rằng tôi sử dụng SHA512 nhưng SHA256 sẽ làm việc với các ví dụ dưới đây:

"thuật toán không hợp lệ theo quy định" Đã cho tôi mãi mãi để tìm ra và tôi đã cố gắng thực tế tất cả mọi thứ. Đạo cụ cho Gonzalo Gallotti để đăng liên kết tới đoạn mã giúp tôi. Tôi nhận xét mã của tôi để hiển thị những gì từng bước đang làm. Chú ý: mã này sẽ không làm việc mà không có một giấy chứng nhận được tạo ra đúng được đăng dưới mẫu mã:

 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."); 
        } 
       } 
      } 
     } 
    } 

Tiếp - Giấy chứng nhận đã được SHA512 và sử dụng một (Cryptographic Service Provider) CSP đó là SHA512 Có khả năng. Dưới đây là danh sách các CSP và khả năng của chúng. Nếu bạn tìm SHA512, bạn sẽ tìm thấy "Nhà cung cấp mã hóa AA của Microsoft nâng cao và AES". Theo mặc định tạo ra các chứng chỉ không sử dụng này (ít nhất là trong Windows), do đó bạn phải xác định nó khi bạn tạo chứng chỉ.

Tạo khóa riêng và giấy chứng nhận - bước này sẽ hỏi bạn những câu hỏi, tiểu bang, khu vực vv vv

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

Tạo tập tin PFX để nhập khẩu vào cửa hàng chứng chỉ của bạn bằng cách sử dụng Microsoft Enhanced Provider RSA và AES Cryptographic:

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

Không chắc chắn những gì downvote về điều này là dành cho .. Nó chắc chắn đã giúp tôi, cảm ơn rất nhiều! +1 +1 –

1

Có vấn đề tương tự nhưng chỉ giải quyết được vấn đề. Nếu bạn không sử dụng X509 nhưng chỉ là RSACryptoServiceProvider đơn giản để lấy khóa, thì chỉ hỗ trợ SHA1.

Các vấn đề liên quan