Java中的加密和DSA數位簽章

來源:互聯網
上載者:User
Java中的加密和DSA數位簽章

 Bromon

 一、單向加密(MD5和SHA-1)

 單向加密通常用於訊息摘要,具體演算法可以閱讀java.security.*的原始碼獲得。經過封裝之後可以使用簡單的靜態方法來實現,Look:

 package org.bromon;
 public class MD5Encoder
 {
 public static void main(String args[])
 {
  String info=args[0];
  try
  {
   //選擇MD5密碼編譯演算法
   java.security.MessageDigest alg=
 java.security.MessageDigest.getInstance("MD5");

   //選擇SHA-1密碼編譯演算法
   //java.security.MessageDigest alg=
 java.security.MessageDigest.getInstance("SHA-1");

   alg.update(info.getBytes());
   byte[] digesta=alg.digest();
   String result="";
   for(int i=0;i<digesta.length;i++)
   {
    int m=digesta[i];
    if(m<0)
    {
     m+=256;//如果是負數就模數
    }

    result=result+Integer.toString(m,16).toUpperCase()+"";//轉換為大寫字元
   }
   System.out.println(result);
  }catch(Exception e)
  {
   System.out.println(e);
  }
 }
 }
  

 編譯:javac –d . MD5Encoder.java
 運行:java org.bromon.MD5Encoder someData

 DES作為單鑰加密的代表,目前好象仍然處於五角大樓出口限制的列表中!?

 二、非對稱式加密DSA數位簽章

 通過使用金鑰組來實現。根據非對稱式加密的原理,分發公開金鑰並用其加密,私密金鑰保密,用於解密。而DSA的數位簽章則是利用私密金鑰加密,公開金鑰解密,用以保證不可否認性和完整性。以DSA數位簽章為例:

 首先需要產生一對密鑰:

 package org.bromon;
 import java.io.*;
 import java.security.*;

 public class DSAGenerateKeyPair
 {
 public static void main(String args[])
 {
  try
  {
   java.security.KeyPairGenerator keygen=
 java.security.KeyPairGenerator.getInstance("DSA");

   SecureRandom sr=new SecureRandom();
   sr.setSeed("123".getBytes());//金鑰種子
   keygen.initialize(512,sr);
   
   KeyPair keys=keygen.generateKeyPair();
   PublicKey pubkey=keys.getPublic();
   PrivateKey prikey=keys.getPrivate();

   //將產生的金鑰組序列化到檔案
   ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("prikey.dat"));
   out.writeObject(prikey);
   out.close();
   
   out=new ObjectOutputStream(new FileOutputStream("pubkey.dat"));
   out.writeObject(pubkey);
   out.close();
  }catch(Exception e)
  {
   System.out.println(e);
  }
  
 }
 }

 運行之後會在目前的目錄產生兩個.dat檔案。

 然後可以使用私密金鑰對資料簽名:

 package org.bromon;
 import java.io.*;
 import java.security.*;

 public class DSASigner
 {
 public static void main(String args[])
 {
  String s="需要加密的內容";
  try
  {
   //匯入私密金鑰
   ObjectInputStream in=new ObjectInputStream(new FileInputStream("prikey.dat"));
   PrivateKey prikey=(PrivateKey)in.readObject();
   in.close();
   
   //對資料簽名
   Signature signature=Signature.getInstance("DSA");
   signature.initSign(prikey);
   signature.update(s.getBytes());
   byte[] signed=signature.sign();
   
   //將簽名後的資料寫入檔案
   ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("info.dat"));
   out.writeObject(s);
   out.writeObject(signed);
   out.close();
  }catch(Exception e)
  {
   System.out.println(e);
  }
  
 }

 }

 運行之後在當前路徑產生一個加密後的檔案,將此檔案和公開金鑰一起分發給接收者。

 下面是使用公開金鑰驗證簽名是否正常:

 package org.bromon;
 import java.security.*;
 import java.io.*;

 public class DSAChecker
 {
 public static void main(String args[])
 {
  try
  {
   //匯入公開金鑰
   ObjectInputStream in=new ObjectInputStream(new FileInputStream("pubkey.dat"));
   PublicKey pubkey=(PublicKey)in.readObject();
   in.close();
   
   //匯入需要讀取的檔案
   in=new ObjectInputStream(new FileInputStream("info.dat"));
   String s=(String)in.readObject();
   byte[] signed=(byte[])in.readObject();
   in.close();
   
   //驗證金鑰組
   Signature signCheck=Signature.getInstance("DSA");
   signCheck.initVerify(pubkey);
   signCheck.update(s.getBytes());
   if(signCheck.verify(signed))
   {
    System.out.println(s);
   }else{
    System.out.println("無閱讀許可權");
   }
  }catch(Exception e)
  {
   System.out.println(e);
  }
  
 }

 }

 運行之後如果密鑰匹配無誤,會顯示加密的內容。如果公開金鑰格式被破壞,會拋出異常。

 Java有非常龐大的加密架構,各種加密和簽名種類極多,OReilly - Java Cryptography中有詳細介紹。不過一些包在中國無法得到。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.