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){///////////// 
  } 
  } 
  } 
查看本文来源