BouncyCastle JCE實踐(六) (轉)

themoney發表於2007-10-05
BouncyCastle JCE實踐(六) (轉)[@more@]

簽名的實現過程:namespace prefix = o ns = "urn:schemas--com::office" />

1)讀取自己的私鑰

  對於自己的私鑰,要用File類來宣告。讀取時,將用FileInputStream格式來作為輸入流。而讀出的金鑰是位元組陣列,所以應該將讀出的金鑰用ByteArrayOutStream來儲存,再用toByteArray格式來將它轉化為位元組陣列。

生成簽名要使用自己的私鑰,而私鑰使用PKCS8#編碼。所以我們還要將位元組陣列轉化為PKCS8#編碼形式。實現方法如下:

PKCS8EncodedKeySpec keyspec=new PKCS8EncodedKeySpec(keybytes);

KeyFactory keyfactory=KeyFactory.getInstance("RSA");

syprivatekey=keyfactory.generatePrivate(keyspec);

其中keybytes是從原文中讀出的位元組陣列形式的金鑰。用KeyFactory的例項化方法來指定演算法,並用generatePrivate方法產生PKCS8#編碼的私鑰。

2)從對話方塊中取得要簽名的檔案

該步驟的實現比較簡單,不做過多說明。

3)將檔案內容讀取為位元組陣列格式

因為簽名時Signature類的Update()方法的引數是位元組陣列形式,所以要求

先將原文讀為位元組陣列。並且,在此處可以獲得原文的內容長度。

4)生成簽名

按照前面的描述,先用Signature類的getInstance()方法指定MD5WithRSA

演算法,然後用前面得到的私鑰作為引數initSign()方法來初始化,最後用原文作為引數呼叫update()方法來傳送資料,用位元組陣列形式的私鑰作為引數呼叫Sign()方法來產生簽名。

將生成的簽名按照前面設計的檔案格式寫入檔案流中,就完成了簽名的全部工作。簽名的實現過程可用下面的圖來表示:

 圖 數字簽名過程

程式碼實現如下:

//讀取私鑰

  PrivateKey syprivatekey=null;

  File syfile=new File("c:檔案"+misClass.username+"非對稱本人公私鑰yhb.private");

  try

  {

  FileInputStream fis=new FileInputStream(syfile);

  ByteArrayOutputStream baos=new ByteArrayOutputStream();

 

  int thebyte=0;

  while((thebyte=fis.read())!=-1)

  {baos.write(thebyte);

  }

  fis.close();

  byte[] keybytes=baos.toByteArray();

  baos.close();

 

  PKCS8EncodedKeySpec keyspec=new PKCS8EncodedKeySpec(keybytes);

  KeyFactory keyfactory=KeyFactory.getInstance("RSA");

  syprivatekey=keyfactory.generatePrivate(keyspec);

  }

  catch(Exception e9)

  {

  System.out.print("error when read the rsa private key");

  System.exit(0);

  }

  //從對話方塊中取得要簽名的檔案

  File file=new File(dirstring1,string1);

  String filename=file.getName();

  //首先將檔案讀為byte[]物件

  int len=(int)file.length();

  if(len>100000000)

  {System.out.println("the file length is too long!");

  System.exit(0);

  }

  byte[] inbuf=new byte[len];

  try{

  FileInputStream instream=new FileInputStream(file);

  int inbytes=instream.available();

  //inbuf[]=new byte[inbytes];

  int bytesread=instream.read(inbuf,0,inbytes);

  instream.close();

  //System.out.println(inbuf);

  }

  catch(Exception eq2)

  {

  System.out.println("error when change the file to byte[]");

  System.exit(0);

  }

  //簽名的具體過程

  try{

  //byte[] signaturebytes=new byte[150];

  Signature sig=Signature.getInstance("MD5WithRSA");

  sig.initSign(syprivatekey);

  sig.update(inbuf);

  byte[] signaturebytes=sig.sign();

  //寫入物件流中

  DataOutputStream outfile=new DataOutputStream(new FileOutputStream(

  "c:安全檔案檔案"+filename+".yhb3"));

  outfile.writeInt(signaturebytes.length);

  outfile.write(signaturebytes);

  outfile.writeInt(len);

  outfile.write(inbuf);

  outfile.close();

  }

  catch(Exception eh3)

  {

  System.out.println("error when generate the outfile");

  System.exit(0);

  }

 

 

作者又名HongSoft,研究領域:1)基於工作流的BPM研究2)基於的資訊保安技術.歡迎和大家討論JAVA相關各方面問題 to:hongbosoftware@163.com">hongbosoftware@163.com


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10794571/viewspace-974794/,如需轉載,請註明出處,否則將追究法律責任。

相關文章