网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  如何在java中编程实现数字签名系统     
  文章作者:未知  文章来源:水木森林  
  查看:82次  录入:管理员--2007-11-17  
 
  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){/////////////
  }
  }
  }
 
 
上一篇: 关于创建 java .exe 文件的几种方法    下一篇: 用java得到硬盘空间的三种不同方法
  相关文档
jscript 语法错误 11-16
java\.net\php比较 程序员眼中的.net世界 09-10
数据库相关:jdbc直连sql server 2005 02-26
使用技巧:java swing中的键盘事件处理 11-16
rmi调用模版 11-17
j2me mobile 3d入门教程系列文章之二 11-17
用ejb 3.0简化企业java开发(上) 11-16
xp 精华:何使 java 项目获得更大成功 11-17
服务器--tomcat的内存和连接数配置详解 11-16
java内存泄露问题分析 11-16
java 中文问题的解决 11-17
十步搞定Servlet中的mssql2000数据库连接池 08-06
java进阶 关于java socket编程的详细介绍 04-10
rmi远程方法调用讲解教程 11-17
java程序类的加载及其反射机制全面介绍 11-16
j2se 1.5 in a nutshell 中文版(1) 11-16
search 方法 11-16
构造jsp/javabean开发和发布环境的简单办法 11-17
java编程中异常处理的优劣观 11-17
技巧:在java的应用过程中获取系统属性 11-16
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息