| |
技术文档>>JAVA>>新手入门>>基础入门>查看文档 |
|
| |
如何在java中编程实现数字签名系统 |
|
| |
文章作者:未知 文章来源:水木森林 |
|
| |
查看:82次 录入:管理员--2007-11-17 |
|
| |
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){///////////// } } }
|
|
|
|
相关文档
|