java.lang.Objectjavax.crypto.CipherSpi
public abstract class CipherSpi
      此类为 Cipher 类定义了服务提供者接口 (SPI)。此类中的所有抽象方法都必须由每个想要提供实现特定 cipher 算法的加密服务提供者实现。 
为创建封装了此 CipherSpi 类实例的 Cipher 实例,应用程序调用 Cipher 引擎类的 getInstance 工厂方法之一并指定请求的转换。作为可选项,应用程序还可以指定提供者的名称。 
转换 是描述为产生某种输出而在给定的输入上执行的操作(或一组操作)的字符串。转换始终包括加密算法的名称(例如,DES),后面可能跟有一个反馈模式和填充方案。
转换具有下面的形式:
(后一种情况下,使用此模式和填充方案的特定于提供者的默认值)。例如,以下是有效的转换:
     Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");
  
  一个提供者可能为每个算法/模式/填充 组合提供一个单独的类,也有可能决定提供多个表示与算法 或算法/模式 或算法//填充 (注意,是双斜线)对应的子转换的一般类,在这种情况下,请求的模式和/或填充由 Cipher 的 getInstance 方法自动设置,它调用的是提供者的 CipherSpi 子类的 engineSetMode 和 engineSetPadding 方法。 
提供者主类中的 Cipher 属性可能具有以下格式之一: 
     // provider's subclass of "CipherSpi" implements "algName" with
     // pluggable mode and padding
     Cipher.algName
  
     // provider's subclass of "CipherSpi" implements "algName" in the
     // specified "mode", with pluggable padding
     Cipher.algName/mode
  
     // provider's subclass of "CipherSpi" implements "algName" with the
     // specified "padding", with pluggable mode
     Cipher.algName//padding
  
     // provider's subclass of "CipherSpi" implements "algName" with the
     // specified "mode" and "padding"
     Cipher.algName/mode/padding
  例如,某提供者可能提供实现 DES/ECB/PKCS5Padding 的 CipherSpi 子类,以及实现 DES/CBC/PKCS5Padding、DES/CFB/PKCS5Padding 和 DES/OFB/PKCS5Padding 的 CipherSpi 子类。该提供者在其主类中将有以下 Cipher 属性:
     Cipher.DES/ECB/PKCS5Padding
  
     Cipher.DES/CBC/PKCS5Padding
  
     Cipher.DES/CFB/PKCS5Padding
  
     Cipher.DES/OFB/PKCS5Padding
  另一个提供者可能实现一个用于以上每个模式的类(即一个用于 ECB 的类、一个用于 CBC 的类、一个用于 CFB 的类及一个用于 OFB 的类),一个用于 PKCS5Padding 的类,以及一个通过子类化 CipherSpi 所得到的通用 DES 类。该提供者在其主类中将有以下 Cipher 属性:
     Cipher.DES
  Cipher 引擎类的 getInstance 工厂方法遵守这些规则,以便为“算法”形式的转换实例化提供者的 CipherSpi 实现: 
CipherSpi 子类。 如果已经注册,则实例化此类,使用其模式和填充方案的默认值(由提供者给出)。
如果未注册,则抛出 NoSuchAlgorithmException。 
Cipher 引擎类的 getInstance 工厂方法遵守这些规则,以便为“算法/模式/填充”形式的转换实例化提供者的 CipherSpi 实现: 
CipherSpi 子类。 如果已注册,则将其实例化。
如果未注册,则转到下一步。
CipherSpi 子类。 如果已注册,则将其实例化,并在新实例上调用 engineSetPadding(padding)。 
如果未注册,则转到下一步。
CipherSpi 子类(注意,是双斜线的)。 如果已注册,则将其实例化,并在新实例上调用 engineSetMode(mode)。 
如果未注册,则转到下一步。
CipherSpi 子类。 如果已注册,则将其实例化,并在新实例上调用 engineSetMode(mode) 和 engineSetPadding(padding)。 
如果未注册,则抛出 NoSuchAlgorithmException。 
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(以字节为单位)的情况下,返回用于保存下一个 update 或 doFinal 操作结果所需的输出缓冲区长度的字节数。 |  
    
 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 |  
    
