2010-03-30 38 views
5

đó là muộn, tôi mệt mỏi, và có lẽ là khá dày đặc ....Securing key bản quyền với khóa RSA

Tôi đã viết một ứng dụng mà tôi cần phải đảm bảo vì vậy nó sẽ chỉ chạy trên máy mà tôi tạo khóa cho. Những gì tôi đang làm bây giờ là lấy số sêri BIOS và tạo ra một băm từ đó, sau đó tôi mã hóa nó bằng cách sử dụng khóa riêng XML RSA. Sau đó tôi ký XML để đảm bảo rằng nó không bị giả mạo. Tôi đang cố gắng đóng gói khóa công khai để giải mã và xác minh chữ ký, nhưng mỗi khi tôi cố gắng thực thi mã với tư cách người dùng khác với mã đã tạo chữ ký, tôi nhận được lỗi trên chữ ký.

Hầu hết mã của tôi được sửa đổi từ mã mẫu tôi đã tìm thấy vì tôi không quen thuộc với mã hóa RSA như tôi muốn. Dưới đây là mã tôi đang sử dụng và mã tôi nghĩ mình cần sử dụng để có được quyền làm việc này ...

Bất kỳ phản hồi nào sẽ được đánh giá rất cao vì tôi bị mất hoàn toàn tại thời điểm này mã gốc mà tôi đang làm việc là này, mã này hoạt động tốt miễn là người dùng tung ra chương trình là một trong những giống đã ký văn bản ban đầu ...

CspParameters cspParams = new CspParameters(); 
      cspParams.KeyContainerName = "XML_DSIG_RSA_KEY"; 
      cspParams.Flags = CspProviderFlags.UseMachineKeyStore; 

      // Create a new RSA signing key and save it in the container. 
      RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams) 
      { 
       PersistKeyInCsp = true, 
      }; 

mã này là những gì tôi tin rằng tôi nên làm nhưng nó không xác minh chữ ký bất kể tôi làm gì, bất kể đó là cùng một người dùng hay một người khác ...

RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(); 
      //Load the private key from xml file 
      XmlDocument xmlPrivateKey = new XmlDocument(); 
      xmlPrivateKey.Load("KeyPriv.xml"); 
      rsaKey.FromXmlString(xmlPrivateKey.InnerXml); 

Tôi tin rằng điều này có liên quan đến tên container chính (Thực sự là một cạm bẫy ở đây, xin lỗi) Tôi chắc chắn rằng đây là dòng khiến cả hai làm việc trong trường hợp đầu tiên và ngăn chặn nó làm việc trong trường hợp thứ hai ....

cspParams.KeyContainerName = "XML_DSIG_RSA_KEY"; 

có cách nào cho tôi để đăng ký/mã hóa XML với một khóa bí mật khi giấy phép ứng dụng được tạo ra và sau đó thả phím nào trong thư mục ứng dụng và sử dụng để xác minh/giải mã? Tôi có thể thả phần mã hóa nếu tôi có thể nhận được phần chữ ký làm việc đúng. Tôi đã sử dụng nó như một bản sao lưu để làm xáo trộn nguồn gốc của mã bản quyền mà tôi đang khóa.

Có bất kỳ điều này có ý nghĩa không? Tôi có phải là tổng số không?

Nhờ sự giúp đỡ bất cứ ai có thể cho tôi trong này ..

Trả lời

5

tôi đã sử dụng phương pháp này để ký các văn bản xml sử dụng một khóa bí mật được lưu trữ trong một tập tin xml mà tôi sau đó nhúng vào .dll ứng dụng như một nguồn tài nguyên. Tôi nghĩ rằng bạn có thể gặp khó khăn với quyền truy cập vào kho khóa và điều này cũng sẽ tạo phức tạp chuyển mã sang các máy chủ khác, v.v.

Đây là mã để nhận khóa riêng tư dưới dạng tài nguyên được nhúng và ký vào tài liệu: (Đăng là tên của lớp phương pháp này nằm ở, Licensing.Private.Private.xml là sự kết hợp của không gian tên mặc định + folder + filename của tài nguyên)

public static void SignDocument(XmlDocument xmldoc) 
{ 
    //Get the XML content from the embedded XML privatekey. 
    Stream s = null; 
    string xmlkey = string.Empty; 
    try 
    { 
     s = typeof(Sign).Assembly.GetManifestResourceStream("Licensing.Private.Private.xml"); 

     // Read-in the XML content. 
     StreamReader reader = new StreamReader(s); 
     xmlkey = reader.ReadToEnd(); 
     reader.Close(); 
    } 
    catch (Exception e) 
    { 
     throw new Exception("Error: could not import key:",e); 
    } 

    // Create an RSA crypto service provider from the embedded 
    // XML document resource (the private key). 
    RSACryptoServiceProvider csp = new RSACryptoServiceProvider(); 
    csp.FromXmlString(xmlkey); 
    //Creating the XML signing object. 
    SignedXml sxml = new SignedXml(xmldoc); 
    sxml.SigningKey = csp; 

    //Set the canonicalization method for the document. 
    sxml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigCanonicalizationUrl; // No comments. 

    //Create an empty reference (not enveloped) for the XPath transformation. 
    Reference r = new Reference(""); 

    //Create the XPath transform and add it to the reference list. 
    r.AddTransform(new XmlDsigEnvelopedSignatureTransform(false)); 

    //Add the reference to the SignedXml object. 
    sxml.AddReference(r); 

    //Compute the signature. 
    sxml.ComputeSignature(); 

    // Get the signature XML and add it to the document element. 
    XmlElement sig = sxml.GetXml(); 
    xmldoc.DocumentElement.AppendChild(sig); 
} 

Sử dụng đoạn mã sau sự tạo ra các tin .xml và các tệp public.xml. Giữ an toàn cho tệp private.xml.

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 
File.WriteAllText(@"C:\privateKey.xml", rsa.ToXmlString(true)); // Private Key 
File.WriteAllText(@"C:\publicKey.xml", rsa.ToXmlString(false)); // Public Key 
+0

Tuyệt vời! Cảm ơn đã giúp đỡ! Điều này không chỉ khắc phục vấn đề giấy phép của tôi mà còn giúp tôi quản lý các tài nguyên khác trong ứng dụng của mình. –

+0

Chỉ cần nhận thấy tôi không xử lý StreamReader ở đó cuối cùng trong khối try try ... –

0

Đoán rằng, người dùng khác không có quyền truy cập vào khóa được lưu trữ cho người dùng thứ nhất (Xin lưu ý: Tôi không phải là chuyên gia mật mã).

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