欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

asp.net 数字签名实例代码

程序员文章站 2024-03-05 19:37:01
a给b发送信息,a会将信息用a的密码进行加密,然后将加密后的字符串和原文一起发给b,然后b用b的密码进行解密,然后判断解密后的字符串和a发过来的原文比对是否一致,关键问题在...
a给b发送信息,a会将信息用a的密码进行加密,然后将加密后的字符串和原文一起发给b,然后b用b的密码进行解密,然后判断解密后的字符串和a发过来的原文比对是否一致,关键问题在于,
a和密码和b的密码不一样,这个才是数字签名的精华,a的密码就是私钥,b的密码就是公钥
具体步骤:
生成一个私钥和公钥,a就用私钥进行加密,因为a的私钥只有a自己有,所以加密后的字符串就是a的签名字符串,然后a将这个签名的字符串和原文发给b,
b获取加密的字符串用公钥进行解密,然后判断解密后的字符串和原文是否一致,一致说明是a签名的,否则就不是a签名的
如果看的还有点迷糊,那么看完下面的例子,在去看上面的文字,估计就明白了
例如:私钥为s1,公钥为:g1 a的原文是:123 那么这个流程就是
s1+123 加密生成一个a签名的字符串:axxxx
a将axxxx和123一起发给b,b用g1将axxxx进行解密,判断解密后的字符串是否等于123
相信原理大家都明白了吧。。。明白原理了就好,。呵呵。。。其他的不说了,上代码。。。代码是学习别人的。。已经过测试。
aspx代码:
复制代码 代码如下:

<form id="form1" runat="server">
随机生成密钥:<asp:button id="btncreatemy" runat="server" text="随机生成密钥" onclick="btncreatemy_click" /><br />
公钥:<asp:textbox id="tbxcreatemy_publickey" runat="server" textmode="multiline" height="59px" readonly="true" width="711px"></asp:textbox><br />
私钥:<asp:textbox id="tbxcreatemy_key" runat="server" textmode="multiline" height="59px" readonly="true" width="710px"></asp:textbox><br /><hr />
<br />
生成签名:<br />
原文: 
<asp:textbox id="tbxcontent" runat="server" textmode="multiline" height="59px" width="711px"></asp:textbox> <br />
私钥:
<asp:textbox id="tbxkey" runat="server" textmode="multiline" height="59px" width="711px"></asp:textbox><br />
签名:
<asp:textbox id="tbxsign" runat="server" textmode="multiline" height="59px" readonly="true" width="711px"></asp:textbox>
<br />
<asp:button id="button1" runat="server" onclick="button1_click" text="生成签名" />
<br />
<br /><hr />
<br />
验证签名:<br />
原文:<asp:textbox id="tbxcontentyz" runat="server" textmode="multiline" height="59px" width="711px"></asp:textbox><br />
公钥:<asp:textbox id="tbxpublickeyyz" runat="server" textmode="multiline" height="59px" width="711px"></asp:textbox><br />
签名:<asp:textbox id="tbxsignyz" runat="server" textmode="multiline" height="59px" width="711px"></asp:textbox>
<br />
<asp:button id="button3" runat="server" onclick="button3_click" text="验证签名" />
</form>

cs代码
复制代码 代码如下:

/// <summary>
/// 生成签名
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void button1_click(object sender, eventargs e)
{
dsacryptoserviceprovider objdsa = new dsacryptoserviceprovider();
objdsa.fromxmlstring(tbxkey.text);
byte[] source = system.text.utf8encoding.utf8.getbytes(tbxcontent.text);
//数字签名
tbxsign.text = bitconverter.tostring(objdsa.signdata(source));
}
/// <summary>
/// 随机生成密钥
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btncreatemy_click(object sender, eventargs e)
{
dsacryptoserviceprovider objdsa = new dsacryptoserviceprovider();
tbxcreatemy_publickey.text = objdsa.toxmlstring(false);
tbxcreatemy_key.text = objdsa.toxmlstring(true);
}
/// <summary>
/// 验证签名
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void button3_click(object sender, eventargs e)
{
dsacryptoserviceprovider objdsa = new dsacryptoserviceprovider();
byte[] filehashvalue = new sha1cryptoserviceprovider().computehash(system.text.utf8encoding.utf8.getbytes(tbxcontentyz.text));
string[] strsplit = tbxsignyz.text.split('-');
byte[] signedhash = new byte[strsplit.length];
for (int i = 0; i < strsplit.length; i++)
signedhash[i] = byte.parse(strsplit[i], system.globalization.numberstyles.allowhexspecifier);
objdsa.fromxmlstring(tbxpublickeyyz.text);
bool ret = objdsa.verifysignature(filehashvalue, signedhash);
response.write(ret.tostring());
// qcd.core.web.messages.showdialog(ret.tostring());
}