⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 java加密和数字签名编程快速入门1.htm

📁 JAVA文档,用于实现加密入门很有帮助,现在很多编程都需要有加密技术,以提高安全,这只是JAVA的学习书籍,希望对大家有帮助
💻 HTM
📖 第 1 页 / 共 5 页
字号:
  <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 
                  &lt;text&gt;");<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 
                  &lt;text&gt;");<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> 
            &nbsp;<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>&nbsp;&nbsp;<A 
            href="http://photo.yesky.com/" target=_blank><FONT 
            color=#ff8000>上传相片</FONT></A>&nbsp;&nbsp;&nbsp;<A 
            href="http://bbs.yesky.com/" target=_blank><FONT 
            color=#ff8000>论坛聊天</FONT></A>&nbsp;&nbsp;<A 
            href="http://bbs.yesky.com/" target=_blank><FONT 
            color=#ff8000>订阅电子杂志</FONT></A>&nbsp;&nbsp;<A 
            href="http://hot.yesky.com/"><FONT 
            color=#ff0000>推荐网摘</FONT></A>&nbsp;&nbsp;<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)+'&amp;u='+escape(d.location.href)+'&amp;c='+escape(t)+'&amp;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%">&nbsp; </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 + -