| 构造方法详细信息 | 
|---|
public CipherSpi()
| 方法详细信息 | 
|---|
protected abstract void engineSetMode(String mode) throws NoSuchAlgorithmException
mode - cipher 模式 
     NoSuchAlgorithmException - 如果请求的 cipher 模式不存在
     protected abstract void engineSetPadding(String padding) throws NoSuchPaddingException
padding - 填充机制 
     NoSuchPaddingException - 如果请求的填充机制不存在
     protected abstract int engineGetBlockSize()
protected abstract int engineGetOutputSize(int inputLen)
inputLen(以字节为单位)的情况下,返回用于保存下一个 
    update 或 
    doFinal 操作结果所需的输出缓冲区长度的字节数。 
    此调用还考虑到来自上一个 update 调用的任何未处理(已缓存)的数据和填充。 
下一个 update 或 doFinal 调用的实际输出长度可能小于此方法返回的长度。 
inputLen - 输入长度(以字节为单位) 
     protected abstract byte[] engineGetIV()
此方法在基于密码的加密或解密上下文中很有用,此时 IV 派生自用户提供的 passphrase。
protected abstract AlgorithmParameters engineGetParameters()
返回的参数可能与初始化此 cipher 所使用的参数相同;如果此 cipher 要求使用算法参数但却未使用任何参数进行初始化,则返回的参数可能会包含由默认值和底层 cipher 实现所使用的随机参数值的组合。
protected abstract void engineInit(int opmode,
                                   Key key,
                                   SecureRandom random)
                            throws InvalidKeyException 
  为以下 4 种操作之一初始化该 cipher:加密、解密、密钥包装或密钥打开,这取决于 opmode 的值。 
如果此 cipher 要求使用任何算法参数,而此参数又无法从给定的 key 派生,则在被初始化为加密或密钥包装时,底层 cipher 实现将会自己生成所需的参数(使用特定于提供者的默认或随机值);在初始化为解密或密钥打开时,将引发 InvalidKeyException。可以用 engineGetParameters 或 engineGetIV 获取生成的参数(如果该参数为 IV)。 
如果此 cipher(包括其底层反馈或填充方案)要求使用任何随机字节(例如,用于参数生成),那么它将从 random 获取这些随机字节。 
注意,当初始化 Cipher 对象时,它将失去所有以前获得的状态。换句话说,初始化 Cipher 相当于创建该 Cipher 的一个新实例并将其初始化。
opmode - 此 cipher 的操作模式(其为如下之一:
      ENCRYPT_MODE、
      DECRYPT_MODE、
      WRAP_MODE 或 
      UNWRAP_MODE)
     key - 加密密钥
     random - 随机源 
     InvalidKeyException - 如果给定的 key 不适合初始化此 cipher,如果要将此 cipher 初始化为解密,并且它所要求的算法参数无法从给定的 key 确定。
     
protected abstract void engineInit(int opmode,
                                   Key key,
                                   AlgorithmParameterSpec params,
                                   SecureRandom random)
                            throws InvalidKeyException,
                                   InvalidAlgorithmParameterException 
  为以下 4 种操作之一初始化该 cipher:加密、解密、密钥包装或密钥打开,这取决于 opmode 的值。 
如果此 cipher 要求使用任何算法参数,而 params 为 null,则在被初始化为加密或密钥包装时,底层 cipher 实现将会自己生成所需的参数(使用特定于提供者的默认或随机值);在初始化为解密或密钥打开时,将引发 InvalidAlgorithmParameterException。可以用 engineGetParameters 或 engineGetIV 获取生成的参数(如果该参数为 IV)。 
如果此 cipher(包括其底层反馈或填充方案)要求使用任何随机字节(例如,用于参数生成),那么它将从 random 获取这些随机字节。 
注意,当初始化 Cipher 对象时,它将失去所有以前获得的状态。换句话说,初始化 Cipher 相当于创建该 Cipher 的一个新实例并将其初始化。
opmode - 此 cipher 的操作模式(其为如下之一:
      ENCRYPT_MODE、
      DECRYPT_MODE、
      WRAP_MODE 或 
      UNWRAP_MODE)
     key - 加密密钥
     params - 算法参数
     random - 随机源 
     InvalidKeyException - 如果给定的 key 不适合初始化此 cipher 
     InvalidAlgorithmParameterException - 如果给定的算法参数不适合此 cipher,如果要将此 cipher 初始化为解密,并且要求使用算法参数,而 
      params 为 null。
     
