java中的Cipher類 (此類爲加密和解密提供密碼功能)

工作項目當中有使用到加深瞭解一下

該類位於javax.crypto包下,聲明爲 public class Cipher extends Object

此類爲加密和解密提供密碼功能。它構成了 Java Cryptographic Extension (JCE) 框架的核心。

爲創建 Cipher 對象,應用程序調用 Cipher 的 getInstance 方法並將所請求轉換 的名稱傳遞給它。還可以指定提供者的名稱(可選)。

轉換 是一個字符串,它描述爲產生某種輸出而在給定的輸入上執行的操作(或一組操作)。轉換始終包括加密算法的名稱(例如,DES),後面可能跟有一個反饋模式和填充方案。

轉換具有以下形式:

“算法/模式/填充”或

“算法”

(後一種情況下,使用模式和填充方案特定於提供者的默認值)。例如,以下是有效的轉換:

     Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");
 
使用 CFB 和 OFB 之類的模式,Cipher 塊可以加密單元中小於該 Cipher 的實際塊大小的數據。請求這樣一個模式時,可以指定一次處理的位數(可選):將此數添加到模式名稱中,正如 "DES/CFB8/NoPadding" 和 "DES/OFB32/PKCS5Padding" 轉換所示。如果未指定該數,則將使用特定於提供者的默認值。(例如,SunJCE 提供者對 DES 使用默認的 64 位)。因此,通過使用如 CFB8 或 OFB8 的 8 位模式,Cipher 塊可以被轉換爲面向字節的 Cipher 流。

1、字段

public static final int ENCRYPT_MODE                      用於將 Cipher 初始化爲加密模式的常量。

public static final int DECRYPT_MODE   用於將 Cipher 初始化爲解密模式的常量。
public static final int WRAP_MODE      用於將 Cipher 初始化爲密鑰包裝模式的常量。
public static final int UNWRAP_MODE   用於將 Cipher 初始化爲密鑰解包模式的常量。
public static final int PUBLIC_KEY    用於表示要解包的密鑰爲“公鑰”的常量。
public static final int PRIVATE_KEY   用於表示要解包的密鑰爲“私鑰”的常量。
public static final int SECRET_KEY    用於表示要解包的密鑰爲“祕密密鑰”的常量。

 
2、構造方法
protected Cipher(CipherSpi cipherSpi, Provider provider, String transformation)
參數:cipherSpi - 代理   provider - 提供者   transformation - 轉換
3、方法摘要

①public static final Cipher getInstance(String transformation)  返回實現指定轉換的 Cipher 對象。transformation - 轉換的名稱,例如 DES/CBC/PKCS5Padding

②public static final Cipher getInstance(String transformation, String provider)  返回實現指定轉換的 Cipher 對象

③public static final Cipher getInstance(String transformation, Provider provider)  返回實現指定轉換的 Cipher 對象。

④public final Provider getProvider()  返回此 Cipher 對象的提供者。

⑤public final String getAlgorithm()  返回此 Cipher 對象的算法名稱。

⑥public final int getBlockSize()    返回塊的大小(以字節爲單位)。

⑦public final int getOutputSize(int inputLen)

根據給定的輸入長度 inputLen(以字節爲單位),返回保存下一個 update 或 doFinal 操作結果所需的輸出緩衝區長度(以字節爲單位)。

此調用還考慮到任何取自上一個 update 調用的未處理(已緩存)數據和填充。

下一個 update 或 doFinal 調用的實際輸出長度可能小於此方法返回的長度。

參數: nputLen - 輸入長度(以字節爲單位)

返回: 所需的輸出緩衝區大小(以字節爲單位)

⑧public final byte[] getIV()  返回新緩衝區中的初始化向量 (IV)。

⑨public final AlgorithmParameters getParameters()   返回此 Cipher 使用的參數。返回的參數可能與初始化此 Cipher 所使用的參數相同;如果此 Cipher 需要算法參數但卻未使用任何參數進行初始化,則返回的參數將由默認值和底層 Cipher 實現所使用的隨機參數值組成。

⑩public final ExemptionMechanism getExemptionMechanism()  返回此 Cipher 使用的豁免 (exemption) 機制對象。

11、public final void init(int opmode, Key key) 用密鑰初始化此 Cipher。

爲以下 4 種操作之一初始化該 Cipher:加密、解密、密鑰包裝或密鑰解包,具體取決於 opmode 的值。

如果此 Cipher 需要任何無法從給定 key 派生的算法參數,則在爲加密或密鑰包裝初始化時,底層 Cipher 實現應自己生成所需的參數(使用特定於提供者的默認值或隨機值);在爲解密或密鑰解包初始化時,將引發 InvalidKeyException。可以用 getParameters 或 getIV 獲取生成的參數(如果該參數爲 IV)。

