SHA1即安全哈希算法(Secure Hash Algorithm),,用于簽名,;RSA是目前最有影響力的公鑰加密算法,。
說到這就的提到公鑰和私鑰:公鑰,、私鑰分居客戶端和服務(wù)器端,分別用于加密和解密,。同時(shí),,私鑰還用于簽名,公鑰還用于驗(yàn)證簽名,。 下邊是一個(gè)發(fā)送端的簽名及對(duì)簽名的加密,,接收端的解密與驗(yàn)證簽名的應(yīng)用: /* * SHA1WithRSA:用SHA算法進(jìn)行簽名,用RSA算法進(jìn)行加密 * 發(fā)送端的簽名及對(duì)簽名的加密,,接收端的解密與驗(yàn)證簽名 */ package test1; import java.security.InvalidKeyException; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Signature; import java.security.SignatureException; public class RSA_Demo { RSA_Demo() { init(); } private void init() { prepare(); doSenderWork(); doReceiverWork(); } //share by sender and receiver Signature sign=null; //belong to sender,it visible to sender and receiver PublicKey publicKey=null; //belong to sender,it is only visible to sender PrivateKey privateKey; private void prepare() { KeyPairGenerator keyGen=null; try { //實(shí)例化一個(gè)RSA算法的公鑰/私鑰對(duì)生成器 keyGen=KeyPairGenerator.getInstance("RSA"); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } int keysize=1024; //設(shè)置公鑰/私鑰對(duì)的長(zhǎng)度 keyGen.initialize(keysize); //生成一個(gè)RSA算法的公鑰/私鑰 KeyPair keyPair=keyGen.generateKeyPair(); privateKey=keyPair.getPrivate(); publicKey=keyPair.getPublic(); try { //實(shí)例化一個(gè)用SHA算法進(jìn)行散列,,用RSA算法進(jìn)行加密的Signature. sign=Signature.getInstance("SHA1WithRSA"); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } } void doSenderWork() { String words="This is robin.How are you?"; Message msg=new Message(words.getBytes()); try { //設(shè)置加密散列碼用的私鑰 sign.initSign(privateKey); } catch (InvalidKeyException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { //設(shè)置散列算法的輸入 sign.update(msg.getBody()); } catch (SignatureException e) { // TODO Auto-generated catch block e.printStackTrace(); } byte data[]=null; try { //進(jìn)行散列,對(duì)產(chǎn)生的散列碼進(jìn)行加密并返回 data=sign.sign(); } catch (SignatureException e) { // TODO Auto-generated catch block e.printStackTrace(); } //把加密后散列(即簽名)加到消息中 msg.setSignature(data); //發(fā)送消息 sendMsg(msg); } Message sendingMsg; void sendMsg(Message sendMsg) { sendingMsg=sendMsg; System.out.println("sending Message"); } void doReceiverWork() { //收到消息 Message msg=getReceivedMsg(); try { //設(shè)置解密散列碼用的公鑰,。 sign.initVerify(publicKey); } catch (InvalidKeyException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { //設(shè)置散列算法的輸入 sign.update(msg.getBody()); } catch (SignatureException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { /*進(jìn)行散列計(jì)算,,比較計(jì)算所得散列碼是否和解密的散列碼是否一致。 * 一致則驗(yàn)證成功,,否則失敗 */ if(sign.verify(msg.getSignature())) { System.out.println("數(shù)字簽名驗(yàn)證成功,!"); } else { System.out.println("數(shù)字簽名驗(yàn)證失敗,!"); } } catch (SignatureException e) { // TODO Auto-generated catch block e.printStackTrace(); } } Message getReceivedMsg() { System.out.println("receiving Message"); return sendingMsg; } } class Message { private byte [] body; private byte [] signature; Message(byte data[]) { body=data; } byte[] getBody() { return body; } byte[] getSignature() { return signature; } void setSignature(byte data[]) { signature=data; } } |
|