{"id":592,"date":"2013-05-12T08:32:31","date_gmt":"2013-05-12T08:32:31","guid":{"rendered":"http:\/\/hsiunien.sinaapp.com\/?p=592"},"modified":"2023-06-27T09:02:30","modified_gmt":"2023-06-27T01:02:30","slug":"java-%e4%b8%8a%e5%8a%a0%e5%af%86%e7%ae%97%e6%b3%95%e7%9a%84%e5%ae%9e%e7%8e%b0%e7%94%a8%e4%be%8b","status":"publish","type":"post","link":"https:\/\/blog.xiunian.wang\/?p=592","title":{"rendered":"JAVA \u4e0a\u52a0\u5bc6\u7b97\u6cd5\u7684\u5b9e\u73b0\u7528\u4f8b"},"content":{"rendered":"<h2 align=\"left\"><strong>\u7b2c<\/strong><strong> 1 <\/strong><strong>\u7ae0\u57fa\u7840\u77e5\u8bc6<\/strong><\/h2>\n<p align=\"left\"><strong>1.1. <\/strong><strong>\u5355\u94a5\u5bc6\u7801\u4f53\u5236<\/strong><\/p>\n<p align=\"left\">\u5355\u94a5\u5bc6\u7801\u4f53\u5236\u662f\u4e00\u79cd\u4f20\u7edf\u7684\u52a0\u5bc6\u7b97\u6cd5\uff0c\u662f\u6307\u4fe1\u606f\u7684\u53d1\u9001\u65b9\u548c\u63a5\u6536\u65b9\u5171\u540c\u4f7f\u7528\u540c\u4e00\u628a\u5bc6\u94a5\u8fdb\u884c\u52a0\u89e3\u5bc6\u3002<\/p>\n<p align=\"left\">\u901a\u5e38 , \u4f7f\u7528\u7684\u52a0\u5bc6\u7b97\u6cd5 \u6bd4\u8f83\u7b80\u4fbf\u9ad8\u6548 , \u5bc6\u94a5\u7b80\u77ed\uff0c\u52a0\u89e3\u5bc6\u901f\u5ea6\u5feb\uff0c\u7834\u8bd1\u6781\u5176\u56f0\u96be\u3002\u4f46\u662f\u52a0\u5bc6\u7684\u5b89\u5168\u6027\u4f9d\u9760\u5bc6\u94a5\u4fdd\u7ba1\u7684\u5b89\u5168\u6027 , \u5728\u516c\u5f00\u7684\u8ba1\u7b97\u673a\u7f51\u7edc\u4e0a\u5b89\u5168\u5730\u4f20\u9001\u548c\u4fdd\u7ba1\u5bc6\u94a5\u662f\u4e00\u4e2a\u4e25\u5cfb\u7684\u95ee\u9898\uff0c\u5e76\u4e14\u5982\u679c\u5728\u591a\u7528\u6237\u7684\u60c5\u51b5\u4e0b\u5bc6\u94a5\u7684\u4fdd\u7ba1\u5b89\u5168\u6027\u4e5f\u662f\u4e00\u4e2a\u95ee\u9898\u3002<\/p>\n<p align=\"left\">\u5355\u94a5\u5bc6\u7801\u4f53\u5236\u7684\u4ee3\u8868\u662f\u7f8e\u56fd\u7684 DES<\/p>\n<p align=\"left\"><!--more--><\/p>\n<p align=\"left\"><strong>1.2. <\/strong><strong>\u6d88\u606f\u6458\u8981<\/strong><\/p>\n<p align=\"left\">\u4e00\u4e2a\u6d88\u606f\u6458\u8981\u5c31\u662f\u4e00\u4e2a\u6570\u636e\u5757\u7684\u6570\u5b57\u6307\u7eb9\u3002\u5373\u5bf9\u4e00\u4e2a\u4efb\u610f\u957f\u5ea6\u7684\u4e00\u4e2a\u6570\u636e\u5757\u8fdb\u884c\u8ba1\u7b97\uff0c\u4ea7\u751f\u4e00\u4e2a\u552f\u4e00\u6307\u5370\uff08\u5bf9\u4e8e SHA1 \u662f\u4ea7\u751f\u4e00\u4e2a 20 \u5b57\u8282\u7684\u4e8c\u8fdb\u5236\u6570\u7ec4\uff09\u3002<\/p>\n<p align=\"left\">\u6d88\u606f\u6458\u8981\u6709\u4e24\u4e2a\u57fa\u672c\u5c5e\u6027\uff1a<\/p>\n<ul>\n<li>\u4e24\u4e2a\u4e0d\u540c\u7684\u62a5\u6587\u96be\u4ee5\u751f\u6210\u76f8\u540c\u7684\u6458\u8981<\/li>\n<li>\u96be\u4ee5\u5bf9\u6307\u5b9a\u7684\u6458\u8981\u751f\u6210\u4e00\u4e2a\u62a5\u6587\uff0c\u800c\u7531\u8be5\u62a5\u6587\u53cd\u63a8\u7b97\u51fa\u8be5\u6307\u5b9a\u7684\u6458\u8981<\/li>\n<\/ul>\n<p align=\"left\">\u4ee3\u8868\uff1a\u7f8e\u56fd\u56fd\u5bb6\u6807\u51c6\u6280\u672f\u7814\u7a76\u6240\u7684 SHA1 \u548c\u9ebb\u7701\u7406\u5de5\u5b66\u9662 Ronald Rivest \u63d0\u51fa\u7684 MD5<\/p>\n<p align=\"left\"><strong>1.3. Diffie-Hellman <\/strong><strong>\u5bc6\u94a5\u4e00\u81f4\u534f\u8bae<\/strong><\/p>\n<p align=\"left\">\u5bc6\u94a5\u4e00\u81f4\u534f\u8bae\u662f\u7531\u516c\u5f00\u5bc6\u94a5\u5bc6\u7801\u4f53\u5236\u7684\u5960\u57fa\u4eba Diffie \u548c Hellman \u6240\u63d0\u51fa\u7684\u4e00\u79cd\u601d\u60f3\u3002<\/p>\n<p align=\"left\">\u5148\u51b3\u6761\u4ef6 , \u5141\u8bb8\u4e24\u540d\u7528\u6237\u5728\u516c\u5f00\u5a92\u4f53\u4e0a\u4ea4\u6362\u4fe1\u606f\u4ee5\u751f\u6210&#8221;\u4e00\u81f4&#8221;\u7684 , \u53ef\u4ee5\u5171\u4eab\u7684\u5bc6\u94a5<\/p>\n<p align=\"left\">\u4ee3\u8868\uff1a\u6307\u6570\u5bc6\u94a5\u4e00\u81f4\u534f\u8bae (Exponential Key Agreement Protocol)<\/p>\n<p align=\"left\"><strong>1.4. <\/strong><strong>\u975e\u5bf9\u79f0\u7b97\u6cd5\u4e0e\u516c\u94a5\u4f53\u7cfb<\/strong><\/p>\n<p align=\"left\">1976 \u5e74\uff0cDittie \u548c Hellman \u4e3a\u89e3\u51b3\u5bc6\u94a5\u7ba1\u7406\u95ee\u9898\uff0c\u5728\u4ed6\u4eec\u7684\u5960\u57fa\u6027\u7684\u5de5\u4f5c&#8221;\u5bc6\u7801\u5b66\u7684\u65b0\u65b9\u5411&#8221;\u4e00\u6587\u4e2d\uff0c\u63d0\u51fa\u4e00\u79cd\u5bc6\u94a5\u4ea4\u6362\u534f\u8bae\uff0c\u5141\u8bb8\u5728\u4e0d\u5b89\u5168\u7684\u5a92\u4f53\u4e0a\u901a\u8fc7\u901a\u8baf\u53cc\u65b9\u4ea4\u6362\u4fe1\u606f\uff0c\u5b89\u5168\u5730\u4f20\u9001\u79d8\u5bc6\u5bc6\u94a5\u3002\u5728\u6b64\u65b0\u601d\u60f3\u7684\u57fa\u7840\u4e0a\uff0c\u5f88\u5feb\u51fa\u73b0\u4e86\u975e\u5bf9\u79f0\u5bc6\u94a5\u5bc6\u7801\u4f53\u5236\uff0c\u5373\u516c\u94a5\u5bc6\u7801\u4f53\u5236\u3002\u5728\u516c\u94a5\u4f53\u5236\u4e2d\uff0c\u52a0\u5bc6\u5bc6\u94a5\u4e0d\u540c\u4e8e\u89e3\u5bc6\u5bc6\u94a5\uff0c\u52a0\u5bc6\u5bc6\u94a5\u516c\u4e4b\u4e8e\u4f17\uff0c\u8c01\u90fd\u53ef\u4ee5\u4f7f\u7528\uff1b\u89e3\u5bc6\u5bc6\u94a5\u53ea\u6709\u89e3\u5bc6\u4eba\u81ea\u5df1\u77e5\u9053\u3002\u5b83\u4eec\u5206\u522b\u79f0\u4e3a\u516c\u5f00\u5bc6\u94a5\uff08Public key\uff09\u548c\u79d8\u5bc6\u5bc6\u94a5\uff08Private key\uff09\u3002<\/p>\n<p align=\"left\">\u8fc4\u4eca\u4e3a\u6b62\u7684\u6240\u6709\u516c\u94a5\u5bc6\u7801\u4f53\u7cfb\u4e2d\uff0cRSA \u7cfb\u7edf\u662f\u6700\u8457\u540d\u3001\u6700\u591a\u4f7f\u7528\u7684\u4e00\u79cd\u3002RSA \u516c\u5f00\u5bc6\u94a5\u5bc6\u7801\u7cfb\u7edf\u662f\u7531 R.Rivest\u3001A.Shamir \u548c L.Adleman \u4fca\u6559\u6388\u4e8e 1977 \u5e74\u63d0\u51fa\u7684\u3002RSA \u7684\u53d6\u540d\u5c31\u662f\u6765\u81ea\u4e8e\u8fd9\u4e09\u4f4d\u53d1\u660e\u8005\u7684\u59d3\u7684\u7b2c\u4e00\u4e2a\u5b57\u6bcd<\/p>\n<p align=\"left\"><strong>1.5. <\/strong><strong>\u6570\u5b57\u7b7e\u540d<\/strong><\/p>\n<p align=\"left\">\u6240\u8c13\u6570\u5b57\u7b7e\u540d\u5c31\u662f\u4fe1\u606f\u53d1\u9001\u8005\u7528\u5176\u79c1\u94a5\u5bf9\u4ece\u6240\u4f20\u62a5\u6587\u4e2d\u63d0\u53d6\u51fa\u7684\u7279\u5f81\u6570\u636e\uff08\u6216\u79f0\u6570\u5b57\u6307\u7eb9\uff09\u8fdb\u884c RSA \u7b97\u6cd5\u64cd\u4f5c\uff0c\u4ee5\u4fdd\u8bc1\u53d1\u4fe1\u4eba\u65e0\u6cd5\u62b5\u8d56\u66fe\u53d1\u8fc7\u8be5\u4fe1\u606f\uff08\u5373\u4e0d\u53ef\u62b5\u8d56\u6027\uff09\uff0c\u540c\u65f6\u4e5f\u786e\u4fdd\u4fe1\u606f\u62a5\u6587\u5728\u7ecf\u7b7e\u540d\u540e\u672b\u88ab\u7be1\u6539\uff08\u5373\u5b8c\u6574\u6027\uff09\u3002\u5f53\u4fe1\u606f\u63a5\u6536\u8005\u6536\u5230\u62a5\u6587\u540e\uff0c\u5c31\u53ef\u4ee5\u7528\u53d1\u9001\u8005\u7684\u516c\u94a5\u5bf9\u6570\u5b57\u7b7e\u540d\u8fdb\u884c\u9a8c\u8bc1\u3002<\/p>\n<p align=\"left\">\u5728\u6570\u5b57\u7b7e\u540d\u4e2d\u6709\u91cd\u8981\u4f5c\u7528\u7684\u6570\u5b57\u6307\u7eb9\u662f\u901a\u8fc7\u4e00\u7c7b\u7279\u6b8a\u7684\u6563\u5217\u51fd\u6570\uff08HASH \u51fd\u6570\uff09\u751f\u6210\u7684\uff0c\u5bf9\u8fd9\u4e9b HASH \u51fd\u6570\u7684\u7279\u6b8a\u8981\u6c42\u662f\uff1a<\/p>\n<ol>\n<li>\u63a5\u53d7\u7684\u8f93\u5165\u62a5\u6587\u6570\u636e\u6ca1\u6709\u957f\u5ea6\u9650\u5236\uff1b<\/li>\n<li>\u5bf9\u4efb\u4f55\u8f93\u5165\u62a5\u6587\u6570\u636e\u751f\u6210\u56fa\u5b9a\u957f\u5ea6\u7684\u6458\u8981\uff08\u6570\u5b57\u6307\u7eb9\uff09\u8f93\u51fa<\/li>\n<li>\u4ece\u62a5\u6587\u80fd\u65b9\u4fbf\u5730\u7b97\u51fa\u6458\u8981\uff1b<\/li>\n<li>\u96be\u4ee5\u5bf9\u6307\u5b9a\u7684\u6458\u8981\u751f\u6210\u4e00\u4e2a\u62a5\u6587\uff0c\u800c\u7531\u8be5\u62a5\u6587\u53cd\u63a8\u7b97\u51fa\u8be5\u6307\u5b9a\u7684\u6458\u8981\uff1b<\/li>\n<li>\u4e24\u4e2a\u4e0d\u540c\u7684\u62a5\u6587\u96be\u4ee5\u751f\u6210\u76f8\u540c\u7684\u6458\u8981<\/li>\n<\/ol>\n<p align=\"left\">\u4ee3\u8868\uff1aDSA<\/p>\n<h2 align=\"left\"><strong>\u7b2c<\/strong><strong> 2 <\/strong><strong>\u7ae0\u5728<\/strong><strong> JAVA <\/strong><strong>\u4e2d\u7684\u5b9e\u73b0<\/strong><\/h2>\n<p align=\"left\"><strong>2.1. <\/strong><strong>\u76f8\u5173<\/strong><\/p>\n<p align=\"left\">Diffie-Hellman \u5bc6\u94a5\u4e00\u81f4\u534f\u8bae\u548c DES \u7a0b\u5e8f\u9700\u8981 JCE \u5de5\u5177\u5e93\u7684\u652f\u6301 , \u53ef\u4ee5\u5230\u00a0<a href=\"http:\/\/java.sun.com\/security\/index.html\">http:\/\/java.sun.com\/security\/index.html<\/a>\u00a0\u4e0b\u8f7d JCE, \u5e76\u8fdb\u884c\u5b89\u88c5\u3002\u7b80\u6613\u5b89\u88c5\u628a jce1.2.1lib \u4e0b\u7684\u6240\u6709\u5185\u5bb9\u590d\u5236\u5230 %java_home%libext \u4e0b , \u5982\u679c\u6ca1\u6709 ext \u76ee\u5f55\u81ea\u884c\u5efa\u7acb , \u518d\u628a jce1_2_1.jar \u548c sunjce_provider.jar \u6dfb\u52a0\u5230 CLASSPATH \u5185 , \u66f4\u8be6\u7ec6\u8bf4\u660e\u8bf7\u770b\u76f8\u5e94\u7528\u6237\u624b\u518c<\/p>\n<p align=\"left\"><strong>2.2. <\/strong><strong>\u6d88\u606f\u6458\u8981<\/strong><strong> MD5 <\/strong><strong>\u548c<\/strong><strong> SHA <\/strong><strong>\u7684\u4f7f\u7528<\/strong><\/p>\n<p align=\"left\">\u4f7f\u7528\u65b9\u6cd5 :<\/p>\n<p align=\"left\">\u9996\u5148\u7528\u751f\u6210\u4e00\u4e2a MessageDigest \u7c7b , \u786e\u5b9a\u8ba1\u7b97\u65b9\u6cd5<\/p>\n<p align=\"left\"><code>java.security.MessageDigest alga=java.security.MessageDigest.getInstance(\"SHA-1\");<\/code><\/p>\n<p align=\"left\">\u6dfb\u52a0\u8981\u8fdb\u884c\u8ba1\u7b97\u6458\u8981\u7684\u4fe1\u606f<\/p>\n<p align=\"left\">alga.update(myinfo.getBytes());<\/p>\n<p align=\"left\">\u8ba1\u7b97\u51fa\u6458\u8981<\/p>\n<p align=\"left\">byte[] digesta=alga.digest();<\/p>\n<p align=\"left\">\u53d1\u9001\u7ed9\u5176\u4ed6\u4eba\u4f60\u7684\u4fe1\u606f\u548c\u6458\u8981<\/p>\n<p align=\"left\">\u5176\u4ed6\u4eba\u7528\u76f8\u540c\u7684\u65b9\u6cd5\u521d\u59cb\u5316 , \u6dfb\u52a0\u4fe1\u606f , \u6700\u540e\u8fdb\u884c\u6bd4\u8f83\u6458\u8981\u662f\u5426\u76f8\u540c<\/p>\n<p align=\"left\">algb.isEqual(digesta,algb.digest())<\/p>\n<p align=\"left\">\u76f8\u5173 AIP<\/p>\n<p align=\"left\">java.security.MessageDigest \u7c7b<\/p>\n<p align=\"left\">static getInstance(String algorithm)<\/p>\n<p align=\"left\">\u8fd4\u56de\u4e00\u4e2a MessageDigest \u5bf9\u8c61 , \u5b83\u5b9e\u73b0\u6307\u5b9a\u7684\u7b97\u6cd5<\/p>\n<p align=\"left\">\u53c2\u6570 : \u7b97\u6cd5\u540d , \u5982 SHA-1 \u6216 MD5<\/p>\n<p align=\"left\">void update (byte input)<\/p>\n<p align=\"left\">void update (byte[] input)<\/p>\n<p align=\"left\">void update(byte[] input, int offset, int len)<\/p>\n<p align=\"left\">\u6dfb\u52a0\u8981\u8fdb\u884c\u8ba1\u7b97\u6458\u8981\u7684\u4fe1\u606f<\/p>\n<p align=\"left\">byte[] digest()<\/p>\n<p align=\"left\">\u5b8c\u6210\u8ba1\u7b97 , \u8fd4\u56de\u8ba1\u7b97\u5f97\u5230\u7684\u6458\u8981 ( \u5bf9\u4e8e MD5 \u662f 16 \u4f4d ,SHA \u662f 20 \u4f4d )<\/p>\n<p align=\"left\">void reset()<\/p>\n<p align=\"left\">\u590d\u4f4d<\/p>\n<p align=\"left\">static boolean isEqual(byte[] digesta, byte[] digestb)<\/p>\n<p align=\"left\">\u6bd4\u6548\u4e24\u4e2a\u6458\u8981\u662f\u5426\u76f8\u540c<\/p>\n<p align=\"left\">\u4ee3\u7801\uff1a<\/p>\n<table border=\"1\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<p align=\"left\">import java.security.*;<\/p>\n<p align=\"left\">\u00a0public class myDigest {<\/p>\n<p align=\"left\">\u00a0 public static void main(String[] args)\u00a0 {<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 myDigest my=new myDigest();<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 my.testDigest();<\/p>\n<p align=\"left\">\u00a0 }<\/p>\n<p align=\"left\">\u00a0 public void testDigest()<\/p>\n<p align=\"left\">\u00a0 {<\/p>\n<p align=\"left\">\u00a0\u00a0 try {<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0 String myinfo=&#8221;\u6211\u7684\u6d4b\u8bd5\u4fe1\u606f&#8221;;<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 \/\/java.security.MessageDigest alg=java.security.MessageDigest.getInstance(&#8220;MD5&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0 java.security.MessageDigest alga=java.security.MessageDigest.getInstance(&#8220;SHA-1&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0 alga.update(myinfo.getBytes());<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0 byte[] digesta=alga.digest();<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(&#8220;\u672c\u4fe1\u606f\u6458\u8981\u662f :&#8221;+byte2hex(digesta));<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ \u901a\u8fc7\u67d0\u4e2d\u65b9\u5f0f\u4f20\u7ed9\u5176\u4ed6\u4eba\u4f60\u7684\u4fe1\u606f (myinfo) \u548c\u6458\u8981 (digesta) \u5bf9\u65b9\u53ef\u4ee5\u5224\u65ad\u662f\u5426\u66f4\u6539\u6216\u4f20\u8f93\u6b63\u5e38<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0 java.security.MessageDigest algb=java.security.MessageDigest.getInstance(&#8220;SHA-1&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0 algb.update(myinfo.getBytes());<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0 if (algb.isEqual(digesta,algb.digest())) {<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(&#8220;\u4fe1\u606f\u68c0\u67e5\u6b63\u5e38&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/p>\n<p align=\"left\">\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0else<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(&#8220;\u6458\u8981\u4e0d\u76f8\u540c&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/p>\n<p align=\"left\">\u00a0\u00a0 }<\/p>\n<p align=\"left\">\u00a0\u00a0 catch (java.security.NoSuchAlgorithmException ex) {<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0 System.out.println(&#8220;\u975e\u6cd5\u6458\u8981\u7b97\u6cd5&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0 }<\/p>\n<p align=\"left\">\u00a0 }<\/p>\n<p align=\"left\">\u00a0 public String byte2hex(byte[] b) \/\/ \u4e8c\u884c\u5236\u8f6c\u5b57\u7b26\u4e32<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 {<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0 String hs=&#8221;&#8221;;<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0 String stmp=&#8221;&#8221;;<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0 for (int n=0;n&lt;b.length;n++)<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 stmp=(java.lang.Integer.toHexString(b[n] &amp; 0XFF));<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (stmp.length()==1) hs=hs+&#8221;0&#8243;+stmp;<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else hs=hs+stmp;<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (n&lt;b.length-1)\u00a0 hs=hs+&#8221;:&#8221;;<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0 return hs.toUpperCase();<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 }<\/p>\n<p align=\"left\">\u00a0}<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p align=\"left\"><strong>2.3. <\/strong><strong>\u6570\u5b57\u7b7e\u540d<\/strong><strong> DSA<\/strong><\/p>\n<ol>\n<li>\u5bf9\u4e8e\u4e00\u4e2a\u7528\u6237\u6765\u8bb2\u9996\u5148\u8981\u751f\u6210\u4ed6\u7684\u5bc6\u94a5\u5bf9 , \u5e76\u4e14\u5206\u522b\u4fdd\u5b58<\/li>\n<\/ol>\n<p align=\"left\">\u751f\u6210\u4e00\u4e2a KeyPairGenerator \u5b9e\u4f8b<\/p>\n<table border=\"1\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<p align=\"left\">java.security.KeyPairGenerator keygen=java.security.KeyPairGenerator.getInstance(&#8220;DSA&#8221;);<\/p>\n<p align=\"left\">\/\/\u5982\u679c\u8bbe\u5b9a\u968f\u673a\u4ea7\u751f\u5668\u5c31\u7528\u5982\u76f8\u4ee3\u7801\u521d\u59cb\u5316<\/p>\n<p align=\"left\">SecureRandom secrand=new SecureRandom();<\/p>\n<p align=\"left\">secrand.setSeed(&#8220;tttt&#8221;.getBytes()); \/\/ \u521d\u59cb\u5316\u968f\u673a\u4ea7\u751f\u5668<\/p>\n<p align=\"left\">keygen.initialize(512,secrand);\u00a0\u00a0\u00a0\u00a0 \/\/ \u521d\u59cb\u5316\u5bc6\u94a5\u751f\u6210\u5668<\/p>\n<p align=\"left\">\/\/\u5426\u5219<\/p>\n<p align=\"left\">keygen.initialize(512);<\/p>\n<p align=\"left\">\/\/\u751f\u6210\u5bc6\u94a5\u516c\u94a5 pubkey \u548c\u79c1\u94a5 prikey<\/p>\n<p align=\"left\">KeyPair keys=keygen.generateKeyPair(); \/\/ \u751f\u6210\u5bc6\u94a5\u7ec4<\/p>\n<p align=\"left\">PublicKey pubkey=keys.getPublic();<\/p>\n<p align=\"left\">PrivateKey prikey=keys.getPrivate();<\/p>\n<p align=\"left\">\/\/\u5206\u522b\u4fdd\u5b58\u5728 myprikey.dat \u548c mypubkey.dat \u4e2d , \u4ee5\u4fbf\u4e0b\u6b21\u4e0d\u5728\u751f\u6210<\/p>\n<p align=\"left\">\/\/( \u751f\u6210\u5bc6\u94a5\u5bf9\u7684\u65f6\u95f4\u6bd4\u8f83\u957f<\/p>\n<p align=\"left\">java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 new java.io.FileOutputStream(&#8220;myprikey.dat&#8221;));<\/p>\n<p align=\"left\">out.writeObject(prikey);<\/p>\n<p align=\"left\">out.close();<\/p>\n<p align=\"left\">out=new java.io.ObjectOutputStream(new java.io.FileOutputStream(&#8220;mypubkey.dat&#8221;));<\/p>\n<p align=\"left\">out.writeObject(pubkey);<\/p>\n<p align=\"left\">out.close();<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ol>\n<li>\u7528\u4ed6\u79c1\u4eba\u5bc6\u94a5 (prikey) \u5bf9\u4ed6\u6240\u786e\u8ba4\u7684\u4fe1\u606f (info) \u8fdb\u884c\u6570\u5b57\u7b7e\u540d\u4ea7\u751f\u4e00\u4e2a\u7b7e\u540d\u6570\u7ec4<\/li>\n<\/ol>\n<p align=\"left\">\u4ece\u6587\u4ef6\u4e2d\u8bfb\u5165\u79c1\u4eba\u5bc6\u94a5 (prikey)<\/p>\n<table border=\"1\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<p align=\"left\">java.io.ObjectInputStream in=new java.io.ObjectInputStream(<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 new java.io.FileInputStream(&#8220;myprikey.dat&#8221;));<\/p>\n<p align=\"left\">PrivateKey myprikey=(PrivateKey)in.readObject();<\/p>\n<p align=\"left\">in.close();<\/p>\n<p align=\"left\">\u521d\u59cb\u4e00\u4e2a Signature \u5bf9\u8c61 , \u5e76\u7528\u79c1\u94a5\u5bf9\u4fe1\u606f\u7b7e\u540d<\/p>\n<p align=\"left\">java.security.Signature signet=java.security.Signature.getInstance(&#8220;DSA&#8221;);<\/p>\n<p align=\"left\">signet.initSign(myprikey);<\/p>\n<p align=\"left\">signet.update(myinfo.getBytes());<\/p>\n<p align=\"left\">byte[] signed=signet.sign();<\/p>\n<p align=\"left\">\u628a\u4fe1\u606f\u548c\u7b7e\u540d\u4fdd\u5b58\u5728\u4e00\u4e2a\u6587\u4ef6\u4e2d (myinfo.dat)<\/p>\n<p align=\"left\">java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 new java.io.FileOutputStream(&#8220;myinfo.dat&#8221;));<\/p>\n<p align=\"left\">out.writeObject(myinfo);<\/p>\n<p align=\"left\">out.writeObject(signed);<\/p>\n<p align=\"left\">out.close();<\/p>\n<p align=\"left\">\u628a\u4ed6\u7684\u516c\u94a5\u7684\u4fe1\u606f\u53ca\u7b7e\u540d\u53d1\u7ed9\u5176\u5b83\u7528\u6237<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ol>\n<li>\u5176\u4ed6\u7528\u6237\u7528\u4ed6\u7684\u516c\u5171\u5bc6\u94a5 (pubkey) \u548c\u7b7e\u540d (signed) \u548c\u4fe1\u606f (info) \u8fdb\u884c\u9a8c\u8bc1\u662f\u5426\u7531\u4ed6\u7b7e\u540d\u7684\u4fe1\u606f<\/li>\n<\/ol>\n<p align=\"left\">\u8bfb\u5165\u516c\u94a5<br \/>\njava.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream(&#8220;mypubkey.dat&#8221;));<br \/>\nPublicKey pubkey=(PublicKey)in.readObject();<br \/>\nin.close();<\/p>\n<p align=\"left\">\u8bfb\u5165\u7b7e\u540d\u548c\u4fe1\u606f<br \/>\nin=new java.io.ObjectInputStream(new java.io.FileInputStream(&#8220;myinfo.dat&#8221;));<br \/>\nString info=(String)in.readObject();<br \/>\nbyte[] signed=(byte[])in.readObject();<br \/>\nin.close();<\/p>\n<p align=\"left\">\u521d\u59cb\u4e00\u4e2a Signature \u5bf9\u8c61 , \u5e76\u7528\u516c\u94a5\u548c\u7b7e\u540d\u8fdb\u884c\u9a8c\u8bc1<br \/>\njava.security.Signature signetcheck=java.security.Signature.getInstance(&#8220;DSA&#8221;);<br \/>\nsignetcheck.initVerify(pubkey);<br \/>\nsignetcheck.update(info.getBytes());<br \/>\nif (signetcheck.verify(signed)) { System.out.println(&#8220;\u7b7e\u540d\u6b63\u5e38&#8221;);}<\/p>\n<p align=\"left\">\u5bf9\u4e8e\u5bc6\u94a5\u7684\u4fdd\u5b58\u672c\u6587\u662f\u7528\u5bf9\u8c61\u6d41\u7684\u65b9\u5f0f\u4fdd\u5b58\u548c\u4f20\u9001\u7684 , \u4e5f\u53ef\u53ef\u4ee5\u7528\u7f16\u7801\u7684\u65b9\u5f0f\u4fdd\u5b58 . \u6ce8\u610f\u8981<br \/>\nimport java.security.spec.*<br \/>\nimport java.security.*<\/p>\n<p align=\"left\">\u5177\u4f11\u8bf4\u660e\u5982\u4e0b<\/p>\n<ul>\n<li>public key \u662f\u7528 X.509 \u7f16\u7801\u7684 , \u4f8b\u7801\u5982\u4e0b :<\/li>\n<\/ul>\n<table border=\"1\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u00a0byte[] bobEncodedPubKey=mypublic.getEncoded(); \/\/ \u751f\u6210\u7f16\u7801<\/p>\n<p align=\"left\">\u00a0\u00a0 \/\/ \u4f20\u9001\u4e8c\u8fdb\u5236\u7f16\u7801<\/p>\n<p align=\"left\">\u00a0\u00a0 \/\/ \u4ee5\u4e0b\u4ee3\u7801\u8f6c\u6362\u7f16\u7801\u4e3a\u76f8\u5e94 key \u5bf9\u8c61<\/p>\n<p align=\"left\">\u00a0\u00a0 X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(bobEncodedPubKey);<\/p>\n<p align=\"left\">\u00a0\u00a0 KeyFactory keyFactory = KeyFactory.getInstance(&#8220;DSA&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0 PublicKey bobPubKey = keyFactory.generatePublic(bobPubKeySpec);<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ul>\n<li>\u5bf9\u4e8e Private key \u662f\u7528 PKCS#8 \u7f16\u7801 , \u4f8b\u7801\u5982\u4e0b :<\/li>\n<\/ul>\n<table border=\"1\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<p align=\"left\">byte[] bPKCS=myprikey.getEncoded();<\/p>\n<p align=\"left\">\u00a0 \/\/ \u4f20\u9001\u4e8c\u8fdb\u5236\u7f16\u7801<\/p>\n<p align=\"left\">\u00a0 \/\/ \u4ee5\u4e0b\u4ee3\u7801\u8f6c\u6362\u7f16\u7801\u4e3a\u76f8\u5e94 key \u5bf9\u8c61<\/p>\n<p align=\"left\">\u00a0 PKCS8EncodedKeySpec priPKCS8=new PKCS8EncodedKeySpec(bPKCS);<\/p>\n<p align=\"left\">\u00a0 KeyFactory keyf=KeyFactory.getInstance(&#8220;DSA&#8221;);<\/p>\n<p align=\"left\">\u00a0 PrivateKey otherprikey=keyf.generatePrivate(priPKCS8);<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ol>\n<li>\u5e38\u7528 API<\/li>\n<\/ol>\n<p align=\"left\">java.security.KeyPairGenerator \u5bc6\u94a5\u751f\u6210\u5668\u7c7b<br \/>\npublic static KeyPairGenerator getInstance(String algorithm) throws NoSuchAlgorithmException<br \/>\n\u4ee5\u6307\u5b9a\u7684\u7b97\u6cd5\u8fd4\u56de\u4e00\u4e2a KeyPairGenerator \u5bf9\u8c61<br \/>\n\u53c2\u6570 : algorithm \u7b97\u6cd5\u540d . \u5982:&#8221;DSA&#8221;,&#8221;RSA&#8221;<\/p>\n<p align=\"left\">public void initialize(int keysize)<\/p>\n<p align=\"left\">\u4ee5\u6307\u5b9a\u7684\u957f\u5ea6\u521d\u59cb\u5316 KeyPairGenerator \u5bf9\u8c61 , \u5982\u679c\u6ca1\u6709\u521d\u59cb\u5316\u7cfb\u7edf\u4ee5 1024 \u957f\u5ea6\u9ed8\u8ba4\u8bbe\u7f6e<\/p>\n<p align=\"left\">\u53c2\u6570 :keysize \u7b97\u6cd5\u4f4d\u957f . \u5176\u8303\u56f4\u5fc5\u987b\u5728 512 \u5230 1024 \u4e4b\u95f4\uff0c\u4e14\u5fc5\u987b\u4e3a 64 \u7684\u500d\u6570<\/p>\n<p align=\"left\">public void initialize(int keysize, SecureRandom random)<br \/>\n\u4ee5\u6307\u5b9a\u7684\u957f\u5ea6\u521d\u59cb\u5316\u548c\u968f\u673a\u53d1\u751f\u5668\u521d\u59cb\u5316 KeyPairGenerator \u5bf9\u8c61<br \/>\n\u53c2\u6570 :keysize \u7b97\u6cd5\u4f4d\u957f . \u5176\u8303\u56f4\u5fc5\u987b\u5728 512 \u5230 1024 \u4e4b\u95f4\uff0c\u4e14\u5fc5\u987b\u4e3a 64 \u7684\u500d\u6570<br \/>\nrandom \u4e00\u4e2a\u968f\u673a\u4f4d\u7684\u6765\u6e90 ( \u5bf9\u4e8e initialize(int keysize) \u4f7f\u7528\u4e86\u9ed8\u8ba4\u968f\u673a\u5668<\/p>\n<p align=\"left\">public abstract KeyPair generateKeyPair()<br \/>\n\u4ea7\u751f\u65b0\u5bc6\u94a5\u5bf9<\/p>\n<p align=\"left\">java.security.KeyPair \u5bc6\u94a5\u5bf9\u7c7b<br \/>\npublic PrivateKey getPrivate()<br \/>\n\u8fd4\u56de\u79c1\u94a5<\/p>\n<p align=\"left\">public PublicKey getPublic()<br \/>\n\u8fd4\u56de\u516c\u94a5<\/p>\n<p align=\"left\">java.security.Signature \u7b7e\u540d\u7c7b<br \/>\npublic static Signature getInstance(String algorithm) throws NoSuchAlgorithmException<br \/>\n\u8fd4\u56de\u4e00\u4e2a\u6307\u5b9a\u7b97\u6cd5\u7684 Signature \u5bf9\u8c61<br \/>\n\u53c2\u6570 algorithm \u5982 :&#8221;DSA&#8221;<\/p>\n<p align=\"left\">public final void initSign(PrivateKey privateKey)<br \/>\nthrows InvalidKeyException<br \/>\n\u7528\u6307\u5b9a\u7684\u79c1\u94a5\u521d\u59cb\u5316<br \/>\n\u53c2\u6570 :privateKey \u6240\u8fdb\u884c\u7b7e\u540d\u65f6\u7528\u7684\u79c1\u94a5<\/p>\n<p align=\"left\">public final void update(byte data)<br \/>\nthrows SignatureException<br \/>\npublic final void update(byte[] data)<br \/>\nthrows SignatureException<br \/>\npublic final void update(byte[] data, int off, int len)<br \/>\nthrows SignatureException<br \/>\n\u6dfb\u52a0\u8981\u7b7e\u540d\u7684\u4fe1\u606f<\/p>\n<p align=\"left\">public final byte[] sign()<br \/>\nthrows SignatureException<br \/>\n\u8fd4\u56de\u7b7e\u540d\u7684\u6570\u7ec4 , \u524d\u63d0\u662f initSign \u548c update<\/p>\n<p align=\"left\">public final void initVerify(PublicKey publicKey)<br \/>\nthrows InvalidKeyException<br \/>\n\u7528\u6307\u5b9a\u7684\u516c\u94a5\u521d\u59cb\u5316<br \/>\n\u53c2\u6570 :publicKey \u9a8c\u8bc1\u65f6\u7528\u7684\u516c\u94a5<\/p>\n<p align=\"left\">public final boolean verify(byte[] signature)<br \/>\nthrows SignatureException<br \/>\n\u9a8c\u8bc1\u7b7e\u540d\u662f\u5426\u6709\u6548 , \u524d\u63d0\u662f\u5df2\u7ecf initVerify \u521d\u59cb\u5316<br \/>\n\u53c2\u6570 : signature \u7b7e\u540d\u6570\u7ec4<\/p>\n<table border=\"1\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u00a0import java.security.*;<\/p>\n<p align=\"left\">\u00a0import java.security.spec.*;<\/p>\n<p align=\"left\">\u00a0public class testdsa {<\/p>\n<p align=\"left\">\u00a0 public static void main(String[] args) throws java.security.NoSuchAlgorithmException,<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 java.lang.Exception {<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 testdsa my=new testdsa();<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 my.run();<\/p>\n<p align=\"left\">\u00a0 }<\/p>\n<p align=\"left\">\u00a0 public void run()<\/p>\n<p align=\"left\">\u00a0 {<\/p>\n<p align=\"left\">\u00a0 \/\/ \u6570\u5b57\u7b7e\u540d\u751f\u6210\u5bc6\u94a5<\/p>\n<p align=\"left\">\u00a0 \/\/ \u7b2c\u4e00\u6b65\u751f\u6210\u5bc6\u94a5\u5bf9 , \u5982\u679c\u5df2\u7ecf\u751f\u6210\u8fc7 , \u672c\u8fc7\u7a0b\u5c31\u53ef\u4ee5\u8df3\u8fc7 ,<\/p>\n<p align=\"left\">\u00a0 \/\/ \u5bf9\u7528\u6237\u6765\u8bb2 myprikey.dat \u8981\u4fdd\u5b58\u5728\u672c\u5730<\/p>\n<p align=\"left\">\u00a0 \/\/ \u800c mypubkey.dat \u7ed9\u53d1\u5e03\u7ed9\u5176\u5b83\u7528\u6237<\/p>\n<p align=\"left\">\u00a0\u00a0 if ((new java.io.File(&#8220;myprikey.dat&#8221;)).exists()==false) {<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (generatekey()==false) {<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(&#8220;\u751f\u6210\u5bc6\u94a5\u5bf9\u8d25&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return;<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/p>\n<p align=\"left\">\u00a0\/\/ \u7b2c\u4e8c\u6b65 , \u6b64\u7528\u6237<\/p>\n<p align=\"left\">\u00a0\/\/ \u4ece\u6587\u4ef6\u4e2d\u8bfb\u5165\u79c1\u94a5 , \u5bf9\u4e00\u4e2a\u5b57\u7b26\u4e32\u8fdb\u884c\u7b7e\u540d\u540e\u4fdd\u5b58\u5728\u4e00\u4e2a\u6587\u4ef6 (myinfo.dat) \u4e2d<\/p>\n<p align=\"left\">\u00a0\/\/ \u5e76\u4e14\u518d\u628a myinfo.dat \u53d1\u9001\u51fa\u53bb<\/p>\n<p align=\"left\">\u00a0\/\/ \u4e3a\u4e86\u65b9\u4fbf\u6570\u5b57\u7b7e\u540d\u4e5f\u653e\u8fdb\u4e86 myifno.dat \u6587\u4ef6\u4e2d , \u5f53\u7136\u4e5f\u53ef\u5206\u522b\u53d1\u9001<\/p>\n<p align=\"left\">\u00a0 try {<\/p>\n<p align=\"left\">\u00a0 java.io.ObjectInputStream in=new java.io.ObjectInputStream(<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 new java.io.FileInputStream(&#8220;myprikey.dat&#8221;));<\/p>\n<p align=\"left\">\u00a0 PrivateKey myprikey=(PrivateKey)in.readObject();<\/p>\n<p align=\"left\">\u00a0 in.close();<\/p>\n<p align=\"left\">\u00a0\/\/ java.security.spec.X509EncodedKeySpec pubX509=<\/p>\n<p align=\"left\">\u00a0\/\/\u00a0\u00a0 new java.security.spec.X509EncodedKeySpec(bX509);<\/p>\n<p align=\"left\">\u00a0\/\/java.security.spec.X509EncodedKeySpec pubkeyEncode=<\/p>\n<p align=\"left\">\u00a0\/\/\u00a0\u00a0 java.security.spec.X509EncodedKeySpec<\/p>\n<p align=\"left\">\u00a0 String myinfo=&#8221;\u8fd9\u662f\u6211\u7684\u4fe1\u606f&#8221;;\u00a0\u00a0\u00a0 \/\/ \u8981\u7b7e\u540d\u7684\u4fe1\u606f<\/p>\n<p align=\"left\">\u00a0 \/\/ \u7528\u79c1\u94a5\u5bf9\u4fe1\u606f\u751f\u6210\u6570\u5b57\u7b7e\u540d<\/p>\n<p align=\"left\">\u00a0 java.security.Signature signet=java.security.Signature.getInstance(&#8220;DSA&#8221;);<\/p>\n<p align=\"left\">\u00a0 signet.initSign(myprikey);<\/p>\n<p align=\"left\">\u00a0 signet.update(myinfo.getBytes());<\/p>\n<p align=\"left\">\u00a0 byte[] signed=signet.sign();\u00a0 \/\/ \u5bf9\u4fe1\u606f\u7684\u6570\u5b57\u7b7e\u540d<\/p>\n<p align=\"left\">\u00a0 System.out.println(&#8220;signed( \u7b7e\u540d\u5185\u5bb9 )=&#8221;+byte2hex(signed));<\/p>\n<p align=\"left\">\u00a0\/\/ \u628a\u4fe1\u606f\u548c\u6570\u5b57\u7b7e\u540d\u4fdd\u5b58\u5728\u4e00\u4e2a\u6587\u4ef6\u4e2d<\/p>\n<p align=\"left\">\u00a0 java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 new java.io.FileOutputStream(&#8220;myinfo.dat&#8221;));<\/p>\n<p align=\"left\">\u00a0 out.writeObject(myinfo);<\/p>\n<p align=\"left\">\u00a0 out.writeObject(signed);<\/p>\n<p align=\"left\">\u00a0 out.close();<\/p>\n<p align=\"left\">\u00a0 System.out.println(&#8220;\u7b7e\u540d\u5e76\u751f\u6210\u6587\u4ef6\u6210\u529f&#8221;);<\/p>\n<p align=\"left\">\u00a0 }<\/p>\n<p align=\"left\">\u00a0 catch (java.lang.Exception e) {<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 e.printStackTrace();<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 System.out.println(&#8220;\u7b7e\u540d\u5e76\u751f\u6210\u6587\u4ef6\u5931\u8d25&#8221;);<\/p>\n<p align=\"left\">\u00a0 };<\/p>\n<p align=\"left\">\u00a0 \/\/ \u7b2c\u4e09\u6b65<\/p>\n<p align=\"left\">\u00a0 \/\/ \u5176\u4ed6\u4eba\u901a\u8fc7\u516c\u5171\u65b9\u5f0f\u5f97\u5230\u6b64\u6237\u7684\u516c\u94a5\u548c\u6587\u4ef6<\/p>\n<p align=\"left\">\u00a0 \/\/ \u5176\u4ed6\u4eba\u7528\u6b64\u6237\u7684\u516c\u94a5 , \u5bf9\u6587\u4ef6\u8fdb\u884c\u68c0\u67e5 , \u5982\u679c\u6210\u529f\u8bf4\u660e\u662f\u6b64\u7528\u6237\u53d1\u5e03\u7684\u4fe1\u606f .<\/p>\n<p align=\"left\">\u00a0 \/\/<\/p>\n<p align=\"left\">\u00a0 try {<\/p>\n<p align=\"left\">\u00a0\u00a0 java.io.ObjectInputStream in=new java.io.ObjectInputStream(<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 new java.io.FileInputStream(&#8220;mypubkey.dat&#8221;));<\/p>\n<p align=\"left\">\u00a0\u00a0 PublicKey pubkey=(PublicKey)in.readObject();<\/p>\n<p align=\"left\">\u00a0\u00a0 in.close();<\/p>\n<p align=\"left\">\u00a0\u00a0 System.out.println(pubkey.getFormat());<\/p>\n<p align=\"left\">\u00a0\u00a0 in=new java.io.ObjectInputStream(new java.io.FileInputStream(&#8220;myinfo.dat&#8221;));<\/p>\n<p align=\"left\">\u00a0\u00a0 String info=(String)in.readObject();<\/p>\n<p align=\"left\">\u00a0\u00a0 byte[] signed=(byte[])in.readObject();<\/p>\n<p align=\"left\">\u00a0\u00a0 in.close();<\/p>\n<p align=\"left\">\u00a0 java.security.Signature signetcheck=java.security.Signature.getInstance(&#8220;DSA&#8221;);<\/p>\n<p align=\"left\">\u00a0 signetcheck.initVerify(pubkey);<\/p>\n<p align=\"left\">\u00a0 signetcheck.update(info.getBytes());<\/p>\n<p align=\"left\">\u00a0 if (signetcheck.verify(signed)) {<\/p>\n<p align=\"left\">\u00a0 System.out.println(&#8220;info=&#8221;+info);<\/p>\n<p align=\"left\">\u00a0\u00a0 System.out.println(&#8220;\u7b7e\u540d\u6b63\u5e38&#8221;);<\/p>\n<p align=\"left\">\u00a0 }<\/p>\n<p align=\"left\">\u00a0 else\u00a0 System.out.println(&#8220;\u975e\u7b7e\u540d\u6b63\u5e38&#8221;);<\/p>\n<p align=\"left\">\u00a0 }<\/p>\n<p align=\"left\">\u00a0 catch (java.lang.Exception e) {e.printStackTrace();};<\/p>\n<p align=\"left\">\u00a0 }<\/p>\n<p align=\"left\">\u00a0 \/\/ \u751f\u6210\u4e00\u5bf9\u6587\u4ef6 myprikey.dat \u548c mypubkey.dat&#8212; \u79c1\u94a5\u548c\u516c\u94a5 ,<\/p>\n<p align=\"left\">\u00a0 \/\/ \u516c\u94a5\u8981\u7528\u6237\u53d1\u9001 ( \u6587\u4ef6 , \u7f51\u7edc\u7b49\u65b9\u6cd5 ) \u7ed9\u5176\u5b83\u7528\u6237 , \u79c1\u94a5\u4fdd\u5b58\u5728\u672c\u5730<\/p>\n<p align=\"left\">\u00a0 public boolean generatekey()<\/p>\n<p align=\"left\">\u00a0 {<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 try {<\/p>\n<p align=\"left\">\u00a0 java.security.KeyPairGenerator keygen =<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 java.security.KeyPairGenerator.getInstance(&#8220;DSA&#8221;);<\/p>\n<p align=\"left\">\u00a0\/\/ SecureRandom secrand=new SecureRandom();<\/p>\n<p align=\"left\">\u00a0\/\/ secrand.setSeed(&#8220;tttt&#8221;.getBytes()); \/\/ \u521d\u59cb\u5316\u968f\u673a\u4ea7\u751f\u5668<\/p>\n<p align=\"left\">\u00a0\/\/ keygen.initialize(576,secrand);\u00a0\u00a0\u00a0\u00a0 \/\/ \u521d\u59cb\u5316\u5bc6\u94a5\u751f\u6210\u5668<\/p>\n<p align=\"left\">\u00a0 keygen.initialize(512);<\/p>\n<p align=\"left\">\u00a0 KeyPair keys=keygen.genKeyPair();<\/p>\n<p align=\"left\">\u00a0\/\/\u00a0 KeyPair keys=keygen.generateKeyPair(); \/\/ \u751f\u6210\u5bc6\u94a5\u7ec4<\/p>\n<p align=\"left\">\u00a0 PublicKey pubkey=keys.getPublic();<\/p>\n<p align=\"left\">\u00a0 PrivateKey prikey=keys.getPrivate();<\/p>\n<p align=\"left\">\u00a0 java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 new java.io.FileOutputStream(&#8220;myprikey.dat&#8221;));<\/p>\n<p align=\"left\">\u00a0 out.writeObject(prikey);<\/p>\n<p align=\"left\">\u00a0 out.close();<\/p>\n<p align=\"left\">\u00a0 System.out.println(&#8220;\u5199\u5165\u5bf9\u8c61 prikeys ok&#8221;);<\/p>\n<p align=\"left\">\u00a0 out=new java.io.ObjectOutputStream(<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 new java.io.FileOutputStream(&#8220;mypubkey.dat&#8221;));<\/p>\n<p align=\"left\">\u00a0\u00a0 out.writeObject(pubkey);<\/p>\n<p align=\"left\">\u00a0\u00a0 out.close();<\/p>\n<p align=\"left\">\u00a0\u00a0 System.out.println(&#8220;\u5199\u5165\u5bf9\u8c61 pubkeys ok&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0 System.out.println(&#8220;\u751f\u6210\u5bc6\u94a5\u5bf9\u6210\u529f&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0 return true;<\/p>\n<p align=\"left\">\u00a0 }<\/p>\n<p align=\"left\">\u00a0 catch (java.lang.Exception e) {<\/p>\n<p align=\"left\">\u00a0\u00a0 e.printStackTrace();<\/p>\n<p align=\"left\">\u00a0\u00a0 System.out.println(&#8220;\u751f\u6210\u5bc6\u94a5\u5bf9\u5931\u8d25&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0 return false;<\/p>\n<p align=\"left\">\u00a0\u00a0 };<\/p>\n<p align=\"left\">\u00a0 }<\/p>\n<p align=\"left\">\u00a0 public String byte2hex(byte[] b)<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 {<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0 String hs=&#8221;&#8221;;<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0 String stmp=&#8221;&#8221;;<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0 for (int n=0;n&lt;b.length;n++)<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 stmp=(java.lang.Integer.toHexString(b[n] &amp; 0XFF));<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (stmp.length()==1) hs=hs+&#8221;0&#8243;+stmp;<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else hs=hs+stmp;<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (n&lt;b.length-1)\u00a0 hs=hs+&#8221;:&#8221;;<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0 return hs.toUpperCase();<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 }<\/p>\n<p align=\"left\">\u00a0}<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p align=\"left\"><strong>2.4. DESede\/DES <\/strong><strong>\u5bf9\u79f0\u7b97\u6cd5<\/strong><\/p>\n<p align=\"left\">\u9996\u5148\u751f\u6210\u5bc6\u94a5 , \u5e76\u4fdd\u5b58 ( \u8fd9\u91cc\u5e76\u6ca1\u7684\u4fdd\u5b58\u7684\u4ee3\u7801 , \u53ef\u53c2\u8003 DSA \u4e2d\u7684\u65b9\u6cd5 )<\/p>\n<p align=\"left\">KeyGenerator keygen = KeyGenerator.getInstance(Algorithm);<\/p>\n<p align=\"left\">SecretKey deskey = keygen.generateKey();<\/p>\n<p align=\"left\">\u7528\u5bc6\u94a5\u52a0\u5bc6\u660e\u6587 (myinfo), \u751f\u6210\u5bc6\u6587 (cipherByte)<\/p>\n<p align=\"left\">Cipher c1 = Cipher.getInstance(Algorithm);<\/p>\n<p align=\"left\">c1.init(Cipher.ENCRYPT_MODE,deskey);<\/p>\n<p align=\"left\">byte[] cipherByte=c1.doFinal(myinfo.getBytes());<\/p>\n<p align=\"left\">\u4f20\u9001\u5bc6\u6587\u548c\u5bc6\u94a5 , \u672c\u6587\u6ca1\u6709\u76f8\u5e94\u4ee3\u7801\u53ef\u53c2\u8003 DSA<\/p>\n<p align=\"left\">&#8230;&#8230;&#8230;&#8230;.<\/p>\n<p align=\"left\">\u7528\u5bc6\u94a5\u89e3\u5bc6\u5bc6\u6587<\/p>\n<p align=\"left\">c1 = Cipher.getInstance(Algorithm);<\/p>\n<p align=\"left\">c1.init(Cipher.DECRYPT_MODE,deskey);<\/p>\n<p align=\"left\">byte[] clearByte=c1.doFinal(cipherByte);<\/p>\n<p align=\"left\">\u76f8\u5bf9\u6765\u8bf4\u5bf9\u79f0\u5bc6\u94a5\u7684\u4f7f\u7528\u662f\u5f88\u7b80\u5355\u7684 , \u5bf9\u4e8e JCE \u6765\u8bb2\u652f\u6280 DES,DESede,Blowfish \u4e09\u79cd\u52a0\u5bc6\u672f<\/p>\n<p align=\"left\">\u5bf9\u4e8e\u5bc6\u94a5\u7684\u4fdd\u5b58\u5404\u4f20\u9001\u53ef\u4f7f\u7528\u5bf9\u8c61\u6d41\u6216\u8005\u7528\u4e8c\u8fdb\u5236\u7f16\u7801 , \u76f8\u5173\u53c2\u8003\u4ee3\u7801\u5982\u4e0b<\/p>\n<table border=\"1\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<p align=\"left\">SecretKey deskey = keygen.generateKey();<\/p>\n<p align=\"left\">byte[] desEncode=deskey.getEncoded();<\/p>\n<p align=\"left\">javax.crypto.spec.SecretKeySpec destmp =<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 new javax.crypto.spec.SecretKeySpec(desEncode,Algorithm);<\/p>\n<p align=\"left\">SecretKey mydeskey=destmp;<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p align=\"left\">\u76f8\u5173 API<\/p>\n<p align=\"left\">KeyGenerator \u5728 DSA \u4e2d\u5df2\u7ecf\u8bf4\u660e , \u5728\u6dfb\u52a0 JCE \u540e\u5728 instance \u8fdb\u53ef\u4ee5\u5982\u4e0b\u53c2\u6570<\/p>\n<p align=\"left\">DES,DESede,Blowfish,HmacMD5,HmacSHA1<\/p>\n<p align=\"left\">javax.crypto.Cipher \u52a0 \/ \u89e3\u5bc6\u5668<\/p>\n<table border=\"1\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<p align=\"left\">public static final Cipher getInstance(java.lang.String transformation)<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 throws java.security.NoSuchAlgorithmException,<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 NoSuchPaddingException<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p align=\"left\">\u8fd4\u56de\u4e00\u4e2a\u6307\u5b9a\u65b9\u6cd5\u7684 Cipher \u5bf9\u8c61<\/p>\n<p align=\"left\"><code>\u53c2\u6570 :transformation \u65b9\u6cd5\u540d ( \u53ef\u7528 DES,DESede,Blowfish)<\/code><\/p>\n<p align=\"left\">public final void init(int opmode, java.security.Key key)<br \/>\nthrows java.security.InvalidKeyException<\/p>\n<p align=\"left\">\u7528\u6307\u5b9a\u7684\u5bc6\u94a5\u548c\u6a21\u5f0f\u521d\u59cb\u5316 Cipher \u5bf9\u8c61<\/p>\n<p align=\"left\"><code>\u53c2\u6570:opmode \u65b9\u5f0f (ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE,UNWRAP_MODE)<\/code><\/p>\n<p align=\"left\">key \u5bc6\u94a5<\/p>\n<table border=\"1\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<p align=\"left\">public final byte[] doFinal(byte[] input)<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0throws java.lang.IllegalStateException,<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 IllegalBlockSizeException,<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BadPaddingException<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p align=\"left\">\u5bf9 input \u5185\u7684\u4e32 , \u8fdb\u884c\u7f16\u7801\u5904\u7406 , \u8fd4\u56de\u5904\u7406\u540e\u4e8c\u8fdb\u5236\u4e32 , \u662f\u8fd4\u56de\u89e3\u5bc6\u6587\u8fd8\u662f\u52a0\u89e3\u6587\u7531 init \u65f6\u7684 opmode \u51b3\u5b9a<\/p>\n<p align=\"left\">\u6ce8\u610f : \u672c\u65b9\u6cd5\u7684\u6267\u884c\u524d\u5982\u679c\u6709 update, \u662f\u5bf9 updat \u548c\u672c\u6b21 input \u5168\u90e8\u5904\u7406 , \u5426\u5219\u662f\u672c inout \u7684\u5185\u5bb9<\/p>\n<table border=\"1\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\/*<\/p>\n<p align=\"left\">\u5b89\u5168\u7a0b\u5e8f DESede\/DES \u6d4b\u8bd5<\/p>\n<p align=\"left\">\u00a0*\/<\/p>\n<p align=\"left\">\u00a0import java.security.*;<\/p>\n<p align=\"left\">\u00a0import javax.crypto.*;<\/p>\n<p align=\"left\">\u00a0public class testdes {<\/p>\n<p align=\"left\">\u00a0public static void main(String[] args){<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 testdes my=new testdes();<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 my.run();<\/p>\n<p align=\"left\">\u00a0 }<\/p>\n<p align=\"left\">\u00a0public\u00a0 void run() {<\/p>\n<p align=\"left\">\u00a0\/\/ \u6dfb\u52a0\u65b0\u5b89\u5168\u7b97\u6cd5 , \u5982\u679c\u7528 JCE \u5c31\u8981\u628a\u5b83\u6dfb\u52a0\u8fdb\u53bb<\/p>\n<p align=\"left\">\u00a0Security.addProvider(new com.sun.crypto.provider.SunJCE());<\/p>\n<p align=\"left\">\u00a0String Algorithm=&#8221;DES&#8221;; \/\/ \u5b9a\u4e49 \u52a0\u5bc6\u7b97\u6cd5 , \u53ef\u7528 DES,DESede,Blowfish<\/p>\n<p align=\"left\">\u00a0String myinfo=&#8221;\u8981\u52a0\u5bc6\u7684\u4fe1\u606f&#8221;;<\/p>\n<p align=\"left\">\u00a0\u00a0 try {<\/p>\n<p align=\"left\">\u00a0\u00a0 \/\/ \u751f\u6210\u5bc6\u94a5<\/p>\n<p align=\"left\">\u00a0\u00a0 KeyGenerator keygen = KeyGenerator.getInstance(Algorithm);<\/p>\n<p align=\"left\">\u00a0\u00a0 SecretKey deskey = keygen.generateKey();<\/p>\n<p align=\"left\">\u00a0\u00a0 \/\/ \u52a0\u5bc6<\/p>\n<p align=\"left\">\u00a0\u00a0 System.out.println(&#8220;\u52a0\u5bc6\u524d\u7684\u4e8c\u8fdb\u4e32 :&#8221;+byte2hex(myinfo.getBytes()));<\/p>\n<p align=\"left\">\u00a0\u00a0 System.out.println(&#8220;\u52a0\u5bc6\u524d\u7684\u4fe1\u606f :&#8221;+myinfo);<\/p>\n<p align=\"left\">\u00a0\u00a0 Cipher c1 = Cipher.getInstance(Algorithm);<\/p>\n<p align=\"left\">\u00a0\u00a0 c1.init(Cipher.ENCRYPT_MODE,deskey);<\/p>\n<p align=\"left\">\u00a0\u00a0 byte[] cipherByte=c1.doFinal(myinfo.getBytes());<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 System.out.println(&#8220;\u52a0\u5bc6\u540e\u7684\u4e8c\u8fdb\u4e32 :&#8221;+byte2hex(cipherByte));<\/p>\n<p align=\"left\">\u00a0\u00a0 \/\/ \u89e3\u5bc6<\/p>\n<p align=\"left\">\u00a0\u00a0 c1 = Cipher.getInstance(Algorithm);<\/p>\n<p align=\"left\">\u00a0\u00a0 c1.init(Cipher.DECRYPT_MODE,deskey);<\/p>\n<p align=\"left\">\u00a0\u00a0 byte[] clearByte=c1.doFinal(cipherByte);<\/p>\n<p align=\"left\">\u00a0\u00a0 System.out.println(&#8220;\u89e3\u5bc6\u540e\u7684\u4e8c\u8fdb\u4e32 :&#8221;+byte2hex(clearByte));<\/p>\n<p align=\"left\">\u00a0\u00a0 System.out.println(&#8220;\u89e3\u5bc6\u540e\u7684\u4fe1\u606f :&#8221;+(new String(clearByte)));<\/p>\n<p align=\"left\">\u00a0 }<\/p>\n<p align=\"left\">\u00a0\u00a0 catch (java.security.NoSuchAlgorithmException e1) {e1.printStackTrace();}<\/p>\n<p align=\"left\">\u00a0\u00a0 catch (javax.crypto.NoSuchPaddingException e2) {e2.printStackTrace();}<\/p>\n<p align=\"left\">\u00a0\u00a0 catch (java.lang.Exception e3) {e3.printStackTrace();}<\/p>\n<p align=\"left\">\u00a0 }<\/p>\n<p align=\"left\">\u00a0public String byte2hex(byte[] b) \/\/ \u4e8c\u884c\u5236\u8f6c\u5b57\u7b26\u4e32<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 {<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0 String hs=&#8221;&#8221;;<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0 String stmp=&#8221;&#8221;;<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0 for (int n=0;n&lt;b.length;n++)<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 stmp=(java.lang.Integer.toHexString(b[n] &amp; 0XFF));<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (stmp.length()==1) hs=hs+&#8221;0&#8243;+stmp;<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else hs=hs+stmp;<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (n&lt;b.length-1)\u00a0 hs=hs+&#8221;:&#8221;;<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0 return hs.toUpperCase();<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 }<\/p>\n<p align=\"left\">\u00a0}<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p align=\"left\"><strong>2.5. Diffie-Hellman <\/strong><strong>\u5bc6\u94a5\u4e00\u81f4\u534f\u8bae<\/strong><\/p>\n<p align=\"left\">\u516c\u5f00\u5bc6\u94a5\u5bc6\u7801\u4f53\u5236\u7684\u5960\u57fa\u4eba Diffie \u548c Hellman \u6240\u63d0\u51fa\u7684 &#8220;\u6307\u6570\u5bc6\u94a5\u4e00\u81f4\u534f\u8bae&#8221;(Exponential Key Agreement Protocol), \u8be5\u534f\u8bae\u4e0d\u8981\u6c42\u522b\u7684\u5b89\u5168\u6027 \u5148\u51b3\u6761\u4ef6 , \u5141\u8bb8\u4e24\u540d\u7528\u6237\u5728\u516c\u5f00\u5a92\u4f53\u4e0a\u4ea4\u6362\u4fe1\u606f\u4ee5\u751f\u6210&#8221;\u4e00\u81f4&#8221;\u7684 , \u53ef\u4ee5\u5171\u4eab\u7684\u5bc6\u94a5\u3002\u5728 JCE \u7684\u4e2d\u5b9e\u73b0\u7528\u6237 alice \u751f\u6210 DH \u7c7b\u578b\u7684\u5bc6\u94a5\u5bf9 , \u5982\u679c\u957f\u5ea6\u7528 1024 \u751f\u6210\u7684\u65f6\u95f4\u8bf7 , \u63a8\u8350\u7b2c\u4e00\u6b21\u751f\u6210\u540e\u4fdd\u5b58 DHParameterSpec, \u4ee5\u4fbf\u4e0b\u6b21\u4f7f\u7528\u76f4\u63a5\u521d\u59cb\u5316 . \u4f7f\u5176\u901f\u5ea6\u52a0\u5feb<\/p>\n<table border=\"1\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<p align=\"left\">System.out.println(&#8220;ALICE: \u4ea7\u751f DH \u5bf9 &#8230;&#8221;);<\/p>\n<p align=\"left\">\u00a0KeyPairGenerator aliceKpairGen = KeyPairGenerator.getInstance(&#8220;DH&#8221;);<\/p>\n<p align=\"left\">\u00a0aliceKpairGen.initialize(512);<\/p>\n<p align=\"left\">\u00a0KeyPair aliceKpair = aliceKpairGen.generateKeyPair();<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p align=\"left\">alice \u751f\u6210\u516c\u94a5\u53d1\u9001\u7ec4 bob<\/p>\n<table border=\"1\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<p align=\"left\">byte[] alicePubKeyEnc = aliceKpair.getPublic().getEncoded();<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p align=\"left\">bob \u4ece alice \u53d1\u9001\u6765\u7684\u516c\u94a5\u4e2d\u8bfb\u51fa DH \u5bc6\u94a5\u5bf9\u7684\u521d\u59cb\u53c2\u6570\u751f\u6210 bob \u7684 DH \u5bc6\u94a5\u5bf9<\/p>\n<p align=\"left\">\u6ce8\u610f\u8fd9\u4e00\u6b65\u4e00\u5b9a\u8981\u505a , \u8981\u4fdd\u8bc1\u6bcf\u4e2a\u7528\u6237\u7528\u76f8\u540c\u7684\u521d\u59cb\u53c2\u6570\u751f\u6210\u7684<\/p>\n<table border=\"1\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u00a0 DHParameterSpec dhParamSpec = ((DHPublicKey)alicePubKey).getParams();<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 KeyPairGenerator bobKpairGen = KeyPairGenerator.getInstance(&#8220;DH&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 bobKpairGen.initialize(dhParamSpec);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 KeyPair bobKpair = bobKpairGen.generateKeyPair();<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p align=\"left\">bob \u6839\u636e alice \u7684\u516c\u94a5\u751f\u6210\u672c\u5730\u7684 DES \u5bc6\u94a5<\/p>\n<table border=\"1\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u00a0 KeyAgreement bobKeyAgree = KeyAgreement.getInstance(&#8220;DH&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 bobKeyAgree.init(bobKpair.getPrivate());<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 bobKeyAgree.doPhase(alicePubKey, true);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 SecretKey bobDesKey = bobKeyAgree.generateSecret(&#8220;DES&#8221;);<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p align=\"left\">bob \u5df2\u7ecf\u751f\u6210\u4e86\u4ed6\u7684 DES \u5bc6\u94a5 , \u4ed6\u73b0\u628a\u4ed6\u7684\u516c\u94a5\u53d1\u7ed9 alice,<\/p>\n<table border=\"1\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0 byte[] bobPubKeyEnc = bobKpair.getPublic().getEncoded();<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p align=\"left\">alice \u6839\u636e bob \u7684\u516c\u94a5\u751f\u6210\u672c\u5730\u7684 DES \u5bc6\u94a5<\/p>\n<table border=\"1\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0 ,,,,,, \u89e3\u7801<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 KeyAgreement aliceKeyAgree = KeyAgreement.getInstance(&#8220;DH&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 aliceKeyAgree.init(aliceKpair.getPrivate());<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 aliceKeyAgree.doPhase(bobPubKey, true);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 SecretKey aliceDesKey = aliceKeyAgree.generateSecret(&#8220;DES&#8221;);<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p align=\"left\">bob \u548c alice \u80fd\u8fc7\u8fd9\u4e2a\u8fc7\u7a0b\u5c31\u751f\u6210\u4e86\u76f8\u540c\u7684 DES \u5bc6\u94a5 , \u5728\u8fd9\u79cd\u57fa\u7840\u5c31\u53ef\u8fdb\u884c\u5b89\u5168\u80fd\u4fe1<\/p>\n<p align=\"left\"><strong>\u5e38\u7528<\/strong><strong> API<\/strong><\/p>\n<p align=\"left\">java.security.KeyPairGenerator \u5bc6\u94a5\u751f\u6210\u5668\u7c7b<br \/>\npublic static KeyPairGenerator getInstance(String algorithm)<br \/>\nthrows NoSuchAlgorithmException<br \/>\n\u4ee5\u6307\u5b9a\u7684\u7b97\u6cd5\u8fd4\u56de\u4e00\u4e2a KeyPairGenerator \u5bf9\u8c61<br \/>\n\u53c2\u6570 : algorithm \u7b97\u6cd5\u540d . \u5982 : \u539f\u6765\u662f DSA, \u73b0\u5728\u6dfb\u52a0\u4e86 DiffieHellman(DH)<\/p>\n<p align=\"left\">public void initialize(int keysize)<br \/>\n\u4ee5\u6307\u5b9a\u7684\u957f\u5ea6\u521d\u59cb\u5316 KeyPairGenerator \u5bf9\u8c61 , \u5982\u679c\u6ca1\u6709\u521d\u59cb\u5316\u7cfb\u7edf\u4ee5 1024 \u957f\u5ea6\u9ed8\u8ba4\u8bbe\u7f6e<br \/>\n\u53c2\u6570 :keysize \u7b97\u6cd5\u4f4d\u957f . \u5176\u8303\u56f4\u5fc5\u987b\u5728 512 \u5230 1024 \u4e4b\u95f4\uff0c\u4e14\u5fc5\u987b\u4e3a 64 \u7684\u500d\u6570<br \/>\n\u6ce8\u610f : \u5982\u679c\u7528 1024 \u751f\u957f\u7684\u65f6\u95f4\u5f88\u957f , \u6700\u597d\u751f\u6210\u4e00\u6b21\u540e\u5c31\u4fdd\u5b58 , \u4e0b\u6b21\u5c31\u4e0d\u7528\u751f\u6210\u4e86<\/p>\n<p align=\"left\">public void initialize(AlgorithmParameterSpec params)<br \/>\nthrows InvalidAlgorithmParameterException<br \/>\n\u4ee5\u6307\u5b9a\u53c2\u6570\u521d\u59cb\u5316<\/p>\n<p align=\"left\">javax.crypto.interfaces.DHPublicKey<br \/>\npublic DHParameterSpec getParams()<br \/>\n\u8fd4\u56de<br \/>\njava.security.KeyFactory<\/p>\n<p align=\"left\">public static KeyFactory getInstance(String algorithm)<br \/>\nthrows NoSuchAlgorithmException<br \/>\n<code>\u4ee5\u6307\u5b9a\u7684\u7b97\u6cd5\u8fd4\u56de\u4e00\u4e2a KeyFactory<br \/>\n\u53c2\u6570 : algorithm \u7b97\u6cd5\u540d:DSH,DH<\/code><\/p>\n<p align=\"left\">public final PublicKey generatePublic(KeySpec keySpec)<br \/>\nthrows InvalidKeySpecException<br \/>\n\u6839\u636e\u6307\u5b9a\u7684 key \u8bf4\u660e , \u8fd4\u56de\u4e00\u4e2a PublicKey \u5bf9\u8c61<\/p>\n<p align=\"left\">java.security.spec.X509EncodedKeySpec<br \/>\npublic X509EncodedKeySpec(byte[] encodedKey)<br \/>\n\u6839\u636e\u6307\u5b9a\u7684\u4e8c\u8fdb\u5236\u7f16\u7801\u7684\u5b57\u4e32\u751f\u6210\u4e00\u4e2a key \u7684\u8bf4\u660e<br \/>\n\u53c2\u6570 :encodedKey \u4e8c\u8fdb\u5236\u7f16\u7801\u7684\u5b57\u4e32 ( \u4e00\u822c\u80fd\u8fc7 PublicKey.getEncoded() \u751f\u6210 )<br \/>\njavax.crypto.KeyAgreement \u5bc6\u7801\u4e00\u81f3\u7c7b<\/p>\n<p align=\"left\">public static final KeyAgreement getInstance(java.lang.String algorithm)<br \/>\nthrows java.security.NoSuchAlgorithmException<br \/>\n\u8fd4\u56de\u4e00\u4e2a\u6307\u5b9a\u7b97\u6cd5\u7684 KeyAgreement \u5bf9\u8c61<br \/>\n\u53c2\u6570 :algorithm \u7b97\u6cd5\u540d , \u73b0\u5728\u53ea\u80fd\u662f DiffieHellman(DH)<\/p>\n<p align=\"left\">public final void init(java.security.Key key)<br \/>\nthrows java.security.InvalidKeyException<br \/>\n\u7528\u6307\u5b9a\u7684\u79c1\u94a5\u521d\u59cb\u5316<br \/>\n\u53c2\u6570 :key \u4e00\u4e2a\u79c1\u94a5<\/p>\n<p align=\"left\">public final java.security.Key doPhase(java.security.Key key,<br \/>\nboolean lastPhase)<br \/>\nthrows java.security.InvalidKeyException,<br \/>\njava.lang.IllegalStateException<br \/>\n\u7528\u6307\u5b9a\u7684\u516c\u94a5\u8fdb\u884c\u5b9a\u4f4d ,lastPhase \u786e\u5b9a\u8fd9\u662f\u5426\u662f\u6700\u540e\u4e00\u4e2a\u516c\u94a5 , \u5bf9\u4e8e\u4e24\u4e2a\u7528\u6237\u7684<br \/>\n\u60c5\u51b5\u4e0b\u5c31\u53ef\u4ee5\u591a\u6b21\u5b9a\u6b21 , \u6700\u540e\u786e\u5b9a<br \/>\n\u53c2\u6570 :key \u516c\u94a5<br \/>\nlastPhase \u662f\u5426\u6700\u540e\u516c\u94a5<\/p>\n<p align=\"left\">public final SecretKey generateSecret(java.lang.String algorithm)<br \/>\nthrows java.lang.IllegalStateException,<br \/>\njava.security.NoSuchAlgorithmException,<br \/>\njava.security.InvalidKeyException<br \/>\n\u6839\u636e\u6307\u5b9a\u7684\u7b97\u6cd5\u751f\u6210\u5bc6\u94a5<br \/>\n\u53c2\u6570 :algorithm \u52a0\u5bc6\u7b97\u6cd5 ( \u53ef\u7528 DES,DESede,Blowfish)<\/p>\n<table border=\"1\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<p align=\"left\">*\/<\/p>\n<p align=\"left\">\u00a0import java.io.*;<\/p>\n<p align=\"left\">\u00a0import java.math.BigInteger;<\/p>\n<p align=\"left\">\u00a0import java.security.*;<\/p>\n<p align=\"left\">\u00a0import java.security.spec.*;<\/p>\n<p align=\"left\">\u00a0import java.security.interfaces.*;<\/p>\n<p align=\"left\">\u00a0import javax.crypto.*;<\/p>\n<p align=\"left\">\u00a0import javax.crypto.spec.*;<\/p>\n<p align=\"left\">\u00a0import javax.crypto.interfaces.*;<\/p>\n<p align=\"left\">\u00a0import com.sun.crypto.provider.SunJCE;<\/p>\n<p align=\"left\">\u00a0public class testDHKey {<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 public static void main(String argv[]) {<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 try {<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 testDHKey my= new testDHKey();<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 my.run();<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 } catch (Exception e) {<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.err.println(e);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 }<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 }<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 private void run() throws Exception {<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Security.addProvider(new com.sun.crypto.provider.SunJCE());<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 System.out.println(&#8220;ALICE: \u4ea7\u751f DH \u5bf9 &#8230;&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 KeyPairGenerator aliceKpairGen = KeyPairGenerator.getInstance(&#8220;DH&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 aliceKpairGen.initialize(512);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 KeyPair aliceKpair = aliceKpairGen.generateKeyPair(); \/\/ \u751f\u6210\u65f6\u95f4\u957f<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ \u5f20\u4e09 (Alice) \u751f\u6210\u516c\u5171\u5bc6\u94a5 alicePubKeyEnc \u5e76\u53d1\u9001\u7ed9\u674e\u56db (Bob) ,<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ \u6bd4\u5982\u7528\u6587\u4ef6\u65b9\u5f0f ,socket&#8230;..<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 byte[] alicePubKeyEnc = aliceKpair.getPublic().getEncoded();<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/bob \u63a5\u6536\u5230 alice \u7684\u7f16\u7801\u540e\u7684\u516c\u94a5 , \u5c06\u5176\u89e3\u7801<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 KeyFactory bobKeyFac = KeyFactory.getInstance(&#8220;DH&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec\u00a0 (alicePubKeyEnc);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 PublicKey alicePubKey = bobKeyFac.generatePublic(x509KeySpec);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(&#8220;alice \u516c\u94a5 bob \u89e3\u7801\u6210\u529f&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0 \/\/ bob \u5fc5\u987b\u7528\u76f8\u540c\u7684\u53c2\u6570\u521d\u59cb\u5316\u7684\u4ed6\u7684 DH KEY \u5bf9 , \u6240\u4ee5\u8981\u4ece Alice \u53d1\u7ed9\u4ed6\u7684\u516c\u5f00\u5bc6\u94a5 ,<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ \u4e2d\u8bfb\u51fa\u53c2\u6570 , \u518d\u7528\u8fd9\u4e2a\u53c2\u6570\u521d\u59cb\u5316\u4ed6\u7684 DH key \u5bf9<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ \u4ece alicePubKye \u4e2d\u53d6 alice \u521d\u59cb\u5316\u65f6\u7528\u7684\u53c2\u6570<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 DHParameterSpec dhParamSpec = ((DHPublicKey)alicePubKey).getParams();<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 KeyPairGenerator bobKpairGen = KeyPairGenerator.getInstance(&#8220;DH&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 bobKpairGen.initialize(dhParamSpec);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 KeyPair bobKpair = bobKpairGen.generateKeyPair();<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0System.out.println(&#8220;BOB: \u751f\u6210 DH key \u5bf9\u6210\u529f&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 KeyAgreement bobKeyAgree = KeyAgreement.getInstance(&#8220;DH&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 bobKeyAgree.init(bobKpair.getPrivate());<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(&#8220;BOB: \u521d\u59cb\u5316\u672c\u5730 key \u6210\u529f&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ \u674e\u56db (bob) \u751f\u6210\u672c\u5730\u7684\u5bc6\u94a5 bobDesKey<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 bobKeyAgree.doPhase(alicePubKey, true);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 SecretKey bobDesKey = bobKeyAgree.generateSecret(&#8220;DES&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 System.out.println(&#8220;BOB: \u7528 alice \u7684\u516c\u94a5\u5b9a\u4f4d\u672c\u5730 key, \u751f\u6210\u672c\u5730 DES \u5bc6\u94a5\u6210\u529f&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Bob \u751f\u6210\u516c\u5171\u5bc6\u94a5 bobPubKeyEnc \u5e76\u53d1\u9001\u7ed9 Alice,<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ \u6bd4\u5982\u7528\u6587\u4ef6\u65b9\u5f0f ,socket&#8230;.., \u4f7f\u5176\u751f\u6210\u672c\u5730\u5bc6\u94a5<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 byte[] bobPubKeyEnc = bobKpair.getPublic().getEncoded();<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(&#8220;BOB \u5411 ALICE \u53d1\u9001\u516c\u94a5&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ alice \u63a5\u6536\u5230 bobPubKeyEnc \u540e\u751f\u6210 bobPubKey<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ \u518d\u8fdb\u884c\u5b9a\u4f4d , \u4f7f aliceKeyAgree \u5b9a\u4f4d\u5728 bobPubKey<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 KeyFactory aliceKeyFac = KeyFactory.getInstance(&#8220;DH&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 x509KeySpec = new X509EncodedKeySpec(bobPubKeyEnc);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 PublicKey bobPubKey = aliceKeyFac.generatePublic(x509KeySpec);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(&#8220;ALICE \u63a5\u6536 BOB \u516c\u94a5\u5e76\u89e3\u7801\u6210\u529f&#8221;);<\/p>\n<p align=\"left\">\u00a0;<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 KeyAgreement aliceKeyAgree = KeyAgreement.getInstance(&#8220;DH&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 aliceKeyAgree.init(aliceKpair.getPrivate());<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(&#8220;ALICE: \u521d\u59cb\u5316\u672c\u5730 key \u6210\u529f&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 aliceKeyAgree.doPhase(bobPubKey, true);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ \u5f20\u4e09 (alice) \u751f\u6210\u672c\u5730\u7684\u5bc6\u94a5 aliceDesKey<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 SecretKey aliceDesKey = aliceKeyAgree.generateSecret(&#8220;DES&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(&#8220;ALICE: \u7528 bob \u7684\u516c\u94a5\u5b9a\u4f4d\u672c\u5730 key, \u5e76\u751f\u6210\u672c\u5730 DES \u5bc6\u94a5&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (aliceDesKey.equals(bobDesKey)) System.out.println(&#8220;\u5f20\u4e09\u548c\u674e\u56db\u7684\u5bc6\u94a5\u76f8\u540c&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ \u73b0\u5728\u5f20\u4e09\u548c\u674e\u56db\u7684\u672c\u5730\u7684 deskey \u662f\u76f8\u540c\u7684\u6240\u4ee5 , \u5b8c\u5168\u53ef\u4ee5\u8fdb\u884c\u53d1\u9001\u52a0\u5bc6 , \u63a5\u6536\u540e\u89e3\u5bc6 , \u8fbe\u5230<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ \u5b89\u5168\u901a\u9053\u7684\u7684\u76ee\u7684<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/*<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0* bob \u7528 bobDesKey \u5bc6\u94a5\u52a0\u5bc6\u4fe1\u606f<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 *\/<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 Cipher bobCipher = Cipher.getInstance(&#8220;DES&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 bobCipher.init(Cipher.ENCRYPT_MODE, bobDesKey);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 String bobinfo= &#8220;\u8fd9\u662f\u674e\u56db\u7684\u673a\u5bc6\u4fe1\u606f&#8221;;<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(&#8220;\u674e\u56db\u52a0\u5bc6\u524d\u539f\u6587 :&#8221;+bobinfo);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 byte[] cleartext =bobinfo.getBytes();<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 byte[] ciphertext = bobCipher.doFinal(cleartext);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/*<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 * alice \u7528 aliceDesKey \u5bc6\u94a5\u89e3\u5bc6<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 *\/<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 Cipher aliceCipher = Cipher.getInstance(&#8220;DES&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 aliceCipher.init(Cipher.DECRYPT_MODE, aliceDesKey);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 byte[] recovered = aliceCipher.doFinal(ciphertext);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(&#8220;alice \u89e3\u5bc6 bob \u7684\u4fe1\u606f :&#8221;+(new String(recovered)));<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 if (!java.util.Arrays.equals(cleartext, recovered))<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 throw new Exception(&#8220;\u89e3\u5bc6\u540e\u4e0e\u539f\u6587\u4fe1\u606f\u4e0d\u540c&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 System.out.println(&#8220;\u89e3\u5bc6\u540e\u76f8\u540c&#8221;);<\/p>\n<p align=\"left\">\u00a0\u00a0\u00a0 }<\/p>\n<p align=\"left\">\u00a0}<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 align=\"left\"><strong>\u7b2c<\/strong><strong> 3 <\/strong><strong>\u7ae0\u5c0f\u7ed3<\/strong><\/h2>\n<p align=\"left\">\u5728\u52a0\u5bc6\u672f\u4e2d\u751f\u6210\u5bc6\u94a5\u5bf9\u65f6\uff0c\u5bc6\u94a5\u5bf9\u7684\u5f53\u7136\u662f\u8d8a\u957f\u8d8a\u597d\uff0c\u4f46\u8d39\u65f6\u4e5f\u8d8a\u591a\uff0c\u8bf7\u4ece\u4e2d\u4ece\u5b9e\u9645\u51fa\u53d1\u9009\u53d6\u5408\u9002\u7684\u957f\u5ea6\uff0c\u5927\u90e8\u5206\u4f8b\u7801\u4e2d\u7684\u5bc6\u94a5\u662f\u6bcf\u6b21\u8fd0\u884c\u5c31\u4ece\u65b0\u751f\u6210\uff0c\u5728\u5b9e\u9645\u7684\u60c5\u51b5\u4e2d\u662f\u751f\u6210\u540e\u5728\u4e00\u6bb5\u65f6\u95f4\u4fdd\u5b58\u5728\u6587\u4ef6\u4e2d\uff0c\u518d\u6b21\u8fd0\u884c\u76f4\u63a5\u4ece\u6587\u4ef6\u4e2d\u8bfb\u5165\uff0c\u4ece\u800c\u52a0\u5feb\u901f\u5ea6\u3002\u5f53\u7136\u5b9a\u65f6\u66f4\u65b0\u548c\u52a0\u5f3a\u5bc6\u94a5\u4fdd\u7ba1\u7684\u5b89\u5168\u6027\u4e5f\u662f\u5fc5\u987b\u7684\u3002<\/p>\n<h2 align=\"left\"><span style=\"text-indent: 2em;\">\u00a0\u8f6c\u8f7d\u81ea\uff1a<\/span><a style=\"text-indent: 2em;\" href=\"http:\/\/www.ibm.com\/developerworks\/cn\/java\/l-security\/\">http:\/\/www.ibm.com\/developerworks\/cn\/java\/l-security\/<\/a><\/h2>\n","protected":false},"excerpt":{"rendered":"<p>\u7b2c 1 \u7ae0\u57fa\u7840\u77e5\u8bc6 1.1. \u5355\u94a5\u5bc6\u7801\u4f53\u5236 \u5355\u94a5\u5bc6\u7801\u4f53\u5236\u662f\u4e00\u79cd\u4f20\u7edf\u7684\u52a0\u5bc6\u7b97\u6cd5\uff0c\u662f\u6307\u4fe1\u606f\u7684\u53d1\u9001\u65b9\u548c\u63a5\u6536\u65b9\u5171\u540c\u4f7f\u7528\u540c\u4e00\u628a\u5bc6\u94a5\u8fdb\u884c\u52a0\u89e3\u5bc6\u3002 \u901a\u5e38 , \u4f7f\u7528\u7684\u52a0\u5bc6\u7b97\u6cd5 \u6bd4\u8f83\u7b80\u4fbf\u9ad8\u6548 , \u5bc6\u94a5\u7b80\u77ed\uff0c\u52a0\u89e3\u5bc6\u901f\u5ea6\u5feb\uff0c\u7834\u8bd1\u6781\u5176\u56f0\u96be\u3002\u4f46\u662f\u52a0\u5bc6\u7684\u5b89\u5168\u6027\u4f9d\u9760\u5bc6\u94a5\u4fdd\u7ba1\u7684\u5b89\u5168\u6027 , \u5728\u516c\u5f00\u7684\u8ba1\u7b97\u673a\u7f51\u7edc\u4e0a\u5b89\u5168\u5730\u4f20\u9001\u548c\u4fdd\u7ba1\u5bc6\u94a5\u662f\u4e00\u4e2a\u4e25\u5cfb\u7684\u95ee\u9898\uff0c\u5e76\u4e14\u5982\u679c\u5728\u591a\u7528\u6237\u7684\u60c5\u51b5\u4e0b\u5bc6\u94a5\u7684\u4fdd\u7ba1\u5b89\u5168\u6027\u4e5f\u662f\u4e00\u4e2a\u95ee\u9898\u3002 \u5355\u94a5\u5bc6\u7801\u4f53\u5236\u7684\u4ee3\u8868\u662f\u7f8e\u56fd\u7684 DES<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,9],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.xiunian.wang\/index.php?rest_route=\/wp\/v2\/posts\/592"}],"collection":[{"href":"https:\/\/blog.xiunian.wang\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.xiunian.wang\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.xiunian.wang\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.xiunian.wang\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=592"}],"version-history":[{"count":1,"href":"https:\/\/blog.xiunian.wang\/index.php?rest_route=\/wp\/v2\/posts\/592\/revisions"}],"predecessor-version":[{"id":1759,"href":"https:\/\/blog.xiunian.wang\/index.php?rest_route=\/wp\/v2\/posts\/592\/revisions\/1759"}],"wp:attachment":[{"href":"https:\/\/blog.xiunian.wang\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=592"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.xiunian.wang\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=592"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.xiunian.wang\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=592"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}