JavaTM 2 Platform
Standard Ed. 6

javax.crypto
類別 CipherSpi

java.lang.Object
  繼承者 javax.crypto.CipherSpi

public abstract class CipherSpi
extends Object

此類別為 Cipher 類別定義了服務提供者介面 (SPI)。此類別中的所有抽象方法都必須由每個想要提供實作特定 cipher 演算法的加密服務提供者實作。

為創建封裝了此 CipherSpi 類別實例的 Cipher 實例,應用程序調用 Cipher 引擎類別的 getInstance 處理器方法之一並指定請求的轉換。作為可選項,應用程序還可以指定提供者的名稱。

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

轉換具有下面的形式:

(後一種情況下,使用此網要和填充方案的特定於提供者的預設值)。例如,以下是有效的轉換:

     Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");
 

一個提供者可能為每個演算法/網要/填充 組合提供一個單獨的類別,也有可能決定提供多個表示與演算法演算法/網要演算法//填充 (注意,是雙斜線)對應的子轉換的一般類別,在這種情況下,請求的網要和/或填充由 CiphergetInstance 方法自動設置,它調用的是提供者的 CipherSpi 子類別的 engineSetModeengineSetPadding 方法。

提供者主類別中的 Cipher 屬性可能具有以下格式之一:

例如,某提供者可能提供實作 DES/ECB/PKCS5PaddingCipherSpi 子類別,以及實作 DES/CBC/PKCS5PaddingDES/CFB/PKCS5PaddingDES/OFB/PKCS5PaddingCipherSpi 子類別。該提供者在其主類別中將有以下 Cipher 屬性:

另一個提供者可能實作一個用於以上每個網要的類別(即一個用於 ECB 的類別、一個用於 CBC 的類別、一個用於 CFB 的類別及一個用於 OFB 的類別),一個用於 PKCS5Padding 的類別,以及一個通過子類別化 CipherSpi 所得到的通用 DES 類別。該提供者在其主類別中將有以下 Cipher 屬性:

Cipher 引擎類別的 getInstance 處理器方法遵守這些規則,以便為“演算法”形式的轉換實例化提供者的 CipherSpi 實作:

  1. 檢查提供者是否已為指定的“演算法”註冊了一個 CipherSpi 子類別。

    如果已經註冊,則實例化此類別,使用其網要和填充方案的預設值(由提供者給出)。

    如果未註冊,則拋出 NoSuchAlgorithmException

Cipher 引擎類別的 getInstance 處理器方法遵守這些規則,以便為“演算法/網要/填充”形式的轉換實例化提供者的 CipherSpi 實作:

  1. 檢查提供者是否已為指定的“演算法/網要/填充”轉換註冊了一個 CipherSpi 子類別。

    如果已註冊,則將其實例化。

    如果未註冊,則轉到下一步。

  2. 檢查提供者是否已為“演算法/網要”子轉換註冊了一個 CipherSpi 子類別。

    如果已註冊,則將其實例化,並在新實例上調用 engineSetPadding(padding)

    如果未註冊,則轉到下一步。

  3. 檢查提供者是否已為“演算法//填充”子轉換註冊了一個 CipherSpi 子類別(注意,是雙斜線的)。

    如果已註冊,則將其實例化,並在新實例上調用 engineSetMode(mode)

    如果未註冊,則轉到下一步。

  4. 檢查提供者是否已為“演算法”子轉換註冊了一個 CipherSpi 子類別。

    如果已註冊,則將其實例化,並在新實例上調用 engineSetMode(mode)engineSetPadding(padding)

    如果未註冊,則拋出 NoSuchAlgorithmException

從以下版本開始:
1.4
另請參見:
KeyGenerator, SecretKey

建構子摘要
CipherSpi()
           
 
方法摘要
protected abstract  byte[] engineDoFinal(byte[] input, int inputOffset, int inputLen)
          按單部分操作加密或解密資料,或者結束一個多部分操作。
