程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> JAVA上加密算法的實現用例(2)

JAVA上加密算法的實現用例(2)

編輯:JAVA編程入門知識

  添加要簽名的信息
  
  public final byte[] sign()
  throws SignatureException
  返回簽名的數組,前提是initSign和update
  
  public final void initVerify(PublicKey publicKey)
  throws InvalidKeyException
  用指定的公鑰初始化
  參數:publicKey 驗證時用的公鑰
  
  public final boolean verify(byte[] signature)
  throws SignatureException
  驗證簽名是否有效,前提是已經initVerify初始化
  參數: signature 簽名數組
   */
  import Java.security.*;
  import java.security.spec.*;
  public class testdsa {
   public static void main(String[] args) throws java.security.NoSUChAlgorithmException,java.lang.Exception {
         testdsa my=new testdsa();
         my.run();
   }
   public void run()
   {
  
   //數字簽名生成密鑰
   //第一步生成密鑰對,假如已經生成過,本過程就可以跳過,對用戶來講myprikey.dat要保存在本地
   //而mypubkey.dat給發布給其它用戶
    if ((new java.io.File("myprikey.dat")).exists()==false) {
        if (generatekey()==false) {
            System.out.println("生成密鑰對敗");
            return;
           };
         }
  //第二步,此用戶
  //從文件中讀入私鑰,對一個字符串進行簽名後保存在一個文件(myinfo.dat)中
  //並且再把myinfo.dat發送出去
  //為了方便數字簽名也放進了myifno.dat文件中,當然也可分別發送
   try {
   java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("myprikey.dat"));
   PrivateKey myprikey=(PrivateKey)in.readObject();
   in.close();
  
  // java.security.spec.X509EncodedKeySpec pubX509=new java.security.spec.X509EncodedKeySpec(bX509);
  
  //java.security.spec.X509EncodedKeySpec pubkeyEncode=java.security.spec.X509EncodedKeySpec
   String myinfo="這是我的信息";    //要簽名的信息
   //用私鑰對信息生成數字簽名
   java.security.Signature signet=java.security.Signature.getInstance("DSA");
   signet.initSign(myprikey);
   signet.update(myinfo.getBytes());
   byte[] signed=signet.sign();  //對信息的數字簽名
   System.out.println("signed(簽名內容)="+byte2hex(signed));
  //把信息和數字簽名保存在一個文件中
   java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("myinfo.dat"));
   out.writeObject(myinfo);
   out.writeObject(signed);
   out.close();
   System.out.println("簽名並生成文件成功");
   }
   catch (java.lang.Exception e) {
     e.printStackTrace();
     System.out.println("簽名並生成文件失敗");
   };
  
   //第三步
   //其他人通過公共方式得到此戶的公鑰和文件
   //其他人用此戶的公鑰,對文件進行檢查,假如成功說明是此用戶發布的信息.
   //
   try {
  
    java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("mypubkey.dat"));
    PublicKey pubkey=(PublicKey)in.readObject();
    in.close();
    System.out.println(pubkey.getFormat());
  
    in=new java.io.ObjectInputStream(new java.io.FileInputStream("myinfo.dat"));
    String info=(String)in.readObject();
    byte[] signed=(byte[])in.readObject();
    in.close();
  
   java.security.Signature signetcheck=java.security.Signature.getInstance("DSA");
   signetcheck.initVerify(pubkey);
   signetcheck.update(info.getBytes());
   if (signetcheck.verify(signed)) {
   System.out.println("info="+info);
    System.out.println("簽名正常");
   }
   else  System.out.println("非簽名正常");
   }
   catch (java.lang.Exception e) {e.printStackTrace();};
  
  
   }
  
   //生成一對文件myprikey.dat和mypubkey.dat---私鑰和公鑰,
   //公鑰要用戶發送(文件,網絡等方法)給其它用戶,私鑰保存在本地
   public boolean generatekey()
   {
     try {
   java.security.KeyPairGenerator  keygen=java.security.KeyPairGenerator.getInstance("DSA");
  // SecureRandom secrand=new SecureRandom();
  // secrand.setSeed("tttt".getBytes()); //初始化隨機產生器
  // keygen.initialize(576,secrand);     //初始化密鑰生成器
   keygen.initialize(512);
   KeyPair keys=keygen.genKeyPair();
  //  KeyPair keys=keygen.generateKeyPair(); //生成密鑰組
   PublicKey pubkey=keys.getPublic();
   PrivateKey prikey=keys.getPrivate();
  
   java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("myprikey.dat"));
   out.writeObject(prikey);
   out.close();
   System.out.println("寫入對象 prikeys ok");
   out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("mypubkey.dat"));
    out.writeObject(pubkey);
    out.close();
    System.out.println("寫入對象 pubkeys ok");
    System.out.println("生成密鑰對成功");
    return true;
   }
   catch (java.lang.Exception e) {
    e.printStackTrace();
    System.out.println("生成密鑰對失敗");

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved