RSAServiceProvider를 이용해서 xml 파일에 서명 및 Decryption 하는 과정
RSAServiceProvider를 제공된 public key를 이용해서 얻어내는 것이 이 코드의 핵심.
RSAServiceProvider를 제공된 public key를 이용해서 얻어내는 것이 이 코드의 핵심.
private String publicOnlyKey;
private void btnSign_Click(object sender, EventArgs e)
{
try
{
/////////////////////////////////////////////////////////////////
// Create a new RSA signing key and export public key for
// verification.
RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider();
//Public Key exported
//Public Key 뿐 아니라 Private Key도 얻어내는 것이 가능하다. 사용자에게 Key를 보내거나 저장할 때 이용 가능
publicOnlyKey = rsaKey.ToXmlString(false);
tbxRSAParameters.Text = publicOnlyKey;
/////////////////////////////////////////////////////////////////
// Sign the XML document.
//
SignXml(xmlDoc, rsaKey);
MessageBox.Show("XML file signed.");
/////////////////////////////////////////////////////////////////
// Save and display the signed document.
//
xmlDoc.Save("test1.xml");
tbxDigitalSignature.Text = xmlDoc.OuterXml;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
///XML파일을 RSA를 이용해서 서명. SignedXml class가 있는 것을 기억하고 있을것!
public static void SignXml(XmlDocument Doc, RSA Key)
{
// Check arguments.
if (Doc == null)
throw new ArgumentException("Doc");
if (Key == null)
throw new ArgumentException("Key");
try
{
// Create a SignedXml object to generate signature.
SignedXml signedXml = new SignedXml(Doc);
// Add the key to the SignedXml document
signedXml.SigningKey = Key;
// Create a reference to be signed
Reference reference = new Reference();
reference.Uri = "";
// Add an enveloped transformation to the reference
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);
// Add the reference to the SignedXml object
signedXml.AddReference(reference);
// Compute the signature
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.
Doc.DocumentElement.AppendChild(Doc.ImportNode(xmlDigitalSignature, true));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void btnVerify_Click(object sender, EventArgs e)
{
/////////////////////////////////////////////////////////////////////
// Create a new RSA signing key and import public key for
// verification.
//
//NOTE:Public RSA Key를 이용해서 RSACryptoService Generate
RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider();
rsaKey.FromXmlString(publicOnlyKey);
/////////////////////////////////////////////////////////////////////
// Load the signed XML, and call VerifyXml to verify the signature of
// the signed XML.
//
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("test1.xml");
bool result = VerifyXml(xmlDoc, rsaKey);
if (result)
{
MessageBox.Show("The XML signature is valid.");
}
else
{
MessageBox.Show("The XML signature is not valid.");
}
}
public static Boolean VerifyXml(XmlDocument Doc, RSA Key)
{
// Check arguments.
if (Doc == null)
throw new ArgumentException("Doc");
if (Key == null)
throw new ArgumentException("Key");
/////////////////////////////////////////////////////////////////////
// Create a SignedXml object to verify the signature
//
SignedXml signedXml = new SignedXml(Doc);
// Find Signature node and create a new XmlNodeList object
XmlNodeList nodeList = Doc.GetElementsByTagName("Signature");
// Throw an exception if no signature was found.
if (nodeList.Count <= 0)
{
throw new CryptographicException(
"Verification failed:" +
" No Signature was found in the document.");
}
// This example only supports one signature for entire XML document
if (nodeList.Count >= 2)
{
throw new CryptographicException(
"Verification failed: More that one signature was found.");
}
// Load the first node.
signedXml.LoadXml((XmlElement)nodeList[0]);
// Check the signature and return the result.
return signedXml.CheckSignature(Key);
}
private void btnChangeXML_Click(object sender, EventArgs e)
{
// Modify the value of the Xml document for test.
XDocument xDoc = XDocument.Load("test1.xml");
if (xDoc != null)
{
xDoc.Element("invoice").Element("items").
Element("creditcard").Element("number").SetValue("19834210");
xDoc.Save("test1.xml");
tbxModifiedMessage.Text = xDoc.ToString();
}
}



