所有类


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 属性可能具有以下格式之一:

  •      // 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/PKCS5PaddingCipherSpi 子类,以及实现 DES/CBC/PKCS5PaddingDES/CFB/PKCS5PaddingDES/OFB/PKCS5PaddingCipherSpi 子类。该提供程序在其主类中将有以下 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 实现:

  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 不使用任何参数,则返回 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 确定。

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部