在java中程式設計實現數字簽名系統 (轉)
在java中程式設計實現數字簽名系統 (轉)[@more@]一個數字簽名主要分為三個部分:
1。生成金鑰對
2。在資料傳送端對資料進行簽名
3。在資料接收端對資料進行校驗資料簽名
下面從這三個方面分別說明:
1。生成金鑰對
生成金鑰對可用提供的類KeyPairGenerator,用其中的getInstance方法建立KeypairGenerator,在用initialize進行初始化,最後用generateKeyPair生成金鑰對,金鑰對生成後,就可以將其寫入中。透過或其他方式公告,使用者接收到資料檔案和簽名檔案後,就可以使用公約來校驗資料檔案的數字簽名,
;判斷資料在網路中的傳輸是否被修改。
////GenerateKeyPair.java/////////////
import java.io.*;
import java.security.*;
public class GenerateKeyPair{
public static void main(String[] args){
boolean bHelp=false;//sign for show help.
FileOutputStream fileOut;//輸出金鑰到檔案
byte[] pubkey;//已編碼的公鑰位元組
byte[] privKey;//儲存已編碼的私鑰位元組
if(args.length!=1){
System.out.println("Usage:GenerateKeyPair;
System.out.println("Option:");
System.out.println(":The key name that using to genera
te filename.");
System.exit(0);
}
try{
System.out.println("Generating a key pair.....");
KeyPairGenarator keyGen=KeyPairGenerator.getInstance("DSA");//使用DSA演算法
KeyGen.initialize(1024,new SecureRan());
KeyPair pair=keyGen.generateKeyPair();
PublicKey pub=pair.getPublic();
PrivateKey priv=pair.getPrivate();
pubkey=pub.getEncoded();
privateKey= priv.getEncoded();
fileOut=new FileOutputStream("PublicKey_"+args[0]);
fileOut.write(pubKey);
fileOut.close();
fileOut=new FileOutputStream("privateKey_"+args[0]):
fileOut.write(privateKey);
file.out.close();
System.out.println("OK!");
}catch(Exception e){
}
}
}
}
2.生成數字簽名
從私鑰檔案讀取資料檔案並將其轉換為PrivateKey物件,可以使用KeyFactory類和PKCS8EncodeKeySpec類。KeyFactory可以利用給定的蜜月規範來建立不透明的金鑰物件,也可以適當的格式取出蜜月物件中的金鑰資訊。 Signature是個引擎類,提供了諸如DSA或是RSA with MD5這樣的數字簽名演算法。密
碼學上的簽名演算法可接受任意大小的輸入和一個私月,併產生一個比較短的(常常是固定大小的)前名字揭穿。並且,簽名和公鑰部反映有關私鑰的任何內容。Signature物件即可用於資料簽名,也可用於校驗某個簽名是否為預製關聯的資料的真實簽名。
簽名或教研簽名的第一步是建立signature例項,為特定型別的簽名演算法或取signature物件的途徑是signature德getInstance靜態方法
初始化方法有兩個,取決於Signature的用途:
initSign(...)////用於簽名
initVerify(.....)//用於校驗
如果sigature初始化為簽名,則可將帶錢資料透過update方法提供給物件在呼叫sign來產生簽名即可。
下面以一個例項來說明。
///////////////////SignData.java////////////////
import java.io.*;
import java.security.*;
import java.security.spec.*;
public class SignData{
public static void main(String [] args)
{
FileOutputStream fileOut;
byte b;
if(args.length!=3)
{
System.out.println("Usage:SignData ");
System.out.println("Option:");
System.out.println(":The file name of the private Key.");
System.out.println(": The filename that want to signature.");
System.out.println(":the filename containing signture data.");
}
try{
System.out.println("Generating a digital signature....");
FileInputStream fileIn=new FileInputStream(args[0]);
byte[] encodedprivateKey=new byte[fileIn.available()];
finleIn.read(encodedprivateKey);
fileIn.close();
PKCS8EncodeKeySpec privKeySpec=
new PKCS8EncodeKeySpec(encodedprivateKey);
KeyFactory keyFactory=KeyFactory.getInstance("DSA");
PrivateKey privKey=keyFactory.generatePrivate(privateKeySpec);
Signature dsa=Signature.getInstance("SHA/DSA");
dsa.initSign(privKey);
FileInputStream fis=new FileInputStream(args[1]);
while(fis.available()!=0){
b=(byte)fis.read();
dsa.update(b);
}
fis.close();
byte[] sig=dsa.sign();
fileOut=new FileOutputStream(args[2]);
fileOut.write(sig);
fileOut.close();
System.out.println("OK");
}catch(Exception e){
/////////
}
}
}
///////////////////////End of SignData.java//////////////////
SignData.java從文津中讀取已編碼的私鑰位元組,利用PKCS8EncodeKeySpec物件將已編碼的四月位元組轉換為PrivateKey物件,然後利用Signature簽名資料檔案,生成簽名資料,並將簽名資料寫道檔案中。
//////VerifySign.java/////////////
import java.io.*;
import java.security.*;
import java.security.spec.*;
public class VerifySign{
public static void main(String [] args)
{
if(args.length!=3){
System.out.println("Usage:VerifySign ");
System.out.println("Option:");
System.out.println("The filename of the public key.");
System.out.println("The filename that want to signature");
System.out.println(":The file name containing signature data.");
System.exit(0);
}
try{
FileInputStream fileIn=new FileInputStream(args[0]);
byte[] encodedpubKey =new byte[fileIn.available()];
fileIn.read(encodedpubKey);
fileIn.close();
X509EncodedKeySpec pubKeySpec=
new X509EncodedKeySpec(encodedpubKey);
KeyFactory keyFactory=KeyFactory.getInstance("DSA");
PublicKey pubKey=keyFactory.generatePublic(pubKeySpec);
FileInputStream sigStream=new FileInputStream(args[2]);
byte[] signature=new byte[sigStream.available()];
sigStream.read(signature);
sigStream.close();
signature sigObj=Signature.getInstance("SHA1WithDSA");
sigObj.initVerify(pubKey);
fileIn=new FileInputStream(args[1]);
byte b;
while(fileIn.available())!=0)
{
b=(byte)fileIn.read();
sigObj.update(b);
};
fileIn.close();
boolean verifies=sigObj.verify(signature);
System.out.println("Signature verifies:"+verifies);
}catch(Exception e){/////////////
}
}
}
1。生成金鑰對
2。在資料傳送端對資料進行簽名
3。在資料接收端對資料進行校驗資料簽名
下面從這三個方面分別說明:
1。生成金鑰對
生成金鑰對可用提供的類KeyPairGenerator,用其中的getInstance方法建立KeypairGenerator,在用initialize進行初始化,最後用generateKeyPair生成金鑰對,金鑰對生成後,就可以將其寫入中。透過或其他方式公告,使用者接收到資料檔案和簽名檔案後,就可以使用公約來校驗資料檔案的數字簽名,
;判斷資料在網路中的傳輸是否被修改。
////GenerateKeyPair.java/////////////
import java.io.*;
import java.security.*;
public class GenerateKeyPair{
public static void main(String[] args){
boolean bHelp=false;//sign for show help.
FileOutputStream fileOut;//輸出金鑰到檔案
byte[] pubkey;//已編碼的公鑰位元組
byte[] privKey;//儲存已編碼的私鑰位元組
if(args.length!=1){
System.out.println("Usage:GenerateKeyPair
System.out.println("Option:");
System.out.println("
te filename.");
System.exit(0);
}
try{
System.out.println("Generating a key pair.....");
KeyPairGenarator keyGen=KeyPairGenerator.getInstance("DSA");//使用DSA演算法
KeyGen.initialize(1024,new SecureRan());
KeyPair pair=keyGen.generateKeyPair();
PublicKey pub=pair.getPublic();
PrivateKey priv=pair.getPrivate();
pubkey=pub.getEncoded();
privateKey= priv.getEncoded();
fileOut=new FileOutputStream("PublicKey_"+args[0]);
fileOut.write(pubKey);
fileOut.close();
fileOut=new FileOutputStream("privateKey_"+args[0]):
fileOut.write(privateKey);
file.out.close();
System.out.println("OK!");
}catch(Exception e){
}
}
}
}
2.生成數字簽名
從私鑰檔案讀取資料檔案並將其轉換為PrivateKey物件,可以使用KeyFactory類和PKCS8EncodeKeySpec類。KeyFactory可以利用給定的蜜月規範來建立不透明的金鑰物件,也可以適當的格式取出蜜月物件中的金鑰資訊。 Signature是個引擎類,提供了諸如DSA或是RSA with MD5這樣的數字簽名演算法。密
碼學上的簽名演算法可接受任意大小的輸入和一個私月,併產生一個比較短的(常常是固定大小的)前名字揭穿。並且,簽名和公鑰部反映有關私鑰的任何內容。Signature物件即可用於資料簽名,也可用於校驗某個簽名是否為預製關聯的資料的真實簽名。
簽名或教研簽名的第一步是建立signature例項,為特定型別的簽名演算法或取signature物件的途徑是signature德getInstance靜態方法
初始化方法有兩個,取決於Signature的用途:
initSign(...)////用於簽名
initVerify(.....)//用於校驗
如果sigature初始化為簽名,則可將帶錢資料透過update方法提供給物件在呼叫sign來產生簽名即可。
下面以一個例項來說明。
///////////////////SignData.java////////////////
import java.io.*;
import java.security.*;
import java.security.spec.*;
public class SignData{
public static void main(String [] args)
{
FileOutputStream fileOut;
byte b;
if(args.length!=3)
{
System.out.println("Usage:SignData
System.out.println("Option:");
System.out.println("
System.out.println("
System.out.println("
}
try{
System.out.println("Generating a digital signature....");
FileInputStream fileIn=new FileInputStream(args[0]);
byte[] encodedprivateKey=new byte[fileIn.available()];
finleIn.read(encodedprivateKey);
fileIn.close();
PKCS8EncodeKeySpec privKeySpec=
new PKCS8EncodeKeySpec(encodedprivateKey);
KeyFactory keyFactory=KeyFactory.getInstance("DSA");
PrivateKey privKey=keyFactory.generatePrivate(privateKeySpec);
Signature dsa=Signature.getInstance("SHA/DSA");
dsa.initSign(privKey);
FileInputStream fis=new FileInputStream(args[1]);
while(fis.available()!=0){
b=(byte)fis.read();
dsa.update(b);
}
fis.close();
byte[] sig=dsa.sign();
fileOut=new FileOutputStream(args[2]);
fileOut.write(sig);
fileOut.close();
System.out.println("OK");
}catch(Exception e){
/////////
}
}
}
///////////////////////End of SignData.java//////////////////
SignData.java從文津中讀取已編碼的私鑰位元組,利用PKCS8EncodeKeySpec物件將已編碼的四月位元組轉換為PrivateKey物件,然後利用Signature簽名資料檔案,生成簽名資料,並將簽名資料寫道檔案中。
//////VerifySign.java/////////////
import java.io.*;
import java.security.*;
import java.security.spec.*;
public class VerifySign{
public static void main(String [] args)
{
if(args.length!=3){
System.out.println("Usage:VerifySign
System.out.println("Option:");
System.out.println("
System.out.println("
System.out.println("
System.exit(0);
}
try{
FileInputStream fileIn=new FileInputStream(args[0]);
byte[] encodedpubKey =new byte[fileIn.available()];
fileIn.read(encodedpubKey);
fileIn.close();
X509EncodedKeySpec pubKeySpec=
new X509EncodedKeySpec(encodedpubKey);
KeyFactory keyFactory=KeyFactory.getInstance("DSA");
PublicKey pubKey=keyFactory.generatePublic(pubKeySpec);
FileInputStream sigStream=new FileInputStream(args[2]);
byte[] signature=new byte[sigStream.available()];
sigStream.read(signature);
sigStream.close();
signature sigObj=Signature.getInstance("SHA1WithDSA");
sigObj.initVerify(pubKey);
fileIn=new FileInputStream(args[1]);
byte b;
while(fileIn.available())!=0)
{
b=(byte)fileIn.read();
sigObj.update(b);
};
fileIn.close();
boolean verifies=sigObj.verify(signature);
System.out.println("Signature verifies:"+verifies);
}catch(Exception e){/////////////
}
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-958268/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 數字簽名(java) (轉)Java
- java使用RSA加密方式,實現數字簽名Java加密
- RSA加密解密及數字簽名Java實現加密解密Java
- 在Java中實現浮點數的精確計算 (轉)Java
- 實現WEB中的@虛擬域名系統(原理篇) (轉)Web
- Vector在Java程式設計中的應用 (轉)Java程式設計
- ios超級簽名系統使用配置教程iOS
- 【Java併發程式設計】Synchronized關鍵字實現原理Java程式設計synchronized
- 取消WindowsXP下驅動程式數字簽名(轉)Windows
- 在WIN95中實現檔案複製的程式設計方法 (轉)程式設計
- Java套接字程式設計Java程式設計
- Word文件字數實時動態統計(轉)
- 在Java中實現回撥過程 (轉)Java
- 在Java中實現遠端方法呼叫(轉)Java
- JavaScript 函數語言程式設計中的 curry 實現JavaScript函數程式設計
- JavaScript 函數語言程式設計中 compose 實現JavaScript函數程式設計
- iOS超級簽名系統演示(免費體驗)iOS
- 在VB6.0中實現動態統計報表 (轉)
- 在Delphi程式設計中獲取作業系統資訊 (轉)程式設計作業系統
- 傳統企業如何實現數字化轉型?
- 統計陣列中各數字(元素)出現的次數陣列
- Java 新增、驗證PDF 數字簽名Java
- JAVA實現網路程式設計之併發程式設計Java程式設計
- 在java中實現對FORM的列印功能 (轉)JavaORM
- 怎樣在遊戲設計製作中實現指令碼控制(轉)遊戲設計指令碼
- 淺談Java中利用JCOM實現仿Excel程式設計JavaExcel程式設計
- 數字簽名
- 在spring boot中訊息推送系統設計與實現Spring Boot
- 在VC中實現程式在啟動時隱藏 (轉)
- 應用WSDK - 實踐Web Services的數字簽名(上) (轉)Web
- 面試:Java 實現查詢旋轉陣列的最小數字面試Java陣列
- 說說在 Spring 中,如何程式設計實現事務管理Spring程式設計
- 使用Java在PowerPoint中新增、驗證或刪除數字簽名Java
- 在應用程式中實現RAS撥號 (轉)
- 在 Oracle JDeveloper 中進行 Ajax 程式設計(轉)OracleDeveloper程式設計
- TRIZ理論在數字化轉型中的應用體現
- 精確統計程式碼量(Java實現)Java
- 在Linux作業系統中實現內部程式通訊(轉)Linux作業系統