protected abstract void engineInit(int opmode,
                                   Key key,
                                   AlgorithmParameters params,
                                   SecureRandom random)
                            throws InvalidKeyException,
                                   InvalidAlgorithmParameterException 
  为以下 4 种操作之一初始化该 cipher:加密、解密、密钥包装或密钥打开,这取决于 opmode 的值。 
如果此 cipher 要求使用任何算法参数,而 params 为 null,则在被初始化为加密或密钥包装时,底层 cipher 实现将会自己生成所需的参数(使用特定于提供者的默认或随机值);在初始化为解密或密钥打开时,将引发 InvalidAlgorithmParameterException。可以用 engineGetParameters 或 engineGetIV 获取生成的参数(如果该参数为 IV)。 
如果此 cipher(包括其底层反馈或填充方案)要求使用任何随机字节(例如,用于参数生成),那么它将从 random 获取这些随机字节。 
注意,当初始化 Cipher 对象时,它将失去所有以前获得的状态。换句话说,初始化 Cipher 相当于创建该 Cipher 的一个新实例并将其初始化。
opmode - 此 cipher 的操作模式(其为如下之一:
      ENCRYPT_MODE、
      DECRYPT_MODE、
      WRAP_MODE 或 
      UNWRAP_MODE)
     key - 加密密钥
     params - 算法参数
     random - 随机源 
     InvalidKeyException - 如果给定的 key 不适合初始化此 cipher 
     InvalidAlgorithmParameterException - 如果给定的算法参数不适合此 cipher,如果要将此 cipher 初始化为解密,并且要求使用算法参数,而 
      params 为 null。
     
protected abstract byte[] engineUpdate(byte[] input,
                                       int inputOffset,
                                       int inputLen) 
  处理 input 缓冲区中从 inputOffset 开始(包含)的前 inputLen 个字节,并将结果存储在新的缓冲区中。 
input - 输入缓冲区
     inputOffset - 
      input 中输入开始位置的偏移量
     inputLen - 输入长度 
     
protected abstract int engineUpdate(byte[] input,
                                    int inputOffset,
                                    int inputLen,
                                    byte[] output,
                                    int outputOffset)
                             throws ShortBufferException 
  处理 input 缓冲区中从 inputOffset 开始(包含)的前 inputLen 个字节,并将结果存储在 output 缓冲区中从 outputOffset 开始(包含)的位置。 
如果 output 缓冲区太小无法保存该结果,则抛出 ShortBufferException。 
input - 输入缓冲区
     inputOffset - 
      input 中输入开始位置的偏移量
     inputLen - 输入长度
     output - 保存结果的缓冲区
     outputOffset - 
      output 中存储结果的位置的偏移量 
     output 中存储的字节数 
     ShortBufferException - 如果给定的输出缓冲区太小无法保存该结果
     protected int engineUpdate(ByteBuffer input, ByteBuffer output) throws ShortBufferException
处理从 input.position() 开始的所有 input.remaining() 字节。结果存储在输出缓冲区中。返回时,输入缓冲区的位置将等于其限制;其限制并未改变。输出缓冲区的位置将前移 n,其中 n 为此方法返回的值;输出缓冲区的限制并未改变。 
如果 output.remaining() 个字节还不够保存该结果,则抛出 ShortBufferException。 
如果能够比 byte 数组更有效地处理 ByteBuffer,子类应考虑重写此方法。
input - 输入 ByteBuffer
     output - 输出 ByteBuffer 
     output 中存储的字节数 
     ShortBufferException - 如果输出缓冲区中没有足够的空间 
     NullPointerException - 如果任一参数为 
      null
     
