BouncyCastle JCE實踐(六) (轉)
簽名的實現過程: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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- BouncyCastle JCE實踐(四) (轉)AST
- BouncyCastle JCE實踐(五) (轉)AST
- VC++ ADO開發實踐之六 (轉)C++
- Docker生產實踐(六)Docker
- PHP實踐之路(六)控制結構PHP
- CoreData實踐(六)——資料刪除
- 轉轉OLAP自助分析實踐
- 實踐法(轉載)
- Docker進階與實踐之六:容器卷管理Docker
- 【機器學習PAI實踐六】金融貸款發放預測機器學習AI
- 前後端分離的思考與實踐(六)後端
- 20211105BouncyCastleAST
- 直播轉點播實踐
- [轉]UNIX find命令實踐
- RMAN恢復實踐(轉)
- kubernetes實踐之六:CFSSL構建本地CA
- 軟體工程實踐(一) (轉)軟體工程
- 軟體工程實踐(二) (轉)軟體工程
- VC列印實踐淺談 (轉)
- 轉轉上門履約的LBS實踐
- 六西格瑪方法改善小公司的商業實踐
- Net8 使用BouncyCastle 生成自簽名證書AST
- C 程式設計最佳實踐(轉)程式設計
- 產品線實踐先導 (轉)
- 實踐中的增量計劃 (轉)
- lilo--實踐篇(FAQ) (轉)
- 轉轉倉儲自動化系統實踐
- 前端技術演進(六):前端專案與技術實踐前端
- 精益六西格瑪在供應鏈管理中的實踐
- STL程式設計實踐六:自定義型別儘量定義恆等和小於運算子 (轉)程式設計型別
- 關聯圖譜在轉轉風控的實踐
- 轉轉業務資料校驗平臺實踐分享
- Mybatis實踐(一)型別轉換器MyBatis型別
- 前端語音轉文字實踐總結前端
- Mpvue 小程式轉 Web 實踐總結VueWeb
- Spring MVC-概述(轉載實踐)SpringMVC
- 【轉】 RMAN備份與恢復實踐
- C++程式設計最佳實踐(轉)C++程式設計