3
Answers

How to store the Public and private key in xml using RSA algo

Hi Team,

How to store the public and private key in xml file and extract the same key  to create signature/ verify signature.

CODE:

public string SignXMLD(string rawxml) ///Signature Creation Method
{
    //Declaring variables
    string SourceData;
    byte[] tmpSource;
    byte[] tmpHash;
    SourceData = "AgencyBanking";
    ////Declaring variables
    //create a byte array from source data
    tmpSource = ASCIIEncoding.ASCII.GetBytes(SourceData);
    Console.WriteLine("Key Pairs are generating .............please wait for few moments.......");
    //RSAKeyPairGenerator generates the RSA key pair based on the random number and strength of the key required
    RsaKeyPairGenerator rsaKeyPairGen = new RsaKeyPairGenerator();
    rsaKeyPairGen.Init(new KeyGenerationParameters(new SecureRandom(), 2048));
    keyPair = rsaKeyPairGen.GenerateKeyPair();
    //Extracting the Private key from pair
    RsaKeyParameters PrivateKey = (RsaKeyParameters)keyPair.Private;
    //Store the private key in xml file   
    //How to store the private key generated from keypair into xml file and extract 
    //the same key and use it to generate the signature                                                                
    string str = PrivateKey.FromXmlString(true); 
    //Generate the Digital Signature 
    ISigner sign = SignerUtilities.GetSigner(PkcsObjectIdentifiers.Sha1WithRsaEncryption.Id);
    sign.Init(true, PrivateKey);
    sign.BlockUpdate(tmpSource, 0, tmpSource.Length);
    byte[] signature = sign.GenerateSignature();
    string xyz = Convert.ToBase64String(signature);
    Console.WriteLine();
    Console.WriteLine("The Digital Signature is : ");
    Console.WriteLine(ByteArrayToString(signature));
    XmlDocument objdocument = new XmlDocument();
    objdocument.LoadXml(rawxml);
    XmlDocument newXmlr = new XmlDocument();
    newXmlr.LoadXml("<root></root>");
    XmlNode rootNoder = newXmlr.ImportNode(objdocument.DocumentElement, true);
    newXmlr.DocumentElement.AppendChild(rootNoder);
    XmlDocument newXmlnew = new XmlDocument();
    XmlNode root = newXmlr.DocumentElement;
    //Create a new node.
    XmlElement elem = newXmlr.CreateElement("Signature");
    elem.InnerText = xyz;
    root.AppendChild(elem);
    string strXML = root.OuterXml;

    return strXML;

}

static string ByteArrayToString(byte[] arrInput)
{
    int i;
    StringBuilder sOutput = new StringBuilder(arrInput.Length);
    for (i = 0; i < arrInput.Length; i++)
    {
        sOutput.Append(arrInput[i].ToString("X".ToLower()));
    }
    return sOutput.ToString();
}

public bool SignXMLDResponse(string rawxml) //// SIgnature Verification Method
{
    //Declaring variables
    string SourceData;
    byte[] tmpSource;
    byte[] tmpHash;
    SourceData = "AgencyBanking";
    //create a byte array from source data
    tmpSource = ASCIIEncoding.ASCII.GetBytes(SourceData);
    Console.WriteLine();
    Console.WriteLine();
    Console.WriteLine("Key Pairs are generating .............please wait for few moments.......");
    //Extracting the Private key from pair
    bool status = false;
    RsaKeyParameters PublicKey = (RsaKeyParameters)keyPair.Public;

    //Verification of the Digital Signature
    try
    {
        XmlDocument newXmlnew = new XmlDocument();
        newXmlnew.LoadXml(rawxml);
        XmlNodeList nodeList = newXmlnew.GetElementsByTagName("Signature");
        foreach (XmlNode node in nodeList)
        {
            string s = node.InnerXml;
            byte[] signaturenew = Convert.FromBase64String(s);
            ISigner sign1 = SignerUtilities.GetSigner(PkcsObjectIdentifiers.Sha1WithRsaEncryption.Id);
            sign1.Init(false, PublicKey);
            sign1.BlockUpdate(tmpSource, 0, tmpSource.Length);
            status = sign1.VerifySignature(signaturenew);
        }
    }
    catch (Exception e)
    {
        Console.WriteLine("The Digital Signature is Valid" + e.Message + e.StackTrace);
    }
    return status;
}

Please assist me regarding this

Thanks

Answers (3)