protected abstract byte[] engineDoFinal(byte[] input,
                                        int inputOffset,
                                        int inputLen)
                                 throws IllegalBlockSizeException,
                                        BadPaddingException 
  处理 input 缓冲区中从 inputOffset 开始(包含)的前 inputLen 个字节以及可能在上一次 update 操作过程中已缓存的任何输入字节,其中应用了填充(如果需要)。结果存储在新缓冲区中。 
结束时,此方法将把此 cipher 对象重置为上一次调用 engineInit 初始化得到的状态。即重置该对象,可供加密或解密(取决于调用 engineInit 时指定的操作模式)更多的数据。 
注:如果抛出了任何异常,则再次使用此 cipher 对象前,可能需要将其重置。
input - 输入缓冲区
     inputOffset - 
      input 中输入开始位置的偏移量
     inputLen - 输入长度 
     IllegalBlockSizeException - 如果此 cipher 为块 cipher,未请求任何填充(只针对加密模式),并且由此 cipher 处理的数据总输入长度不是块大小的倍数,如果此加密算法无法处理所提供的输入数据。 
     BadPaddingException - 如果此 cipher 为解密模式,并且未请求填充或不填充,但解密的数据没有用适当的填充字节所限制
     
protected abstract int engineDoFinal(byte[] input,
                                     int inputOffset,
                                     int inputLen,
                                     byte[] output,
                                     int outputOffset)
                              throws ShortBufferException,
                                     IllegalBlockSizeException,
                                     BadPaddingException 
  处理 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 为解密模式,并且未请求填充或不填充,但解密的数据没有用适当的填充字节所限制
     protected int engineDoFinal(ByteBuffer input, ByteBuffer output) throws ShortBufferException, IllegalBlockSizeException, BadPaddingException
处理从 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
     protected byte[] engineWrap(Key key) throws IllegalBlockSizeException, InvalidKeyException
已将此具体方法添加到了先前定义过的抽象类中。(为向后兼容,它不能为抽象方法)。可以由提供者重写以包装该密钥。如果给定的密钥无法被包装,则这样的重写可能会抛出 IllegalBlockSizeException 或 InvalidKeyException (在指定情况下)。如果不重写此方法,则它总是抛出 UnsupportedOperationException。
key - 要包装的密钥。 
     IllegalBlockSizeException - 如果此 cipher 为块 cipher,未请求填充,并且要包装的密钥的编码长度不是块大小的倍数。 
     InvalidKeyException - 如果不可能用此 cipher 包装该密钥,或这样做不安全(例如,将一个硬件保护的密钥传给只要求软件保护的 cipher)。
     protected Key engineUnwrap(byte[] wrappedKey, String wrappedKeyAlgorithm, int wrappedKeyType) throws InvalidKeyException, NoSuchAlgorithmException
已将此具体方法添加到了先前定义过的抽象类中。(为向后兼容,它不能为抽象方法)。可以由提供者重写以打开以前包装的密钥。如果无法打开给定的包装密钥,则这样的重写可能会抛出 InvalidKeyException。如果不重写此方法,则它总是抛出 UnsupportedOperationException。
wrappedKey - 要打开的密钥。
     wrappedKeyAlgorithm - 与此包装密钥关联的算法。
     wrappedKeyType - 已包装密钥的类型。此类型为 
      SECRET_KEY、
      PRIVATE_KEY 或 
      PUBLIC_KEY 之一。 
     NoSuchAlgorithmException - 如果没有一个已安装的提供者能够为 
      wrappedKeyAlgorithm 创建类型为 
      wrappedKeyType 的密钥。 
     InvalidKeyException - 如果 
      wrappedKey 并不为 
      wrappedKeyAlgorithm 表示类型为 
      wrappedKeyType 的已包装密钥。
     protected int engineGetKeySize(Key key) throws InvalidKeyException
已将此具体方法添加到了先前定义过的抽象类中。如果提供者未重写此方法,则将抛出 UnsupportedOperationException。 
key - 密钥对象 
     InvalidKeyException - 如果 
      key 无效。