如果此 Cipher(包括其底層反饋或填充方案)需要隨機字節(例如,用於參數生成),那麼它將使用具有最高優先級的已安裝提供者的 SecureRandom 實現作爲隨機源獲取這些字節。(如果已安裝的提供者都不提供 SecureRandom 實現,則將使用系統提供的隨機源)。

注意,初始化 Cipher 對象時,它將失去所有以前獲得的狀態。換句話說,初始化 Cipher 相當於創建該 Cipher 的一個新實例並將其初始化。

參數: opmode - 此 Cipher 的操作模式(爲以下之一:ENCRYPT_MODE、DECRYPT_MODE、WRAP_MODE 或 UNWRAP_MODE)

key - 密鑰

拋出: InvalidKeyException- 如果給定的 key 不適合初始化此 Cipher;如果此 Cipher 爲解密初始化,並且所需算法參數無法從給定的 key 確定;如果給定 key 的鍵大小超出所允許的最大值(由已配置的仲裁策略文件確定)。

12、public final void init(int opmode, Key key, SecureRandom random)  用密鑰和隨機源初始化此 Cipher。

13、public final void init(int opmode, Key key, AlgorithmParameterSpec params)   用密鑰和一組算法參數初始化此 Cipher。

14、public final void init(int opmode, Key key, AlgorithmParameterSpec params, SecureRandom random)  用一個密鑰、一組算法參數和一個隨機源初始化此 Cipher。

15、public final void init(int opmode, Key key, AlgorithmParameters params)  用密鑰和一組算法參數初始化此 Cipher。

16、public final void init(int opmode, Key key, AlgorithmParameters params, SecureRandom random)  用一個密鑰、一組算法參數和一個隨機源初始化此 Cipher。

17、public final void init(int opmode, Certificate certificate)  用取自給定證書的公鑰初始化此 Cipher。

18、public final void init(int opmode, Certificate certificate, SecureRandom random)  用取自給定證書的公鑰和隨機源初始化此 Cipher。

19、public final byte[] update(byte[] input)  繼續多部分加密或解密操作(具體取決於此 Cipher 的初始化方式),以處理其他數據部分。 處理 input 緩衝區中的字節,並將結果存儲在新的緩衝區中。 如果 input 長度爲 0,則此方法返回 null。

20、public final byte[] update(byte[] input, int inputOffset,int inputLen)  繼續多部分加密或解密操作(具體取決於此 Cipher 的初始化方式),以處理其他數據部分。

21、public final int update(byte[] input, int inputOffset, int inputLen, byte[] output)  繼續多部分加密或解密操作(具體取決於此 Cipher 的初始化方式),以處理其他數據部分。 處理 input 緩衝區中從 inputOffset 開始(包含)的前 inputLen 個字節,並將結果存儲在 output 緩衝區中。

如果 output 緩衝區太小無法保存該結果,則拋出 ShortBufferException。這種情況下,使用一個稍大的緩衝區再次調用。使用 getOutputSize 確定輸出緩衝區應爲多大。 如果 inputLen 爲 0,則此方法返回的長度爲 0。

注:此方法應該是複製安全 (copy-safe) 的,這意味着 input 和 output 緩衝區可引用相同的 byte 數組,並且在將結果複製到輸出緩衝區時,不會覆蓋任何未處理的輸入數據。

22、public final int update(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset)  繼續多部分加密或解密操作(具體取決於此 Cipher 的初始化方式),以處理其他數據部分。

23、public final int update(ByteBuffer input, ByteBuffer output)  繼續多部分加密或解密操作(具體取決於此 Cipher 的初始化方式),以處理其他數據部分。

24、public final byte[] doFinal() throws IllegalBlockSizeException, BadPaddingException  結束多部分加密或解密操作(具體取決於此 Cipher 的初始化方式)。

處理在上一次 update 操作中緩存的輸入數據,其中應用了填充(如果請求)。結果將存儲在新緩衝區中。 結束時,此方法將此 Cipher 對象重置爲上一次調用 init 初始化得到的狀態。即該對象被重置,並可用於加密或解密(具體取決於調用 init 時指定的操作模式)更多的數據。

注:如果拋出了任何異常,則再次使用此 Cipher 對象前需要將其重置。

