科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道如何在java中编程实现数字签名系统

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

  1。生成密钥对   生成密钥对可用java提供的类KeyPairGenerator,用其中的getInstance方法创建KeypairGenerator对象,在用initialize进行初始化,最后用generateKeyPair生成密钥对。

作者:中国IT实验室 来源:中国IT实验室 2007年9月25日

关键字: 编程 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){/////////////
  }
  }
  }

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件