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

来源:互联网 发布:2016年网络热点事件 编辑:程序博客网 时间:2024/06/05 11:36
一个数字签名系统主要分为三个部分: 1。生成密钥对 2。在数据发送端对数据进行签名 3。在数据接收端对数据进行校验数据签名 下面从这三个方面分别说明: 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){///////////// } } } http://www.ibm.com/developerworks/cn/xml/x-cn-java6xmlsignature/