📄 java加密和数字签名编程快速入门1.htm
字号:
<TR>
<TD vAlign=top background=Java加密和数字签名编程快速入门1.files/newhard-040906_c_1.gif
bgColor=#f0f2fb height=1></TD></TR>
<TR>
<TD vAlign=top bgColor=#f0f2fb height=10></TD></TR>
<TR>
<TD vAlign=top bgColor=#f0f2fb>
<TABLE cellSpacing=0 cellPadding=0 width=590 align=center border=0>
<TBODY>
<TR>
<TD><SPAN
class=f14> 本文主要谈一下密码学中的加密和数字签名,以及其在java中如何进行使用。对密码学有兴趣的伙伴,推荐看Bruce
Schneier的著作:Applied
Crypotography。在jdk1.5的发行版本中安全性方面有了很大的改进,也提供了对RSA算法的直接支持,现在我们从实例入手解决问题(本文仅是作为简单介绍):
<BR><BR> <STRONG>一、密码学上常用的概念</STRONG> <BR><BR> 1)消息摘要:<BR><BR> 这是一种与消息认证码结合使用以确保消息完整性的技术。主要使用单向散列函数算法,可用于检验消息的完整性,和通过散列密码直接以文本形式保存等,目前广泛使用的算法有MD4、MD5、SHA-1,jdk1.5对上面都提供了支持,在java中进行消息摘要很简单,
java.security.MessageDigest提供了一个简易的操作方法:<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf
border=1>
<TBODY>
<TR>
<TD>/**<BR>*MessageDigestExample.java<BR>*Copyright
2005-2-16<BR>*/<BR>import
java.security.MessageDigest;<BR>/**<BR>*单一的消息摘要算法,不使用密码.可以用来对明文消息(如:密码)隐藏保存<BR>*/<BR>public
class MessageDigestExample{<BR> public static void
main(String[] args) throws
Exception{<BR> if(args.length!=1){<BR> System.err.println("Usage:java
MessageDigestExample
text");<BR> System.exit(1);<BR> }<BR><BR> byte[]
plainText=args[0].getBytes("UTF8");<BR><BR> //使用getInstance("算法")来获得消息摘要,这里使用SHA-1的160位算法<BR> MessageDigest
messageDigest=MessageDigest.getInstance("SHA-1");<BR><BR> System.out.println("\n"+messageDigest.getProvider().getInfo());<BR> //开始使用算法<BR> messageDigest.update(plainText);<BR> System.out.println("\nDigest:");<BR> //输出算法运算结果<BR> System.out.println(new
String(messageDigest.digest(),"UTF8"));<BR> }<BR>}</TD></TR></TBODY></TABLE><BR> 还可以通过消息认证码来进行加密实现,javax.crypto.Mac提供了一个解决方案,有兴趣者可以参考相关API文档,本文只是简单介绍什么是摘要算法。<BR><BR> 2)私钥加密:<BR><BR> 消息摘要只能检查消息的完整性,但是单向的,对明文消息并不能加密,要加密明文的消息的话,就要使用其他的算法,要确保机密性,我们需要使用私钥密码术来交换私有消息。<BR><BR> 这种最好理解,使用对称算法。比如:A用一个密钥对一个文件加密,而B读取这个文件的话,则需要和A一样的密钥,双方共享一个私钥(而在web环境下,私钥在传递时容易被侦听):<BR><BR> 使用私钥加密的话,首先需要一个密钥,可用javax.crypto.KeyGenerator产生一个密钥(java.security.Key),然后传递给一个加密工具(javax.crypto.Cipher),该工具再使用相应的算法来进行加密,主要对称算法有:DES(实际密钥只用到56位),AES(支持三种密钥长度:128、192、256位),通常首先128位,其他的还有DESede等,jdk1.5种也提供了对对称算法的支持,以下例子使用AES算法来加密:<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf
border=1>
<TBODY>
<TR>
<TD>/**<BR>*PrivateExmaple.java<BR>*Copyright
2005-2-16<BR>*/<BR>import javax.crypto.Cipher;<BR>import
javax.crypto.KeyGenerator;<BR>import
java.security.Key;<BR><BR>/**<BR>*私鈅加密,保证消息机密性<BR>*/<BR>public
class PrivateExample{<BR> public static void main(String[]
args) throws
Exception{<BR> if(args.length!=1){<BR> System.err.println("Usage:java
PrivateExample
<text>");<BR> System.exit(1);<BR> }<BR> byte[]
plainText=args[0].getBytes("UTF8");<BR><BR> //通过KeyGenerator形成一个key<BR> System.out.println("\nStart
generate AES key");<BR> KeyGenerator
keyGen=KeyGenerator.getInstance("AES");<BR> keyGen.init(128);<BR> Key
key=keyGen.generateKey();<BR> System.out.println("Finish
generating DES
key");<BR><BR> //获得一个私鈅加密类Cipher,ECB是加密方式,PKCS5Padding是填充方法<BR> Cipher
cipher=Cipher.getInstance("AES/ECB/PKCS5Padding");<BR> System.out.println("\n"+cipher.getProvider().getInfo());<BR><BR> //使用私鈅加密<BR> System.out.println("\nStart
encryption:");<BR> cipher.init(Cipher.ENCRYPT_MODE,key);<BR> byte[]
cipherText=cipher.doFinal(plainText);<BR> System.out.println("Finish
encryption:");<BR> System.out.println(new
String(cipherText,"UTF8"));<BR><BR> System.out.println("\nStart
decryption:");<BR> cipher.init(Cipher.DECRYPT_MODE,key);<BR> byte[]
newPlainText=cipher.doFinal(cipherText);<BR> System.out.println("Finish
decryption:");<BR><BR> System.out.println(new
String(newPlainText,"UTF8"));<BR><BR> }<BR>}</TD></TR></TBODY></TABLE><BR> 3)公钥加密:<BR><BR> 上面提到,私钥加密需要一个共享的密钥,那么如何传递密钥呢?web环境下,直接传递的话很容易被侦听到,幸好有了公钥加密的出现。公钥加密也叫不对称加密,不对称算法使用一对密钥对,一个公钥,一个私钥,使用公钥加密的数据,只有私钥能解开(可用于加密);同时,使用私钥加密的数据,只有公钥能解开(签名)。但是速度很慢(比私钥加密慢100到1000倍),公钥的主要算法有RSA,还包括Blowfish,Diffie-Helman等,jdk1.5种提供了对RSA的支持,是一个改进的地方:
<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf
border=1>
<TBODY>
<TR>
<TD>/**<BR>*PublicExample.java<BR>*Copyright
2005-2-16<BR>*/<BR>import java.security.Key;<BR>import
javax.crypto.Cipher;<BR>import
java.security.KeyPairGenerator;<BR>import
java.security.KeyPair;<BR>/**<BR>*一个简单的公鈅加密例子,Cipher类使用KeyPairGenerator生成的公鈅和私鈅<BR>*/<BR>public
class PublicExample{<BR> public static void main(String[]
args) throws
Exception{<BR> if(args.length!=1){<BR> System.err.println("Usage:java
PublicExample
<text>");<BR> System.exit(1);<BR> }<BR><BR> byte[]
plainText=args[0].getBytes("UTF8");<BR> //构成一个RSA密钥<BR> System.out.println("\nStart
generating RSA key");<BR> KeyPairGenerator
keyGen=KeyPairGenerator.getInstance("RSA");<BR> keyGen.initialize(1024);<BR> KeyPair
key=keyGen.generateKeyPair();<BR> System.out.println("Finish
generating RSA
key");<BR><BR> //获得一个RSA的Cipher类,使用公鈅加密<BR> Cipher
cipher=Cipher.getInstance("RSA/ECB/PKCS1Padding");<BR> System.out.println("\n"+cipher.getProvider().getInfo());<BR><BR> System.out.println("\nStart
encryption");<BR> cipher.init(Cipher.ENCRYPT_MODE,key.getPublic());<BR> byte[]
cipherText=cipher.doFinal(plainText);<BR> System.out.println("Finish
encryption:");<BR> System.out.println(new
String(cipherText,"UTF8"));<BR><BR> //使用私鈅解密<BR> System.out.println("\nStart
decryption");<BR> cipher.init(Cipher.DECRYPT_MODE,key.getPrivate());<BR> byte[]
newPlainText=cipher.doFinal(cipherText);<BR> System.out.println("Finish
decryption:");<BR> System.out.println(new
String(newPlainText,"UTF8"));<BR> }<BR>}</TD></TR></TBODY></TABLE><BR></SPAN><BR></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD vAlign=top bgColor=#f0f2fb height=10></TD></TR>
<TR>
<TD vAlign=top background=Java加密和数字签名编程快速入门1.files/newhard-040906_c_1.gif
bgColor=#f0f2fb height=1></TD></TR>
<TR>
<TD vAlign=top bgColor=#dee2f5>
<TABLE height=25 cellSpacing=0 cellPadding=0 width=590 align=center
border=0>
<TBODY>
<TR>
<TD width=90></TD>
<TD align=right width=480>
<P align=right><FONT color=red>1 <A
href="http://www.yesky.com/SoftChannel/72342371961929728/20050217/1911753_1.shtml">2</A>
<A
href="http://www.yesky.com/SoftChannel/72342371961929728/20050217/1911753_2.shtml">3</A>
<A
href="http://www.yesky.com/SoftChannel/72342371961929728/20050217/1911753_1.shtml">下一页</A></FONT></P></TD>
<TD align=middle width=20></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD vAlign=top background=Java加密和数字签名编程快速入门1.files/newhard-040906_c_1.gif
bgColor=#f0f2fb height=1></TD></TR>
<TR>
<TD vAlign=top width=603 bgColor=#f0f2fb>
<SCRIPT language=JavaScript
src="Java加密和数字签名编程快速入门1.files/channel.js"></SCRIPT>
<SCRIPT language=JavaScript><!--var path = location.pathname;var aid = 0;var cid = 0;var channelid = 0;reg = /\/(\w+)\/(\d+)\/(\d+)\/(\d+)/;if(reg.test(path)) { reg.exec(path); aid = RegExp.$4; cid = RegExp.$2; var ename = RegExp.$1; channelid = getChannelID(ename);}//--></SCRIPT>
<SPAN id=commentsSpanText></SPAN>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=3 width="100%"
align=center bgColor=#eef8fd borderColorLight=#666666 border=0>
<TBODY>
<TR vAlign=top>
<TD vAlign=bottom align=middle><A href="http://my.yesky.com/"
target=_blank>天极社区</A>邀请您:<A href="http://blog.yesky.com/"
target=_blank><FONT color=#ff8000>写博客日记</FONT></A> <A
href="http://photo.yesky.com/" target=_blank><FONT
color=#ff8000>上传相片</FONT></A> <A
href="http://bbs.yesky.com/" target=_blank><FONT
color=#ff8000>论坛聊天</FONT></A> <A
href="http://bbs.yesky.com/" target=_blank><FONT
color=#ff8000>订阅电子杂志</FONT></A> <A
href="http://hot.yesky.com/"><FONT
color=#ff0000>推荐网摘</FONT></A> <A
title="推荐到天极网摘 http://hot.yesky.com [鼠标划选本文摘要,然后点击本图片]"
href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(yesky=window.open('http://hot.yesky.com/dp.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t)+'&st=2','yesky','scrollbars=no,width=400,height=480,left=75,top=20,status=no,resizable=yes'));yesky.focus();"><IMG
src="Java加密和数字签名编程快速入门1.files/souchang1.gif" border=0></A> <FONT
color=#ff0000><A
href="http://www.yeecai.com/mobileant/tjadd/tjload.html"
target=_blank>免费图铃工具</A></FONT></TD></TR></TBODY></TABLE>
<SCRIPT language=JavaScript>function showCommentsSpan() { if(typeof(latest_comments_poster) == "object" && latest_comments_poster.length && latest_comments_poster.length > 0) { var str = "<table width=\"96%\" border=\"0\" align=\"center\" cellpadding=\"2\" cellspacing=\"1\" bgcolor=\"#CCCCCC\">"; str += "<tr bgcolor=\"#FFFFFF\"><td colspan=\"3\">本文最新评论 共(<font color=\"#FF0000\">"+ latest_comments_num +"</font>)条"; str += " <a href=" + latest_comments_url + " target=\"_blank\"><font color=\"#FF0000\">查看所有评论</font></a>"; str += " <a href=\"JavaScript:window.location.reload();\">查看最新评论</a></td></tr>"; str += "<tr bgcolor=\"#FFFFFF\"><td width=\"15%\">"; str += "评论人"; str += "</td><td width=\"70%\">"; str += "评论内容"; str += "</td><td width=\"15%\">"; str += "时间"; str += "</td></tr>"; for (i = 0; i < latest_comments_poster.length; i++) { str += "<tr bgcolor=\"#FFFFFF\"><td><font color=\"#669900\">"; str += latest_comments_poster[i]; str += "</font>"; str += "</td><td>"; str += latest_comments_contents[i]; str += "</td><td>"; str += latest_comments_postdate[i]; str += "</td></tr>"; } str += "</td></tr></table>"; commentsSpanText.innerHTML = str; } else { var str = "<table width=\"96%\" border=\"0\" align=\"center\" cellpadding=\"2\" cellspacing=\"1\" bgcolor=\"#CCCCCC\">"; str += "<tr bgcolor=\"#FFFFFF\"><td>目前本文还没有相关评论。立即评论,马上成为本文的第一个评论者!"; str += "</td></tr></table>"; commentsSpanText.innerHTML = str; }}</SCRIPT>
<!--此处旧的代码:document.write("<script language=\"JavaScript\" charset=\"gb2312\" defer src=\"http://comments.yesky.com/review.latest.do?rfid="+aid+"&type=1&num=5\"><\/script>");-->
<SCRIPT language=JavaScript><!--document.write("<script language=\"JavaScript\" charset=\"gb2312\" defer src=\"http://comments.yesky.com/articlereview/6/"+(aid%5000)+"/"+aid+".js\"><\/script>");//--></SCRIPT>
<TABLE width="100%" border=0>
<FORM name=frmReviewPost action=http://comments.yesky.com/review.post.do
method=post target=_blank><INPUT type=hidden name=rfid> <INPUT
type=hidden value=6 name=type>
<TBODY>
<TR>
<TD align=right width="10%">笔名: </TD>
<TD width="50%"><INPUT name=userName> </TD>
<TD vAlign=top
rowSpan=3> 请您注意:<BR><BR> 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。<BR><BR> 天极网拥有管理笔名和留言的一切权利。
</TD></TR>
<TR>
<TD vAlign=top align=right width="10%">评论: </TD>
<TD width="50%"><TEXTAREA name=contents rows=6 cols=40></TEXTAREA>
</TD></TR>
<TR>
<TD align=middle width="10%"> </TD>
<TD width="50%"><INPUT onclick=JavaScript:submitReviewForm(this.form) type=button value=发表评论 name=but>
</TD></TR></FORM></TBODY></TABLE>
<SCRIPT language=JavaScript><!--with(document.frmReviewPost) { if(typeof(comments_nickname) == "string" && comments_nickname.length > 0) { userName.value = comments_nickname; } else { // userName.value = "天极网友"; } rfid.value = aid;}function submitReviewForm(f) { with(f) { if(rfid.value.length > 0) { if(userName.value.length == 0) { alert("请输入您的笔名!"); userName.focus(); return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -