用DSA演算法實現數位簽章

來源:互聯網
上載者:User

下面是一個在JAVA語言中,使用DSA簽名演算法來進行進行數位簽章的一個樣本。

DSA(Digital Signature Algorithm)是Schnorr和ElGamal簽名演算法的變種,被美國NIST作為數位簽章標準 (DSS)(DigitalSignature Standard)。參照JDK文檔中關於Signature類的敘述:NIST標準的DSA演算法應該本身就包含了散列演算法SHA-1和密碼編譯演算法DSA。

Signature.getInstance("DSA")等同於Signature.getInstance("SHA1withDSA");如果使用DSA作為數位簽章的密碼編譯演算法,則只能使用SHA1作為訊息散列(即訊息摘要)演算法。如果使用RSA作為數位簽章密碼編譯演算法,對訊息摘要演算法則會有多種選擇,因此,可以將簽名演算法指定為 MD2withRSA、MD5withRSA 或SHA1withRSA。關於使用RSA實現數位簽章請參照《用RSA實現數位簽章》如果你對數位簽章還不熟悉,請先閱讀《數位簽章簡介》及《Java的數位簽章和數位憑證》DSA_Demo.java檔案

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 DSA_Demo {DSA_Demo(){init();}private void init(){prepare();doSenderWork();doReceiverWork();}//share by sender and receiverSignature sign;//belong to sender,it visible to sender and receiverPublicKey publicKey;//belong to sender,it is only visible to senderPrivateKey privateKey;private void prepare(){KeyPairGenerator keyGen=null;try {//執行個體化一個DSA演算法的公開金鑰/私密金鑰對產生器keyGen=KeyPairGenerator.getInstance("DSA");} catch (NoSuchAlgorithmException e) {// TODO Auto-generated catch blocke.printStackTrace();}int keysize=1024;//設定公開金鑰/私密金鑰對的長度keyGen.initialize(keysize);//產生一個RSA演算法的公開金鑰/私密金鑰KeyPair keyPair=keyGen.generateKeyPair();privateKey=keyPair.getPrivate();publicKey=keyPair.getPublic();try {//執行個體化一個DSA簽名演算法的Signature.sign=Signature.getInstance("DSA");} catch (NoSuchAlgorithmException e) {// TODO Auto-generated catch blocke.printStackTrace();}}void doSenderWork(){String words="This is robin.How are you?This a DSA Signature Demo";Message msg=new Message(words.getBytes());try {//設定加密散列碼用的私密金鑰sign.initSign(privateKey);} catch (InvalidKeyException e) {// TODO Auto-generated catch blocke.printStackTrace();}
try {//設定散列演算法的輸入sign.update(msg.getBody());} catch (SignatureException e) {// TODO Auto-generated catch blocke.printStackTrace();}byte data[]=null;try {//進行散列,對產生的散列碼進行加密並返回data=sign.sign();} catch (SignatureException e) {// TODO Auto-generated catch blocke.printStackTrace();}//把加密後散列(即簽名)加到訊息中msg.setSignature(data);//發送訊息sendMsg(msg);}Message sendingMsg;void sendMsg(Message sendMsg){sendingMsg=sendMsg;System.out.println("sending Message Signed by DSA");}void doReceiverWork(){//收到訊息Message msg=getReceivedMsg();try {//設定解密散列碼用的公開金鑰。sign.initVerify(publicKey);} catch (InvalidKeyException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}try {//設定散列演算法的輸入sign.update(msg.getBody());} catch (SignatureException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {/*進行散列計算,比較計算所得散列碼是否和解密的散列碼是否一致。 * 一致則驗證成功,否則失敗*/if(sign.verify(msg.getSignature())){System.out.println("數位簽章驗證成功!");}else{System.out.println("數位簽章驗證失敗!");}} catch (SignatureException e) {// TODO Auto-generated catch blocke.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;}}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.