MessageDigest對密碼進行加密(二)

第2章在JAVA中的實現

 

2.1. 相關

Diffie-Hellman密鑰一致協議和DES程序需要JCE工具庫的支持,可以到 http://java.sun.com/security/index.html 下載JCE,並進行安裝。簡易安裝把 jce1.2.1\lib 下的所有內容複製到 %java_home%\lib\ext下,如果沒有ext目錄自行建立,再把jce1_2_1.jar和sunjce_provider.jar添加到CLASSPATH內,更詳細說明請看相應用戶手冊

2.2. 消息摘要MD5和SHA的使用

使用方法:

首先用生成一個MessageDigest類,確定計算方法

java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1");

添加要進行計算摘要的信息

alga.update(myinfo.getBytes());

計算出摘要

byte[] digesta=alga.digest();

發送給其他人你的信息和摘要

其他人用相同的方法初始化,添加信息,最後進行比較摘要是否相同

algb.isEqual(digesta,algb.digest())

相關AIP

java.security.MessageDigest 類

static getInstance(String algorithm)

返回一個MessageDigest對象,它實現指定的算法

參數:算法名,如 SHA-1 或MD5

void update (byte input)

void update (byte[] input)

void update(byte[] input, int offset, int len)

添加要進行計算摘要的信息

byte[] digest()

完成計算,返回計算得到的摘要(對於MD5是16位,SHA是20位)

void reset()

復位

static boolean isEqual(byte[] digesta, byte[] digestb)

比效兩個摘要是否相同

代碼:

import java.security.*;
public class myDigest {
  public static void main(String[] args)  {
    myDigest my=new myDigest();
    my.testDigest();
  }
  public void testDigest()
  {
   try {
     String myinfo="我的測試信息";
    //java.security.MessageDigest alg=java.security.MessageDigest.getInstance("MD5");
      java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1");
      alga.update(myinfo.getBytes());
      byte[] digesta=alga.digest();
      System.out.println("本信息摘要是:"+byte2hex(digesta));
      //通過某中方式傳給其他人你的信息(myinfo)和摘要(digesta) 對方可以判斷是否更改或傳輸正常
      java.security.MessageDigest algb=java.security.MessageDigest.getInstance("SHA-1");
      algb.update(myinfo.getBytes());
      if (algb.isEqual(digesta,algb.digest())) {
         System.out.println("信息檢查正常");
       }
       else
        {
          System.out.println("摘要不相同");
         }
   }
   catch (java.security.NoSuchAlgorithmException ex) {
     System.out.println("非法摘要算法");
   }
  }
  public String byte2hex(byte[] b) //二行制轉字符串
    {
     String hs="";
     String stmp="";
     for (int n=0;n<b.length;n++)
      {
       stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));
       if (stmp.length()==1) hs=hs+"0"+stmp;
       else hs=hs+stmp;
       if (n<b.length-1)  hs=hs+":";
      }
     return hs.toUpperCase();
    }
}

 

2.3. 數字簽名DSA

  1. 對於一個用戶來講首先要生成他的密鑰對,並且分別保存

    生成一個KeyPairGenerator實例

   

java.security.KeyPairGenerator  keygen=java.security.KeyPairGenerator.getInstance("DSA");
    如果設定隨機產生器就用如相代碼初始化
     SecureRandom secrand=new SecureRandom();
     secrand.setSeed("tttt".getBytes()); //初始化隨機產生器
     keygen.initialize(512,secrand);     //初始化密鑰生成器
    否則
     keygen.initialize(512);
    生成密鑰公鑰pubkey和私鑰prikey
      KeyPair keys=keygen.generateKeyPair(); //生成密鑰組
      PublicKey pubkey=keys.getPublic();
      PrivateKey prikey=keys.getPrivate();
    分別保存在myprikey.dat和mypubkey.dat中,以便下次不在生成
    (生成密鑰對的時間比較長
     java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("myprikey.dat"));
     out.writeObject(prikey);
     out.close();
     out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("mypubkey.dat"));
     out.writeObject(pubkey);
     out.close();

用他私人密鑰(prikey)對他所確認的信息(info)進行數字簽名產生一個簽名數組

從文件中讀入私人密鑰(prikey)

java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("myprikey.dat"));
    PrivateKey myprikey=(PrivateKey)in.readObject();
    in.close();
    初始一個Signature對象,並用私鑰對信息簽名
     java.security.Signature signet=java.security.Signature.getInstance("DSA");
     signet.initSign(myprikey);
     signet.update(myinfo.getBytes());
     byte[] signed=signet.sign();
    把信息和簽名保存在一個文件中(myinfo.dat)
      java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("myinfo.dat"));
      out.writeObject(myinfo);
      out.writeObject(signed);
      out.close();
    把他的公鑰的信息及簽名發給其它用戶

 先把地址粘出來晚些再全粘出來吧:http://www.ibm.com/developerworks/cn/java/l-security/index.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章