1. 程式人生 > >(1)java自帶軟體包javax.crypto的使用方法,對稱加密方法和非對稱加密方法

(1)java自帶軟體包javax.crypto的使用方法,對稱加密方法和非對稱加密方法


一般來講,在java上實現加密解密演算法,有3種方式。

1)自行實現演算法

2)使用java自帶的crypto軟體包

3)使用第三方庫

本文講述一下第二種使用方法。我最開始也是找了很多這方面的資料,但是總感覺還是缺乏一些細節。現將我的一些心得與大家分享。

本文給出的例子基於下面的blog中所給出的例子。

blog.csdn.net/wildandfly/article/details/21521857

首先,現代密碼學演算法大致可以分為3個大塊。分別是對稱加密symmetric,非對稱加密asymmetric,訊息摘要hash。

本文實現了下列的幾種演算法,其中每個package中的演算法都非常類似。

不羅嗦,直接上程式碼

http://download.csdn.net/detail/watch_ch/9465641

1對稱加密

以AES為例。注意其中keygenerator函式,其中keygenerator.getInstance()函式需要輸入對應的密碼方法,從而生成對應長度的key。

這裡,我查了下doc。可以傳入的引數如下圖。


package java_crypto_symmetric;

import java.security.InvalidKeyException;  
import java.security.NoSuchAlgorithmException;  
//import java.security.Security;  
  
import javax.crypto.BadPaddingException;  
import javax.crypto.Cipher;  
import javax.crypto.IllegalBlockSizeException;  
import javax.crypto.KeyGenerator;  
import javax.crypto.NoSuchPaddingException;  
import javax.crypto.SecretKey;  
  
public class AESdemo {  
      
    //KeyGenerator 提供對稱金鑰生成器的功能,支援各種演算法  
    private KeyGenerator keygen;  
    //SecretKey 負責儲存對稱金鑰  
    private SecretKey deskey;  
    //Cipher負責完成加密或解密工作  
    private Cipher c;  
    //該位元組陣列負責儲存加密的結果  
    private byte[] cipherByte;  
      
    public AESdemo() throws NoSuchAlgorithmException, NoSuchPaddingException{  
//        Security.addProvider(new com.sun.crypto.provider.SunJCE());  
        //例項化支援DES演算法的金鑰生成器(演算法名稱命名需按規定,否則丟擲異常)  
        keygen = KeyGenerator.getInstance("AES");  
        //生成金鑰  
        deskey = keygen.generateKey();  
        //生成Cipher物件,指定其支援的DES演算法  
        c = Cipher.getInstance("AES");  
    }  
      
    /** 
     * 對字串加密 
     *  
     * @param str 
     * @return 
     * @throws InvalidKeyException 
     * @throws IllegalBlockSizeException 
     * @throws BadPaddingException 
     */  
    public byte[] Encrytor(String str) throws InvalidKeyException,  
            IllegalBlockSizeException, BadPaddingException {  
        // 根據金鑰,對Cipher物件進行初始化,ENCRYPT_MODE表示加密模式  
        c.init(Cipher.ENCRYPT_MODE, deskey);  
        byte[] src = str.getBytes();  
        // 加密,結果儲存進cipherByte  
        cipherByte = c.doFinal(src);  
        return cipherByte;  
    }  
  
    /** 
     * 對字串解密 
     *  
     * @param buff 
     * @return 
     * @throws InvalidKeyException 
     * @throws IllegalBlockSizeException 
     * @throws BadPaddingException 
     */  
    public byte[] Decryptor(byte[] buff) throws InvalidKeyException,  
            IllegalBlockSizeException, BadPaddingException {  
        // 根據金鑰,對Cipher物件進行初始化,DECRYPT_MODE表示加密模式  
        c.init(Cipher.DECRYPT_MODE, deskey);  
        cipherByte = c.doFinal(buff);  
        return cipherByte;  
    }  
  
    /** 
     * @param args 
     * @throws NoSuchPaddingException  
     * @throws NoSuchAlgorithmException  
     * @throws BadPaddingException  
     * @throws IllegalBlockSizeException  
     * @throws InvalidKeyException  
     */  
    public static void main(String[] args) throws Exception {  
    	AESdemo de1 = new AESdemo();  
        String msg ="www.suning.com/index.jsp";  
        byte[] encontent = de1.Encrytor(msg);  
        byte[] decontent = de1.Decryptor(encontent);  
        System.out.println("明文是:" + msg);  
        System.out.println("加密後:" + new String(encontent));  
        System.out.println("解密後:" + new String(decontent));  
    }  
  
}  


2非對稱加密

以rsa為例,由於公鑰加密體系需要2個key值,故產生key值的函式也發生了改變。

keypairgenerator.getInstance()函式同樣需要傳入加密的方法,產生對應的key值。

這裡,我也查了下doc,如下。


package java_crypto_asymmetric;

import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;

public class RSAdemo {

