服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

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


  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){/////////////
  }
  }
  }

扫描关注微信公众号