熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Javascript >> 正文

如何在java中編程實現數字簽名系統

2013-11-23 17:56:14  來源: Javascript 

  生成密鑰對
  生成密鑰對可用java提供的類KeyPairGenerator用其中的getInstance方法創建KeypairGenerator對象在用initialize進行初始化最後用generateKeyPair生成密鑰對密鑰對生成後就可以將其寫入文件中通過網絡或其他方式公告用戶用戶接收到數據文件和簽名文件後就可以使用公約來校驗數據文件的數字簽名
  
  判斷數據在網絡中的傳輸是否被非法修改
  ////GenerateKeyPairjava/////////////
  import javaio*;
  import javasecurity*;
  public class GenerateKeyPair{
  public static void main(String[] args){
  boolean bHelp=false;//sign for show help
  FileOutputStream fileOut;//輸出密鑰到文件
  byte[] pubkey;//存儲已編碼的公鑰字節
  byte[] privKey;//存儲已編碼的私鑰字節
  if(argslength!=){
  Systemoutprintln(Usage:GenerateKeyPair <keyname>;
  Systemoutprintln(Option:);
  Systemoutprintln(<keyname>:The key name that using to genera
  te filename);
  Systemexit();
  }
  try{
  Systemoutprintln(Generating a key pair);
  KeyPairGenarator keyGen=KeyPairGeneratorgetInstance(DSA);//使用DSA算法
  KeyGeninitialize(new SecureRandom());
  KeyPair pair=keyGengenerateKeyPair();
  PublicKey pub=pairgetPublic();
  PrivateKey priv=pairgetPrivate();
  pubkey=pubgetEncoded();
  privateKey= privgetEncoded();
  fileOut=new FileOutputStream(PublicKey_+args[]);
  fileOutwrite(pubKey);
  fileOutclose();
  fileOut=new FileOutputStream(privateKey_+args[]):
  fileOutwrite(privateKey);
  fileoutclose();
  Systemoutprintln(OK!);
  }catch(Exception e){
  }
  }
  }
  }
  
  生成數字簽名
  從私鑰文件讀取數據文件並將其轉換為PrivateKey對象可以使用KeyFactory類和PKCSEncodeKeySpec類KeyFactory可以利用給定的蜜月規范來建立不透明的密鑰對象也可以適當的格式取出蜜月對象中的密鑰信息 Signature是個引擎類提供了諸如DSA或是RSA with MD這樣的數字簽名算法
  碼學上安全的簽名算法可接受任意大小的輸入和一個私月並產生一個比較短的(常常是固定大小的)前名字揭穿並且簽名和公鑰部反映有關私鑰的任何內容Signature對象即可用於數據簽名也可用於校驗某個簽名是否為預制關聯的數據的真實簽名
  
  簽名或教研簽名的第一步是創建signature實例為特定類型的簽名算法或取signature對象的途徑是調用signature德getInstance靜態方法
  初始化方法有兩個取決於Signature的用途
  initSign()////用於簽名
  initVerify()//用於校驗
  如果sigature初始化為簽名則可將帶錢數據通過update方法提供給對象在調用sign來產生簽名即可
  下面以一個實例來說明
  ///////////////////SignDatajava////////////////
  import javaio*;
  import javasecurity*;
  import javasecurityspec*;
  public class SignData{
  public static void main(String [] args)
  {
  FileOutputStream fileOut;
  byte b;
  if(argslength!=)
  {
  Systemoutprintln(Usage:SignData <PrivateKey> <dataFile> <SignatureFile>);
  Systemoutprintln(Option:);
  Systemoutprintln(<PrivateKey>:The file name of the private Key);
  Systemoutprintln(<DataFile>: The filename that want to signature);
  Systemoutprintln(<signatureFile>:the filename containing signture data);
  }
  try{
  Systemoutprintln(Generating a digital signature);
  FileInputStream fileIn=new FileInputStream(args[]);
  byte[] encodedprivateKey=new byte[fileInavailable()];
  
  finleInread(encodedprivateKey);
  fileInclose();
  
  PKCSEncodeKeySpec privKeySpec=
  new PKCSEncodeKeySpec(encodedprivateKey);
  KeyFactory keyFactory=KeyFactorygetInstance(DSA);
  PrivateKey privKey=keyFactorygeneratePrivate(privateKeySpec);
  Signature dsa=SignaturegetInstance(SHA/DSA);
  dsainitSign(privKey);
  FileInputStream fis=new FileInputStream(args[]);
  while(fisavailable()!=){
  b=(byte)fisread();
  dsaupdate(b);
  }
  fisclose();
  byte[] sig=dsasign();
  fileOut=new FileOutputStream(args[]);
  fileOutwrite(sig);
  fileOutclose();
  Systemoutprintln(OK);
  }catch(Exception e){
  /////////
  }
  }
  }
  ///////////////////////End of SignDatajava//////////////////
  SignDatajava從文津中讀取已編碼的私鑰字節利用PKCSEncodeKeySpec對象將已編碼的四月字節轉換為PrivateKey對象然後利用Signature簽名數據文件生成簽名數據並將簽名數據寫道文件中
  
  //////VerifySignjava/////////////
  import javaio*;
  import javasecurity*;
  import javasecurityspec*;
  public class VerifySign{
  public static void main(String [] args)
  {
  if(argslength!=){
  Systemoutprintln(Usage:VerifySign <PublicKey> <dataFile> <SignatureFile>);
  Systemoutprintln(Option:);
  Systemoutprintln(<Public Key >The filename of the public key);
  Systemoutprintln(<DataFile>The filename that want to signature);
  Systemoutprintln(<SignatureFile>:The file name containing signature data);
  Systemexit();
  }
  try{
  FileInputStream fileIn=new FileInputStream(args[]);
  byte[] encodedpubKey =new byte[fileInavailable()];
  fileInread(encodedpubKey);
  fileInclose();
  XEncodedKeySpec pubKeySpec=
  new XEncodedKeySpec(encodedpubKey);
  KeyFactory keyFactory=KeyFactorygetInstance(DSA);
  PublicKey pubKey=keyFactorygeneratePublic(pubKeySpec);
  FileInputStream sigStream=new FileInputStream(args[]);
  byte[] signature=new byte[sigStreamavailable()];
  sigStreamread(signature);
  sigStreamclose();
  signature sigObj=SignaturegetInstance(SHAWithDSA);
  sigObjinitVerify(pubKey);
  fileIn=new FileInputStream(args[]);
  byte b;
  while(fileInavailable())!=)
  {
  b=(byte)fileInread();
  sigObjupdate(b);
  };
  fileInclose();
  boolean verifies=sigObjverify(signature);
  Systemoutprintln(Signature verifies:+verifies);
  }catch(Exception e){/////////////
  }
  }
  }
From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25387.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.