| 
         
     
     | 
     | 
    
  
    | 
    在java中编程实现数字签名系统 | 
   
  
     | 
   
  
     | 
   
  
    | 
     作者:未知  来源:月光软件站  加入时间:2005-2-28 月光软件站  | 
   
  
    一个数字签名系统主要分为三个部分:  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){/////////////  }  }  } 
   
 
  | 
   
  
     | 
   
  
     相关文章:相关软件:  | 
   
   
      |