Java中對稱密鑰、非對稱密鑰和數字簽名的用法

1、非對稱密鑰:

 

package com.mysec;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import static com.mysec.myutil.Util.println;
public class MDTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		try {
			byte[] pw1 = new String("dkfdsfsdflasdfasdfasdf").getBytes();
			byte[] pw2 = new String("dkfdsfsdflasdfasdfasdf").getBytes();
			//MD2/MD5/SHA1
			//非對稱密鑰
			MessageDigest md = MessageDigest.getInstance("MD5");
			System.out.println("服務提供者:"+md.getProvider());
			byte[] b1 = new String("這是散列字節").getBytes();
			
			md.update(b1);
			byte[] r1 = md.digest(pw1);
			
			md.update(b1);
			byte[] r2 = md.digest(pw2);
			
			println("pw1加密後:"+new String(r1));
			println("pw2加密後:"+new String(r2));
			//轉換爲16進制方便讀取放入數據庫
			println(convertHex(r1));
			println(convertHex(r2));
			println(md.isEqual(r1, r2));
			
			//println(md.getAlgorithm());
			//println(md.getDigestLength());
			
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static String convertHex(byte[] b){
		StringBuffer sb = new StringBuffer();
		for(byte tmp:b){
			sb.append(Integer.toHexString(tmp&0XFF));
		}
		return sb.toString();
	}

}

 

 2、對稱密鑰算法

 

package com.mysec;
import static com.mysec.myutil.Util.println;

import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
public class CipherTest {

	/**
	 * @param args
	 * @throws NoSuchPaddingException 
	 * @throws NoSuchAlgorithmException 
	 */
	public static byte[] encoder(Key key,String text){
		return null;
	}
	public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
		// TODO Auto-generated method stub
		//對稱算法名  
		String info = "this is a my info!";
		KeyGenerator generator = KeyGenerator.getInstance("DES");
		//初始化長度,DES只能是56
		generator.init(56);
		//生成密鑰
		Key key = generator.generateKey();
		byte[] keyEncode = key.getEncoded();
		println("密鑰是:"+toHexString(keyEncode));
		
		Cipher cipher  = Cipher.getInstance("DES/ECB/PKCS5Padding");
		println(cipher.getProvider().getName());
		
		println("原文:"+info);
		//用cipher進行加密
		cipher.init(Cipher.ENCRYPT_MODE,key);
		byte[] encoderResult = cipher.doFinal(info.getBytes());
		println("密文:"+toHexString(encoderResult));
		
		//用cipher進行解密
		cipher.init(Cipher.DECRYPT_MODE, key);
		byte[] decryptResult = cipher.doFinal(encoderResult);
		println("解密後:"+new String(decryptResult));
	}
	
	public static String toHexString(byte[] b){
		StringBuffer sb = new StringBuffer();
		for(int i=0;i<b.length;i++){
			sb.append(Integer.toHexString(b[i]&0XFF));
		}
		return sb.toString();
	}

}

 

 3、數字簽名

package com.mysec;

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import static com.mysec.myutil.Util.println;
public class SignTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		String info = "this is my info!";
		
		//獲得密鑰對
		KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
		//初始化長度
		generator.initialize(1024);
		//生成密鑰對
		KeyPair keyPair = generator.generateKeyPair();
		//獲得私鑰
		PrivateKey privateKey = keyPair.getPrivate();
		println("私鑰是:"+toHexString(privateKey.getEncoded()));
		//獲得公鑰
		PublicKey publicKey = keyPair.getPublic();
		println("公鑰是:"+toHexString(publicKey.getEncoded()));
		
		
		Signature sign = Signature.getInstance("MD5WithRSA");
		//對私鑰進行簽名
		sign.initSign(privateKey);
		sign.update(info.getBytes());
		//獲得簽名值
		byte[] signature = sign.sign();
		println("簽名值是:"+toHexString(signature));
		
		//用公鑰初始化簽名對象
		sign.initVerify(publicKey);
		//這裏應該是解密後的信息,這裏直接用原來的
		sign.update(info.getBytes());
		
		//簽證簽名
		if(sign.verify(signature)){
			System.out.println("驗證簽名成功!");
		}else{
			System.out.println("驗證簽名失敗!");
			
		}
	}
	
	public static String toHexString(byte[] b){
		StringBuffer sb = new StringBuffer();
		for(int i=0;i<b.length;i++){
			sb.append(Integer.toHexString(b[i]&0XFF));
		}
		return sb.toString();
	}

}
 

 

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