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());
}
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());
}
上一篇: 简单实现Android读取网络图片到本地
下一篇: php判断是否连接上网络的方法实例详解