Добавить открытый ключ к подписи XML-документа - PullRequest
0 голосов
/ 29 октября 2019

Я хотел бы добавить дополнительные RsaKeyValue KeyInfo, включающие public key в Digital Signature.

. Пользователь не должен сохранять certificate - вместо этого он может использовать * 1007. * чтобы проверить действительность документа.

Итак, вот моя функция подписи:

public static void SignXmlDocumentWithCertificate(XmlDocument xmlDoc, X509Certificate2 cert)
    {
        SignedXml signedXml = new SignedXml(xmlDoc);
        //we will sign it with private key
        signedXml.SigningKey = cert.PrivateKey;
        Reference reference = new Reference();
        //sign the entire doc
        reference.Uri = "";
        XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
        reference.AddTransform(env);
        signedXml.AddReference(reference);

        KeyInfo keyInfo = new KeyInfo();
        keyInfo.AddClause(new KeyInfoX509Data(cert));
        keyInfo.(cert);
        signedXml.KeyInfo = keyInfo;
        signedXml.ComputeSignature();

        // Get the XML representation of the signature and save
        // it to an XmlElement object.
        XmlElement xmlDigitalSignature = signedXml.GetXml();

        // Append the element to the XML document.
        xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true));
   }

В этом документе написано на C ++: https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.xml.rsakeyvalue?view=netframework-4.8

Прокрутите вниз, сделайте часть

// Добавьте RSAKeyValue KeyInfo (необязательно; помогает получателю найти ключ для проверки).

Как мне это сделать в C #?

Как добавить этот необязательный keyinfo с открытым ключом?

1 Ответ

0 голосов
/ 29 октября 2019

Я решил это после многих копаний и попыток. Чтобы отправить открытый ключ в подписи, я сделал следующее:

RSACryptoServiceProvider rsaprovider = (RSACryptoServiceProvider)cert.PublicKey.Key;
RSAKeyValue rkv = new RSAKeyValue(rsaprovider);
keyInfo.AddClause(rkv);

Это добавит следующее в XML:

        <KeyValue>
        <RSAKeyValue>
        <Modulus>t++UmV1G9ApuI118GdwK0BoxN3tjrxuQHTwKvlFgl6VrcLhMCb5Q2prga8I4HKLvLDr3L4bsrH0k9r6PPppqMpiN/KGdm6eB2uLnWtJXh1PWcnzfHfodYfQP/NAavIo4wSjss0L41c75/CA0x11iDdU4BOdTHGXaFCaNPQ5DLe3LK+6hjZ+fOYMpCd035TYTLo5+/Ttk5eCzr+MHfnWCaCIOUgkbq0OIUQWch2Sc9regIiA9oPPjUmmbqptLfm9wZBHRZZ+7Q4BewxSBBCIFt5yPhCsTZ1fFINV16tGtXTmtgXCagu4NiH7XsyhZhYDrA8CXb31Dn7M/ussNQkGrEQ==
        </Modulus>
        <Exponent>AQAB</Exponent>
        </RSAKeyValue>
        </KeyValue>
...