#副標=安全管制新功能(2)
#大標=網頁資料加密與簽章
#眉標= ASP.NET 2.0
#作者=文/王寧疆
================== box 程式1 ===============
txtProtectedData.Text = Convert.ToBase64String(
ProtectedData.Protect(data, entropy,
DataProtectionScope.CurrentUser));
============ end ============
=============== box 程式2 =================
txtRestore.Text = Encoding.UTF8.GetString(
ProtectedData.Unprotect(data, entropy,
DataProtectionScope.CurrentUser));
================== end ==================
============== box 程式3 =============
//存放欲加密的資料的陣列
byte[] buf=new byte[16];
//欲加密的資料
string strData = "Test secret data";
//將欲加密的資料放入陣列
buf = Encoding.UTF8.GetBytes(strData);
================ end =================
=============== box 程式4 =============
<%@ Page Language="C#" ValidateRequest="false"
AutoEventWireup="true" CodeFile="Default.aspx.cs"
Inherits="_Default" %>
================== end ==================
================= box 程式5 ====================
private void ShowXmlFile(string strFileName)
{
//建立負責讀取檔案的StreamReader類別的物件
StreamReader sr = new StreamReader(strFileName,
Encoding.Default);
//將檔案的內容讀到TextBox控制項
TextBox1.Text = sr.ReadToEnd();
//關閉檔案
sr.Close();
}
====================== end ===================
=============== box 程式6 =================
protected void Page_Load(object sender, EventArgs e)
{
//只有網頁第一次執行才需要執行的工作
if (!IsPostBack)
{
//建立RSACryptoServiceProvider類別的物件
RSA Signkey= new RSACryptoServiceProvider();
//匯出驗証數位簽章使用的公開金鑰
Session["VerifyPublicKey"] =
Signkey.ExportParameters(false);
//匯出執行數位簽章使用的私密金鑰
Session["SignPrivateKey"] =
Signkey.ExportParameters(true);
//建立RSACryptoServiceProvider類別的物件
RSA EncryptKey =
new RSACryptoServiceProvider();
//匯出執行XML文件解密使用的私密金鑰
Session["DecryptPrivateKey"] =
EncryptKey.ExportParameters(true);
//匯出執行XML文件加密使用的公開金鑰
Session["EncryptPublicKey"] =
EncryptKey.ExportParameters(false);
}
}
====================== end ====================
================== box 程式7 =================
protected void btnLoad_Click(object sender, EventArgs e)
{
//顯示名稱為Customers.xml的XML文件的內容到網頁上
ShowXmlFile(Server.MapPath("~/Customers.xml"));
}
====================== end ===================
=================== box 程式8 ====================
protected void btnSign_Click(object sender, EventArgs e)
{
//建立XmlDocument類別的物件
XmlDocument doc = new XmlDocument();
//載入檔案名稱為Customers.xml的XML文件
doc.Load(Server.MapPath("~/Customers.xml"));
//建立SignedXml類別的物件
SignedXml sig = new SignedXml(doc);
//建立RSACryptoServiceProvider類別的物件
RSA key = new RSACryptoServiceProvider();
//匯入簽章用的私密金鑰
key.ImportParameters((RSAParameters)Session["SignPrivateKey"]);
//將匯入的私密金鑰拿給SignedXml類別的物件使用
sig.SigningKey = key;
//傳入空字串表示要對整份文件執行數位簽章
Reference refr = new Reference("");
//簽章文件的Transform方法
refr.AddTransform(new XmlDsigEnvelopedSignatureTransform());
//加入參考關係
sig.AddReference(refr);
//執行數位簽章
sig.ComputeSignature();
//將簽章的結果加到XML文件的結尾
doc.DocumentElement.AppendChild(sig.GetXml());
//儲存帶簽章內容的XML文件
doc.Save(Server.MapPath("~/Customers-signed.xml"));
//顯示帶簽章內容的XML文件
ShowXmlFile(Server.MapPath("~/Customers-signed.xml"));
//不顯示錯誤訊息
lblMessage.Text = "";
}
======================= end ==================
================== box 程式9 ====================
XML文件原有的內容
原文省略
數位簽章
======================= end ======================
===================== box 程式10 ====================
protected void btnVerify_Click(object sender, EventArgs e)
{
//建立XmlDocument類別的物件
XmlDocument doc = new XmlDocument();
//載入檔案名稱為Customers-signed xml的XML文件
doc.Load(Server.MapPath("~/Customers-signed.xml"));
//建立XmlNamespaceManager類別的物件
XmlNamespaceManager nsm =
new XmlNamespaceManager(new NameTable());
//加入XML文件簽章的標準Namespace
nsm.AddNamespace("dsig", SignedXml.XmlDsigNamespaceUrl);
//取得dsig:Signature標籤
XmlElement sigElt =
(XmlElement)doc.SelectSingleNode("//dsig:Signature", nsm);
//建立SignedXml類別的物件
SignedXml sig = new SignedXml(doc);
//載入指定的標籤的內容
sig.LoadXml(sigElt);
//建立RSACryptoServiceProvider類別的物件
RSA key = new RSACryptoServiceProvider();
//匯入驗証簽章用的公開金鑰
key.ImportParameters((RSAParameters)Session["VerifyPublicKey"]);
//如果簽章驗証無誤
if (sig.CheckSignature(key))
{
//顯示簽章正確的訊息
lblMessage.Text = "驗証正確";
}
else
{
//顯示簽章有誤的訊息
lblMessage.Text = "驗証失敗";
}
}
======================= end ==================
=================== box 程式11 ======================
protected void btnEncrypt_Click(object sender, EventArgs e)
{
//建立XmlDocument類別的物件
XmlDocument doc = new XmlDocument();
//載入檔案名稱為Customers-signed.xml的XML文件
doc.Load(Server.MapPath("~/Customers-signed.xml"));
//建立EncryptedXml類別的物件
EncryptedXml exml = new EncryptedXml(doc);
//建立RSACryptoServiceProvider類別的物件
RSA key = new RSACryptoServiceProvider();
//匯入加密XML文件用的公開金鑰
key.ImportParameters(
(RSAParameters)Session["EncryptPublicKey"]);
//指定要使用匯入的公開金鑰加密名稱為Customer標籤的內容
exml.AddKeyNameMapping("Customer", key);
//取出Customers標籤中的Customer標籤
XmlElement CustomerElement =
(XmlElement)doc.SelectSingleNode("//Customers/Customer");
//加密指定的標籤的內容
EncryptedData encryptedPayment =
exml.Encrypt(CustomerElement, "Customer");
//使用加密後的內容置換掉原有標籤的內容
EncryptedXml.ReplaceElement(CustomerElement,
encryptedPayment, false);
//將加密後的內容儲存成新的XML文件
doc.Save(Server.MapPath("~/Customers-signed-encrypted.xml"));
//顯示加密後的新XML文件
ShowXmlFile(Server.MapPath("~/Customers-signed-encrypted.xml"));
//不顯示錯誤訊息
lblMessage.Text = "";
}
======================== end =========================
=================== box 程式12 =====================
經過加密的Customer標籤內容
2
Mary
2222
========================= end ======================
================ box 程式13 ===================
protected void btnDecrypt_Click(object sender, EventArgs e)
{
//建立XmlDocument類別的物件
XmlDocument doc = new XmlDocument();
//載入檔案名稱為Customers-signed-encrypted.xml的XML文件
doc.Load(Server.MapPath("~/Customers-signed-encrypted.xml"));
//建立EncryptedXml類別的物件
EncryptedXml exml = new EncryptedXml(doc);
//建立RSACryptoServiceProvider類別的物件
RSA key = new RSACryptoServiceProvider();
//匯入解密XML文件用的私密金鑰
key.ImportParameters((RSAParameters)Session["DecryptPrivateKey"]);
//指定要使用匯入的私密金鑰解密名稱為Customer標籤的內容
exml.AddKeyNameMapping("Customer", key);
//解密XML文件中被加密的標籤內容
exml.DecryptDocument();
//將解密後的內容儲存成新的XML文件
doc.Save(Server.MapPath("~/Customers-signed-decrypted.xml"));
//顯示解密後的新XML文件
ShowXmlFile(Server.MapPath("~/Customers-signed-decrypted.xml"));
//不顯示錯誤訊息
lblMessage.Text = "";
}
======================= end ==================