| 
     一个数字签名系统主要分为三个部分:     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){/////////////     }     }     }  
 
  |