java中怎么實(shí)現(xiàn)數(shù)字簽名系統(tǒng)-創(chuàng)新互聯(lián)

本篇文章為大家展示了java中怎么實(shí)現(xiàn)數(shù)字簽名系統(tǒng) ,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)成立于2013年,先為孟連等服務(wù)建站,孟連等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為孟連企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。


1。生成密鑰對(duì)
生成密鑰對(duì)可用Java提供的類KeyPairGenerator,用其中的getInstance方法創(chuàng)建KeypairGenerator對(duì)象,在用initialize進(jìn)行初始化,最后用generateKeyPair生成密鑰對(duì),密鑰對(duì)生成后,就可以將其寫入文件中。通過(guò)網(wǎng)絡(luò)或其他方式公告用戶,用戶接收到數(shù)據(jù)文件和簽名文件后,就可以使用公約來(lái)校驗(yàn)數(shù)據(jù)文件的數(shù)字簽名,

;判斷數(shù)據(jù)在網(wǎng)絡(luò)中的傳輸是否被非法修改。
////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;//存儲(chǔ)已編碼的公鑰字節(jié)
byte[] privKey;//存儲(chǔ)已編碼的私鑰字節(jié)
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 SecureRandom());
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.生成數(shù)字簽名
從私鑰文件讀取數(shù)據(jù)文件并將其轉(zhuǎn)換為PrivateKey對(duì)象,可以使用KeyFactory類和PKCS8EncodeKeySpec類。KeyFactory可以利用給定的蜜月規(guī)范來(lái)建立不透明的密鑰對(duì)象,也可以適當(dāng)?shù)母袷饺〕雒墼聦?duì)象中的密鑰信息。 Signature是個(gè)引擎類,提供了諸如DSA或是RSA with MD5這樣的數(shù)字簽名算法。密
碼學(xué)上安全的簽名算法可接受任意大小的輸入和一個(gè)私月,并產(chǎn)生一個(gè)比較短的(常常是固定大小的)前名字揭穿。并且,簽名和公鑰部反映有關(guān)私鑰的任何內(nèi)容。Signature對(duì)象即可用于數(shù)據(jù)簽名,也可用于校驗(yàn)?zāi)硞€(gè)簽名是否為預(yù)制關(guān)聯(lián)的數(shù)據(jù)的真實(shí)簽名。

簽名或教研簽名的第一步是創(chuàng)建signature實(shí)例,為特定類型的簽名算法或取signature對(duì)象的途徑是調(diào)用signature德getInstance靜態(tài)方法
初始化方法有兩個(gè),取決于Signature的用途:
initSign(...)////用于簽名
initVerify(.....)//用于校驗(yàn)
如果sigature初始化為簽名,則可將帶錢數(shù)據(jù)通過(guò)update方法提供給對(duì)象在調(diào)用sign來(lái)產(chǎn)生簽名即可。
下面以一個(gè)實(shí)例來(lái)說(shuō)明。
///////////////////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從文津中讀取已編碼的私鑰字節(jié),利用PKCS8EncodeKeySpec對(duì)象將已編碼的四月字節(jié)轉(zhuǎn)換為PrivateKey對(duì)象,然后利用Signature簽名數(shù)據(jù)文件,生成簽名數(shù)據(jù),并將簽名數(shù)據(jù)寫道文件中。

//////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){/////////////
}
}
}

上述內(nèi)容就是java中怎么實(shí)現(xiàn)數(shù)字簽名系統(tǒng) ,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道。

當(dāng)前題目:java中怎么實(shí)現(xiàn)數(shù)字簽名系統(tǒng)-創(chuàng)新互聯(lián)
本文鏈接:http://bm7419.com/article34/cdispe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、網(wǎng)站制作、網(wǎng)站導(dǎo)航、面包屑導(dǎo)航虛擬主機(jī)、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司