分享
 
 
 

如何在java中编程实现数字签名系统

王朝java/jsp·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

1。生成密钥对

生成密钥对可用java提供的类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 <keyname;

System.out.println("Option:");

System.out.println("<keyname: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.生成数字签名

从私钥文件读取数据文件并将其转换为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 <PrivateKey <dataFile <SignatureFile");

System.out.println("Option:");

System.out.println("<PrivateKey:The file name of the private Key.");

System.out.println("<DataFile: The filename that want to signature.");

System.out.println("<signatureFile: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 <PublicKey <dataFile <SignatureFile");

System.out.println("Option:");

System.out.println("<Public Key The filename of the public key.");

System.out.println("<DataFileThe filename that want to signature");

System.out.println("<SignatureFile: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){/////////////

}

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有