	/**
	 * 加密
	 * 
	 * @param publicKey
	 * @param srcBytes
	 * @return
	 * @throws NoSuchAlgorithmException
	 * @throws NoSuchPaddingException
	 * @throws InvalidKeyException
	 * @throws IllegalBlockSizeException
	 * @throws BadPaddingException
	 */
	protected byte[] encrypt(RSAPublicKey publicKey, byte[] srcBytes) throws NoSuchAlgorithmException,
			NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
		if (publicKey != null) {
			// Cipher負責完成加密或解密工作,基於RSA
			Cipher cipher = Cipher.getInstance("RSA");
			// 根據公鑰,對Cipher物件進行初始化
			cipher.init(Cipher.ENCRYPT_MODE, publicKey);
			byte[] resultBytes = cipher.doFinal(srcBytes);
			return resultBytes;
		}
		return null;
	}

	/**
	 * 解密
	 * 
	 * @param privateKey
	 * @param srcBytes
	 * @return
	 * @throws NoSuchAlgorithmException
	 * @throws NoSuchPaddingException
	 * @throws InvalidKeyException
	 * @throws IllegalBlockSizeException
	 * @throws BadPaddingException
	 */
	protected byte[] decrypt(RSAPrivateKey privateKey, byte[] srcBytes) throws NoSuchAlgorithmException,
			NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
		if (privateKey != null) {
			// Cipher負責完成加密或解密工作,基於RSA
			Cipher cipher = Cipher.getInstance("RSA");
			// 根據公鑰,對Cipher物件進行初始化
			cipher.init(Cipher.DECRYPT_MODE, privateKey);
			byte[] resultBytes = cipher.doFinal(srcBytes);
			return resultBytes;
		}
		return null;
	}

	/**
	 * @param args
	 * @throws NoSuchAlgorithmException
	 * @throws BadPaddingException
	 * @throws IllegalBlockSizeException
	 * @throws NoSuchPaddingException
	 * @throws InvalidKeyException
	 */
	public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException,
			IllegalBlockSizeException, BadPaddingException {
		RSAdemo rsa = new RSAdemo();
		String msg = "www.suning.com/index.jsp";
		// KeyPairGenerator類用於生成公鑰和私鑰對,基於RSA演算法生成物件
		KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
		// 初始化金鑰對生成器,金鑰大小為1024位
		keyPairGen.initialize(1024);
		// 生成一個金鑰對,儲存在keyPair中
		KeyPair keyPair = keyPairGen.generateKeyPair();
		// 得到私鑰
		RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
		// 得到公鑰
		RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();

		// 用公鑰加密
		byte[] srcBytes = msg.getBytes();
		byte[] resultBytes = rsa.encrypt(publicKey, srcBytes);

		// 用私鑰解密
		byte[] decBytes = rsa.decrypt(privateKey, resultBytes);

		System.out.println("明文是:" + msg);
		System.out.println("加密後是:" + new String(resultBytes));
		System.out.println("解密後是:" + new String(decBytes));
	}

}

3hash函式

這個由於我沒有用到,暫時就不寫了,以後再補上。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

注意:

在1、2中除了keygenerator需要傳遞密碼的方法,cipher在初始化時也需要指定其引數。如下所示。


相關推薦

1java軟體javax.crypto的使用方法對稱加密方法對稱加密方法

一般來講,在java上實現加密解密演算法,有3種方式。 1)自行實現演算法 2)使用java自帶的crypto軟體包 3)使用第三方庫 本文講述一下第二種使用方法。我最開始也是找了很多這方面的資料,但是總感覺還是缺乏一些細節。現將我的一些心得與大家分享。 本文給出的例子

卡爾曼濾波器的兩種python實現方法1opencv的cv2.KalmanFilter 2pykalman演算法庫

預備知識: 卡爾曼濾波的理論知識: 具體的理論知識可參考以下博文,非常感謝相關博主的貢獻: 以一個滑鼠追蹤的任務分析兩種卡爾曼濾波的實現方式: (一)opencv自帶的cv2.KalmanFilter 該卡爾曼濾波器演算法分為兩個階段: 預測

利用WPF建立自己的3d gis軟體axhost方式SDK部分面板的呼叫

先下載SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bPew 密碼:1te1 地圖資料包(sqlserver2008R2版本,也可以不下載):  https://pan.baidu.com/s/1PjcNamad7OVpCrsV

【代碼筆記】Java文件的輸入輸出1——Java.io的初步理解

對象 eclips 是什麽 reader optional 傳輸 gre 用戶界面 cep Java裏面文件的輸入輸出全部在java.io包裏面。 Java.io包裏面所有的類都需要掌握。 java.io包裏面所有的東西都在上面了。 包裏面的相關類

老司機你玩轉面試1:快取中介軟體 Redis 基礎知識以及資料持久化

