5

遅くなった、疲れた、そしておそらくかなり密集している....

キーを生成するマシンでのみ実行されるように、保護する必要があるアプリケーションを作成しました。今のところ、BIOS シリアル番号を取得してハッシュを生成し、XML RSA 秘密鍵を使用して暗号化しています。次に、改ざんされないように XML に署名します。公開鍵をパッケージ化して署名を復号化および検証しようとしていますが、署名を生成したユーザーとは異なるユーザーとしてコードを実行しようとするたびに、署名でエラーが発生します。

私のコードのほとんどは、私が知りたいほど RSA 暗号化に精通していないため、見つけたサンプル コードを変更したものです。以下は、私が使用していたコードと、これを正しく機能させるために使用する必要があると思ったコードです...

この時点で、私が作業していた元のコードがこれだったので、フィードバックをいただければ幸いです。このコードは、プログラムを起動するユーザーが最初にドキュメントに署名したユーザーと同じである限り、正常に機能します...

 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,
            };

このコードは私がやるべきだと私が信じていることですが、同じユーザーであるか別のユーザーであるかに関係なく、何をしても署名を検証できません...

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

これはキーコンテナ名と関係があると思います(ここでは本当にばかげているので失礼します)これが最初のケースで機能する原因と、 2番目のケース....

cspParams.KeyContainerName = "XML_DSIG_RSA_KEY";

アプリケーション ライセンスの生成時に秘密鍵で XML に署名/暗号化してから、公開鍵をアプリ ディレクトリにドロップし、それを使用してコードを検証/復号化する方法はありますか? 署名部分が正しく機能するようになれば、暗号化部分を削除できます。キーイング元のライセンスコードの出所を難読化するためのバックアップとして使用していました。

これは意味がありますか?私はまったくの馬鹿ですか?

誰かがこれで私に与えることができる助けをありがとう..

4

2 に答える 2

5

この方法を使用して、xml ファイルに格納された秘密鍵を使用して xml ドキュメントに署名し、それをリソースとしてアプリケーション .dll に埋め込みました。キーストアへのアクセス許可に苦労している可能性があると思います。これにより、コードを他のサーバーなどに転送する手間も発生します。

秘密鍵を埋め込みリソースとして取得し、ドキュメントに署名するコードは次のとおりです。リソースの)

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

次のコードを使用して、private.xml および public.xml キーを生成します。明らかに、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
于 2010-03-30T20:38:55.807 に答える
0

問題は、さまざまなユーザーが最初のユーザー用に保存されているキーにアクセスできないことです(注意:私は暗号化の専門家ではありません)。

于 2010-05-14T19:06:58.127 に答える