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("<datafile>the 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){/////////////
}
}
}
闽公网安备 35060202000074号