返回: 包含結果的新緩衝區
拋出:
IllegalStateException - 如果此 Cipher 處於錯誤狀態(例如,尚未初始化)
IllegalBlockSizeException - 如果此 Cipher 爲 Cipher 塊,未請求任何填充(只針對加密模式),並且由此 Cipher 處理的數據總輸入長度不是塊大小的倍數;如果此加密算法無法處理所提供的輸入數據。
BadPaddingException - 如果此 Cipher 爲解密模式,並且未請求填充(或不填充),但解密的數據沒有用適當的填充字節進行限制
25、public final int doFinal(byte[] output, int outputOffset)  結束多部分加密或解密操作(具體取決於此 Cipher 的初始化方式)。

26、public final byte[] doFinal(byte[] input) 按單部分操作加密或解密數據,或者結束一個多部分操作。數據將被加密或解密(具體取決於此 Cipher 的初始化方式)。

27、public final byte[] doFinal(byte[] input, int inputOffset, int inputLen) 按單部分操作加密或解密數據,或者結束一個多部分操作。數據將被加密或解密(具體取決於此 Cipher 的初始化方式)。

28、public final int doFinal(byte[] input, int inputOffset, int inputLen, byte[] output)  按單部分操作加密或解密數據,或者結束一個多部分操作。數據將被加密或解密(具體取決於此 Cipher 的初始化方式)。

29、public final int doFinal(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset)  按單部分操作加密或解密數據,或者結束一個多部分操作。數據將被加密或解密(具體取決於此 Cipher 的初始化方式)。

30、public final int doFinal(ByteBuffer input, ByteBuffer output)  按單部分操作加密或解密數據,或者結束一個多部分操作。數據將被加密或解密(具體取決於此 Cipher 的初始化方式)。

31、public final byte[] wrap(Keykey) throws IllegalBlockSizeException, InvalidKeyException  包裝密鑰。

拋出:IllegalStateException - 如果此 Cipher 處於錯誤狀態(例如,尚未初始化) IllegalBlockSizeException - 如果此 Cipher 爲 Cipher 塊,未請求填充,並且要包裝的密鑰的編碼長度不是塊大小的倍數。 InvalidKeyException - 如果不能用此 Cipher 包裝該密鑰,或者這樣做不安全(例如,將一個硬件保護的密鑰傳給只能用於軟件保護的 Cipher)。
32、

public final Key unwrap(byte[] wrappedKey, String wrappedKeyAlgorithm,int wrappedKeyType)throws InvalidKeyException,NoSuchAlgorithmException  解包一個以前包裝的密鑰。
參數:
wrappedKey - 要解包的密鑰。
wrappedKeyAlgorithm - 與此包裝密鑰關聯的算法。
wrappedKeyType - 已包裝密鑰的類型。此類型必須爲 SECRET_KEY、PRIVATE_KEY 或 PUBLIC_KEY 之一。
返回: 解包的密鑰。
拋出:
IllegalStateException - 如果此 Cipher 處於錯誤狀態(例如,尚未初始化)
NoSuchAlgorithmException - 如果沒有一個已安裝的提供者能夠針對 wrappedKeyAlgorithm 創建類型爲 wrappedKeyType 的密鑰。
InvalidKeyException - 如果 wrappedKey 不表示針對 wrappedKeyAlgorithm 的類型爲 wrappedKeyType 的已包裝密鑰。
 
33、public static final int getMaxAllowedKeyLength(String transformation) throws NoSuchAlgorithmException  根據所安裝的 JCE 仲裁策略文件,返回指定轉換的最大密鑰長度。如果安裝了 JCE 無限制強度仲裁策略文件,則返回 Integer.MAX_VALUE

參數: transformation - Cipher 轉換。 返回: 最大密鑰長度(以位爲單位) 或 Integer.MAX_VALUE。 拋出: NullPointerException - 如果 transformation 爲 null。 NoSuchAlgorithmException - 如果 transformation 不是有效的轉換,即格式不爲“算法”或“算法/模式/填充”。 
34、public static final AlgorithmParameterSpec getMaxAllowedParameterSpec(String transformation) throws NoSuchAlgorithmException

根據仲裁策略文件,返回包含最大 Cipher 參數值的 AlgorithmParameterSpec 對象。如果安裝了 JCE 無限制強度仲裁策略文件,或者策略文件中對用於指定轉換的參數沒有最大限制,則返回 null。
參數: transformation - Cipher 轉換。 返回: 保存最大值的 AlgorithmParameterSpec,或者返回 null。

拋出: NullPointerException - 如果 transformation 爲 null。
NoSuchAlgorithmException - 如果 transformation 不是有效的轉換,即格式不爲“算法”或“算法/模式/填充”。
 

發佈了142 篇原創文章 · 獲贊 51 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章