protected abstract  int engineDoFinal(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset)
          按單部分操作加密或解密資料,或者結束一個多部分操作。
protected  int engineDoFinal(ByteBuffer input, ByteBuffer output)
          按單部分操作加密或解密資料,或者結束一個多部分操作。
protected abstract  int engineGetBlockSize()
          返回塊的大小(以位元組為單位)。
protected abstract  byte[] engineGetIV()
          返回新緩衝區中的初始化向量 (IV)。
protected  int engineGetKeySize(Key key)
          返回給定密鑰物件的密鑰大小,以位為單位。
protected abstract  int engineGetOutputSize(int inputLen)
          在給定了輸入長度 inputLen(以位元組為單位)的情況下,返回用於保存下一個 updatedoFinal 操作結果所需的輸出緩衝區長度的位元組數。
protected abstract  AlgorithmParameters engineGetParameters()
          返回此 cipher 使用的參數。
protected abstract  void engineInit(int opmode, Key key, AlgorithmParameterSpec params, SecureRandom random)
          用一個密鑰、一組演算法參數和一個隨機源初始化此 cipher。
protected abstract  void engineInit(int opmode, Key key, AlgorithmParameters params, SecureRandom random)
          用一個密鑰、一組演算法參數和一個隨機源初始化此 cipher。
protected abstract  void engineInit(int opmode, Key key, SecureRandom random)
          用密鑰和隨機源初始化此 cipher。
protected abstract  void engineSetMode(String mode)
          設置此 cipher 的網要。
protected abstract  void engineSetPadding(String padding)
          設置此 cipher 的填充機制。
protected  Key engineUnwrap(byte[] wrappedKey, String wrappedKeyAlgorithm, int wrappedKeyType)
          打開一個以前包裹的密鑰。
protected abstract  byte[] engineUpdate(byte[] input, int inputOffset, int inputLen)
          繼續多部分加密或解密操作(取決於此 cipher 的初始化方式),以處理其他資料部分。
protected abstract  int engineUpdate(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset)
          繼續多部分加密或解密操作(取決於此 cipher 的初始化方式),以處理其他資料部分。
protected  int engineUpdate(ByteBuffer input, ByteBuffer output)
          繼續多部分加密或解密操作(取決於此 cipher 的初始化方式),以處理其他資料部分。
protected  byte[] engineWrap(Key key)
          將密鑰包裹。
 
從類別 java.lang.Object 繼承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

建構子詳細資訊

CipherSpi

public CipherSpi()
方法詳細資訊

engineSetMode

protected abstract void engineSetMode(String mode)
                               throws NoSuchAlgorithmException
設置此 cipher 的網要。

參數:
mode - cipher 網要
拋出:
NoSuchAlgorithmException - 如果請求的 cipher 網要不存在

engineSetPadding

protected abstract void engineSetPadding(String padding)
                                  throws NoSuchPaddingException
設置此 cipher 的填充機制。

參數:
padding - 填充機制
拋出:
NoSuchPaddingException - 如果請求的填充機制不存在

engineGetBlockSize

protected abstract int engineGetBlockSize()
返回塊的大小(以位元組為單位)。

返回:
塊的大小(以位元組為單位),如果底層演算法不是塊 cipher,則返回 0

engineGetOutputSize

protected abstract int engineGetOutputSize(int inputLen)
在給定了輸入長度 inputLen(以位元組為單位)的情況下,返回用於保存下一個 updatedoFinal 操作結果所需的輸出緩衝區長度的位元組數。

此調用還考慮到來自上一個 update 調用的任何未處理(已快取記憶體)的資料和填充。

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

參數:
inputLen - 輸入長度(以位元組為單位)
返回:
所需的輸出緩衝區大小(以位元組為單位)

engineGetIV

protected abstract byte[] engineGetIV()
返回新緩衝區中的初始化向量 (IV)。