![](https://cdn.geekdigging.com/Interview/mianshi_header_1.jpg) ## 引言 今天週末,我在家坐著掐指一算,馬上又要到一年一度的金九銀十招聘季了,國內今年上半年受到 YQ 衝擊,金三銀四泡湯了,這就直接導致很多今年畢業的同學會和明年畢業的同學一

1Java多線程編程核心——Java多線程技能

urn 優先 語句 成才 都是 ora border cell this 1、為什麽要使用多線程?多線程的優點? 提高CPU的利用率 2、什麽是多線程? 3、Java實現多線程編程的兩種方式? a、繼承Thread類 pub

Linux鞏固記錄1 java項目的編譯執行

mce frame cati readfile 知識 4.3 sse apach ast 由於要近期使用hadoop等進行相關任務執行,操作linux時候就多了 以前只在linux上配置J2EE項目執行環境,無非配置下jdk,部署tomcat,再通過docker或者jenk

算法1——Java冒泡算法

info 算法 一個 stat bubble 比較 接下來 mage body Java冒泡算法算是最常見的算法之一了。那麽什麽是冒泡算法呢?如下圖所示(圖片來自網絡): 其實可以看到,第一遍的遍歷過程中,首先比較第一對數字,比較交換完成後第二個數字一定是比較大的,接下來比

1 安卓匯入mqtt基本通訊

參考資料:http://blog.csdn.net/qq_17250009/article/details/52774472 MQTT官網:http://mqtt.org/ MQTT介紹:http://www.ibm.com MQTT Android github:https://github.com/

Java】「深入理解Java虛擬機器」學習筆記1 - Java語言發展趨勢

這本書寫的比較早,現在這些功能都已經不同程度的實現了。 1、模組化     JDK9之前的版本都是一個整體,使用者可能只需要使用一個小功能,但他不得不下載整個JDK。不能滿足定製化需求,顯然Java語言的發展因此大大受限。   所以,Sun公司在OpenJDK建立了一個Jigsaw(拼圖)的專案來推動模

jvm學習筆記1——java虛擬機器記憶體區域

一、java記憶體區域:      1、程式計數器(執行緒私有):     記憶體中較小的記憶體空間,可以當做當前執行緒所執行位元組碼的行號指示器。如分支、迴圈、跳轉、異常處理、執行緒恢復都需要依賴這個計數器完成。 2、java虛擬機

自動記憶體管理機制1- java記憶體區域與虛擬機器物件

自動記憶體管理機制(1)- java記憶體區域與虛擬機器物件 1. 執行時資料區域 Java虛擬機器在執行Java程式的過程中會把它所管理的記憶體劃分為若干個不同的資料區域。有的區域隨著虛擬機器進行的啟動而存在,有些區域則以來使用者執行緒的啟動和結束而建立和銷燬。 有以下幾個區域

jdk原始碼分析1java.lang.Object

java.lang.Object原始碼分析 public final native Class<?> getClass() public native int hashCode(); public boolean e

AKKA官方文件閱讀筆記1JAVA版2.5.16

準備工作: Actor層級結構 其實在你用程式碼建立Actor之前,Akka自己就已經建立三個actor了,它們都是負責監管自己下面的actor的: / 這個就是傳說中的跟監管者,是所有actor的祖先,當系統終止時,它一定是最後一個被停止的 /user

訊息中介軟體學習總結1——RocketMQ之專訪RocketMQ聯合創始人:專案思路、技術細節未來規劃

編者按 這些年開源氛圍越來越好,各大IT公司都紛紛將一些自研程式碼開源出來。2012年,阿里巴巴開源其自研的第三代分散式訊息中介軟體——RocketMQ。經過幾年的技術打磨,阿里稱基於RocketMQ技術,目前雙十一當天訊息容量可達到萬億級。 2016年11月,阿里將Ro

android面試1-Java基礎

最近需要面臨找工作的壓力,所以在寒假的時候惡補了一下關於android方面的知識,這是一個系列的部落格,希望自己可以堅持更新下去。今天找了一些Java基礎的面試題,我在裡面挑選了一些我還有些模糊的題,在此處記錄一下:1.面向物件的特徵:(1)抽象:將一類物件的共同特徵總結出來

QT1Java型別迭代器實現QList只讀遍歷

java風格迭代器: 例如: QList<T>容器: 只讀迭代器類:QListIterator<T> 讀寫迭代器:QMutableListIterator<T> QLinkedList<T>容器: 只讀迭代器:QLinkedList&

OutOfMemoryError系列1: Java heap space

這是本系列的第一篇文章, 相關文章列表: 每個Java程式都只能使用一定量的記憶體, 這種限制是由JVM的啟動引數決定的。而更復雜的情況在於, Java程式的記憶體分為兩部分: 堆記憶體(Heap space)和 永久代(Permanent Generat

【XML解析】1Java下使用JAXP中的DOM解析方式對XML文件進行解析

關於JAXP、DOM、SAX: 何為JAXP? JAXP(JavaApi for Xml Programming) – sun公司的一套操作XML的API。 JAXP中分為三種解析方式: DOM解析、SAX解析、StAX

深入理解JVM1Java虛擬機器基本結構

最近開始看周志明著的《深入理解Java虛擬機器》一書,此書作為Java虛擬機器的經典暢銷書,果然是非常優秀的,在學習它的過程中逐漸理解了Java執行機理、記憶體分配與回收等知識,收穫頗多。 要學習Java虛擬機器,首先要了解其歷史與基本構造。Java虛