此方法在基於密碼的加密或解密上下文中很有用,此時 IV 派生自使用者提供的 passphrase。

返回:
新緩衝區中的初始化向量,如果底層演算法不使用 IV,或 IV 尚未設置,則返回 null。

engineGetParameters

protected abstract AlgorithmParameters engineGetParameters()
返回此 cipher 使用的參數。

返回的參數可能與初始化此 cipher 所使用的參數相同;如果此 cipher 要求使用演算法參數但卻未使用任何參數進行初始化,則返回的參數可能會包含由預設值和底層 cipher 實作所使用的隨機參數值的組合。

返回:
此 cipher 使用的參數,如果此 cipher 不使用任何參數,則返回 null。

engineInit

protected abstract void engineInit(int opmode,
                                   Key key,
                                   SecureRandom random)
                            throws InvalidKeyException
用密鑰和隨機源初始化此 cipher。

為以下 4 種操作之一初始化該 cipher:加密、解密、密鑰包裹或密鑰打開,這取決於 opmode 的值。

如果此 cipher 要求使用任何演算法參數,而此參數又無法從給定的 key 派生,則在被初始化為加密或密鑰包裹時,底層 cipher 實作將會自己產生所需的參數(使用特定於提供者的預設或隨機值);在初始化為解密或密鑰打開時,將引發 InvalidKeyException。可以用 engineGetParametersengineGetIV 獲取產生的參數(如果該參數為 IV)。

如果此 cipher(包括其底層反饋或填充方案)要求使用任何隨機位元組(例如,用於參數產生),那麼它將從 random 獲取這些隨機位元組。

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

參數:
opmode - 此 cipher 的操作網要(其為如下之一:ENCRYPT_MODEDECRYPT_MODEWRAP_MODEUNWRAP_MODE
key - 加密密鑰
random - 隨機源
拋出:
InvalidKeyException - 如果給定的 key 不適合初始化此 cipher,如果要將此 cipher 初始化為解密,並且它所要求的演算法參數無法從給定的 key 確定。

engineInit

protected abstract void engineInit(int opmode,
                                   Key key,
                                   AlgorithmParameterSpec params,
                                   SecureRandom random)
                            throws InvalidKeyException,
                                   InvalidAlgorithmParameterException
用一個密鑰、一組演算法參數和一個隨機源初始化此 cipher。

為以下 4 種操作之一初始化該 cipher:加密、解密、密鑰包裹或密鑰打開,這取決於 opmode 的值。

如果此 cipher 要求使用任何演算法參數,而 params 為 null,則在被初始化為加密或密鑰包裹時,底層 cipher 實作將會自己產生所需的參數(使用特定於提供者的預設或隨機值);在初始化為解密或密鑰打開時,將引發 InvalidAlgorithmParameterException。可以用 engineGetParametersengineGetIV 獲取產生的參數(如果該參數為 IV)。

如果此 cipher(包括其底層反饋或填充方案)要求使用任何隨機位元組(例如,用於參數產生),那麼它將從 random 獲取這些隨機位元組。

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

參數:
opmode - 此 cipher 的操作網要(其為如下之一:ENCRYPT_MODEDECRYPT_MODEWRAP_MODEUNWRAP_MODE
key - 加密密鑰
params - 演算法參數
random - 隨機源
拋出:
InvalidKeyException - 如果給定的 key 不適合初始化此 cipher
InvalidAlgorithmParameterException - 如果給定的演算法參數不適合此 cipher,如果要將此 cipher 初始化為解密,並且要求使用演算法參數,而 params 為 null。

engineInit

protected abstract void engineInit(int opmode,
                                   Key key,
                                   AlgorithmParameters params,
                                   SecureRandom random)
                            throws InvalidKeyException,
                                   InvalidAlgorithmParameterException
用一個密鑰、一組演算法參數和一個隨機源初始化此 cipher。

為以下 4 種操作之一初始化該 cipher:加密、解密、密鑰包裹或密鑰打開,這取決於 opmode 的值。

如果此 cipher 要求使用任何演算法參數,而 params 為 null,則在被初始化為加密或密鑰包裹時,底層 cipher 實作將會自己產生所需的參數(使用特定於提供者的預設或隨機值);在初始化為解密或密鑰打開時,將引發 InvalidAlgorithmParameterException。可以用 engineGetParametersengineGetIV 獲取產生的參數(如果該參數為 IV)。

如果此 cipher(包括其底層反饋或填充方案)要求使用任何隨機位元組(例如,用於參數產生),那麼它將從 random 獲取這些隨機位元組。

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

參數:
opmode - 此 cipher 的操作網要(其為如下之一:ENCRYPT_MODEDECRYPT_MODEWRAP_MODEUNWRAP_MODE
key - 加密密鑰
params - 演算法參數
random - 隨機源
拋出:
InvalidKeyException - 如果給定的 key 不適合初始化此 cipher
InvalidAlgorithmParameterException - 如果給定的演算法參數不適合此 cipher,如果要將此 cipher 初始化為解密,並且要求使用演算法參數,而 params 為 null。

engineUpdate

protected abstract byte[] engineUpdate(byte[] input,
                                       int inputOffset,
                                       int inputLen)
繼續多部分加密或解密操作(取決於此 cipher 的初始化方式),以處理其他資料部分。

處理 input 緩衝區中從 inputOffset 開始(包含)的前 inputLen 個位元組,並將結果存儲在新的緩衝區中。

參數:
input - 輸入緩衝區
inputOffset - input 中輸入開始位置的偏移量
inputLen - 輸入長度
返回:
包含結果的新緩衝區,如果底層 cipher 為塊 cipher 並且輸入資料太短而無法形成新的塊時,則返回 null。

engineUpdate

protected abstract int engineUpdate(byte[] input,
                                    int inputOffset,
                                    int inputLen,
                                    byte[] output,
                                    int outputOffset)
                             throws ShortBufferException
繼續多部分加密或解密操作(取決於此 cipher 的初始化方式),以處理其他資料部分。

處理 input 緩衝區中從 inputOffset 開始(包含)的前 inputLen 個位元組,並將結果存儲在 output 緩衝區中從 outputOffset 開始(包含)的位置。

如果 output 緩衝區太小無法保存該結果,則拋出 ShortBufferException

參數:
input - 輸入緩衝區
inputOffset - input 中輸入開始位置的偏移量
inputLen - 輸入長度
output - 保存結果的緩衝區
outputOffset - output 中存儲結果的位置的偏移量
返回:
output 中存儲的位元組數
拋出:
ShortBufferException - 如果給定的輸出緩衝區太小無法保存該結果

engineUpdate

protected int engineUpdate(ByteBuffer input,
                           ByteBuffer output)
                    throws ShortBufferException
繼續多部分加密或解密操作(取決於此 cipher 的初始化方式),以處理其他資料部分。

處理從 input.position() 開始的所有 input.remaining() 位元組。結果存儲在輸出緩衝區中。返回時,輸入緩衝區的位置將等於其限制;其限制並未改變。輸出緩衝區的位置將前移 n,其中 n 為此方法返回的值;輸出緩衝區的限制並未改變。

如果 output.remaining() 個位元組還不夠保存該結果,則拋出 ShortBufferException

如果能夠比 byte 陣列更有效地處理 ByteBuffer,子類別應考慮覆寫此方法。

參數:
input - 輸入 ByteBuffer
output - 輸出 ByteBuffer
返回:
output 中存儲的位元組數
拋出:
ShortBufferException - 如果輸出緩衝區中沒有足夠的空間
NullPointerException - 如果任一參數為 null
從以下版本開始:
1.5

engineDoFinal

protected abstract byte[] engineDoFinal(byte[] input,
                                        int inputOffset,
                                        int inputLen)
                                 throws IllegalBlockSizeException,
                                        BadPaddingException
按單部分操作加密或解密資料,或者結束一個多部分操作。資料被加密還是解密取決於此 cipher 的初始化方式。

處理 input 緩衝區中從 inputOffset 開始(包含)的前 inputLen 個位元組以及可能在上一次 update 操作過程中已快取記憶體的任何輸入位元組,其中應用了填充(如果需要)。結果存儲在新緩衝區中。

結束時,此方法將把此 cipher 物件重置為上一次調用 engineInit 初始化得到的狀態。即重置該物件,可供加密或解密(取決於調用 engineInit 時指定的操作網要)更多的資料。

註:如果拋出了任何異常,則再次使用此 cipher 物件前,可能需要將其重置。

參數:
input - 輸入緩衝區
inputOffset - input 中輸入開始位置的偏移量
inputLen - 輸入長度
返回:
存儲結果的新緩衝區
拋出:
IllegalBlockSizeException - 如果此 cipher 為塊 cipher,未請求任何填充(只針對加密網要),並且由此 cipher 處理的資料總輸入長度不是塊大小的倍數,如果此加密演算法無法處理所提供的輸入資料。
BadPaddingException - 如果此 cipher 為解密網要,並且未請求填充或不填充,但解密的資料沒有用適當的填充位元組所限制

engineDoFinal

protected abstract int engineDoFinal(byte[] input,
                                     int inputOffset,
                                     int inputLen,
                                     byte[] output,
                                     int outputOffset)
                              throws ShortBufferException,
                                     IllegalBlockSizeException,
                                     BadPaddingException
按單部分操作加密或解密資料,或者結束一個多部分操作。資料被加密還是解密取決於此 cipher 的初始化方式。

處理 input 緩衝區中從 inputOffset 開始(包含)的前 inputLen 個位元組以及可能在上一次 update 操作過程中已快取記憶體的任何輸入位元組,其中應用了填充(如果需要)。結果存儲在 output 緩衝區中從 outputOffset(包含)開始的位置。

如果 output 緩衝區太小無法保存該結果,則拋出 ShortBufferException

結束時,此方法將把此 cipher 物件重置為上一次調用 engineInit 初始化得到的狀態。即重置該物件,可供加密或解密(取決於調用 engineInit 時指定的操作網要)更多的資料。

註:如果拋出了任何異常,則再次使用此 cipher 物件前,可能需要將其重置。

參數:
input - 輸入緩衝區
inputOffset - input 中輸入開始位置的偏移量
inputLen - 輸入長度
output - 保存結果的緩衝區
outputOffset - output 中存儲結果的位置的偏移量
返回:
output 中存儲的位元組數
拋出:
IllegalBlockSizeException - 如果此 cipher 為塊 cipher,未請求任何填充(只針對加密網要),並且由此 cipher 處理的資料總輸入長度不是塊大小的倍數,如果此加密演算法無法處理所提供的輸入資料。
ShortBufferException - 如果給定的輸出緩衝區太小無法保存結果
BadPaddingException - 如果 cipher 為解密網要,並且未請求填充或不填充,但解密的資料沒有用適當的填充位元組所限制

engineDoFinal

protected int engineDoFinal(ByteBuffer input,
                            ByteBuffer output)
                     throws ShortBufferException,
                            IllegalBlockSizeException,
                            BadPaddingException
按單部分操作加密或解密資料,或者結束一個多部分操作。資料被加密還是解密取決於此 cipher 的初始化方式。

處理從 input.position() 開始的所有 input.remaining() 位元組。結果存儲在輸出緩衝區中。返回時,輸入緩衝區的位置將等於其限制;其限制並未改變。輸出緩衝區的位置將前移 n,其中 n 為此方法返回的值;輸出緩衝區的限制並未改變。

如果 output.remaining() 個位元組還不夠保存該結果,則拋出 ShortBufferException

結束時,此方法將把此 cipher 物件重置為上一次調用 engineInit 初始化得到的狀態。即重置該物件,可供加密或解密(取決於調用 engineInit 時指定的操作網要)更多的資料。

註:如果拋出了任何異常,則再次使用此 cipher 物件前,可能需要將其重置。

如果能夠比 byte 陣列更有效地處理 ByteBuffer,子類別應考慮覆寫此方法。

參數:
input - 輸入 ByteBuffer
output - 輸出 ByteBuffer
返回:
output 中存儲的位元組數
拋出:
IllegalBlockSizeException - 如果此 cipher 為塊 cipher,未請求任何填充(只針對加密網要),並且由此 cipher 處理的資料總輸入長度不是塊大小的倍數,如果此加密演算法無法處理所提供的輸入資料。
ShortBufferException - 如果輸出緩衝區沒有足夠的空間
BadPaddingException - 如果 cipher 為解密網要,並且未請求填充或不填充,但解密的資料沒有用適當的填充位元組所限制
NullPointerException - 如果任一參數為 null
從以下版本開始:
1.5

engineWrap

protected byte[] engineWrap(Key key)
                     throws IllegalBlockSizeException,
                            InvalidKeyException
將密鑰包裹。

已將此具體方法添加到了先前定義過的抽象類別中。(為向後相容,它不能為抽象方法)。可以由提供者覆寫以包裹該密鑰。如果給定的密鑰無法被包裹,則這樣的覆寫可能會拋出 IllegalBlockSizeException 或 InvalidKeyException (在指定情況下)。如果不覆寫此方法,則它總是拋出 UnsupportedOperationException。

參數:
key - 要包裹的密鑰。
返回:
已包裹的密鑰。
拋出:
IllegalBlockSizeException - 如果此 cipher 為塊 cipher,未請求填充,並且要包裹的密鑰的編碼長度不是塊大小的倍數。
InvalidKeyException - 如果不可能用此 cipher 套件裝該密鑰,或這樣做不安全(例如,將一個硬體保護的密鑰傳給只要求軟體保護的 cipher)。

engineUnwrap

protected Key engineUnwrap(byte[] wrappedKey,
                           String wrappedKeyAlgorithm,
                           int wrappedKeyType)
                    throws InvalidKeyException,
                           NoSuchAlgorithmException
打開一個以前包裹的密鑰。

已將此具體方法添加到了先前定義過的抽象類別中。(為向後相容,它不能為抽象方法)。可以由提供者覆寫以打開以前包裹的密鑰。如果無法打開給定的套件裝密鑰,則這樣的覆寫可能會拋出 InvalidKeyException。如果不覆寫此方法,則它總是拋出 UnsupportedOperationException。

參數:
wrappedKey - 要打開的密鑰。
wrappedKeyAlgorithm - 與此套件裝密鑰關聯的演算法。
wrappedKeyType - 已包裹密鑰的型別。此型別為 SECRET_KEYPRIVATE_KEYPUBLIC_KEY 之一。
返回:
打開的密鑰。
拋出:
NoSuchAlgorithmException - 如果沒有一個已安裝的提供者能夠為 wrappedKeyAlgorithm 創建型別為 wrappedKeyType 的密鑰。
InvalidKeyException - 如果 wrappedKey 並不為 wrappedKeyAlgorithm 表示型別為 wrappedKeyType 的已包裹密鑰。

engineGetKeySize

protected int engineGetKeySize(Key key)
                        throws InvalidKeyException
返回給定密鑰物件的密鑰大小,以位為單位。

已將此具體方法添加到了先前定義過的抽象類別中。如果提供者未覆寫此方法,則將拋出 UnsupportedOperationException

參數:
key - 密鑰物件
返回:
給定密鑰物件的密鑰大小。
拋出:
InvalidKeyException - 如果 key 無效。

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only