模块 java.base

类 CipherSpi

java.lang.Object
javax.crypto.CipherSpi

public abstract class CipherSpi extends Object
这个类定义了服务提供商接口 (SPI) 为 Cipher 类。此类中的所有抽象方法必须由希望提供特定密码算法实现的每个加密服务提供者实现。

为了创建 Cipher 的实例,它封装了这个 CipherSpi 类的实例,应用程序调用 Cipher 引擎类的 getInstance 工厂方法之一,并指定请求的转型.可选地,应用程序还可以指定提供者的名称。

A 转型是一个字符串,描述要对给定输入执行的操作(或一组操作),以产生一些输出。转换总是包括密码算法的名称(例如,AES), 并且可以跟随反馈模式和填充方案。

转换具有以下形式:

  • "算法/模式/填充“ 或者
  • "算法"

(在后一种情况下,使用特定于提供者的模式和填充方案的默认值)。例如,以下是一个有效的转换:

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

提供者可以为每个组合提供一个单独的类算法/模式/填充,或者可以决定提供更通用的类来表示对应于算法或者算法/模式或者算法//填充(注意双斜杠),在这种情况下,请求的模式和/或填充由 CiphergetInstance 方法自动设置,这些方法调用 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
     

例如,提供者可以提供 CipherSpi 的子类,该子类实现AES/ECB/PKCS5填充, 一个实现AES/CBC/PKCS5填充, 一个实现AES/CFB/PKCS5填充,还有另一个实现AES/OFB/PKCS5填充.该提供者在其主类中将具有以下 Cipher 属性:

  •    Cipher. AES/ECB/PKCS5Padding
     
  •    Cipher. AES/CBC/PKCS5Padding
     
  •    Cipher. AES/CFB/PKCS5Padding
     
  •    Cipher. AES/OFB/PKCS5Padding
     

另一个提供者可以为上述每种模式实现一个类(即,一个类用于ECB, 一个为CBC, 一个为CFB, 一个为OFB), 一类PKCS5填充, 和一个通用的AESCipherSpi 继承的类。该提供者在其主类中将具有以下 Cipher 属性:

  •    Cipher. AES
     

Cipher 引擎类的 getInstance 工厂方法遵循这些规则,以便实例化提供者对 CipherSpi 的实现以进行形式转换“算法":

  1. 检查提供者是否为指定的“注册了CipherSpi的子类算法".

    如果答案为是,则实例化此类,使用其模式和填充方案默认值(由提供者提供)。

    如果答案是否定的,则抛出 NoSuchAlgorithmException 异常。

Cipher 引擎类的 getInstance 工厂方法遵循这些规则,以便实例化提供者对 CipherSpi 的实现以进行形式转换“算法/模式/填充":

  1. 检查提供者是否为指定的“注册了CipherSpi的子类算法/模式/填充“ 转型。

    如果答案是 YES,则实例化它。

    如果答案是否定的,请转到下一步。

  2. 检查提供者是否为子转换注册了CipherSpi的子类“算法/模式".

    如果答案是肯定的,实例化它,并在新实例上调用 engineSetPadding(<i>padding</i>)

    如果答案是否定的,请转到下一步。

  3. 检查提供者是否为子转换注册了CipherSpi的子类“算法//填充"(注意双斜杠)。

    如果答案是肯定的,实例化它,并在新实例上调用 engineSetMode(<i>mode</i>)

    如果答案是否定的,请转到下一步。

  4. 检查提供者是否为子转换注册了CipherSpi的子类“算法".

    如果答案是 YES,则实例化它,并在新实例上调用 engineSetMode(<i>mode</i>)engineSetPadding(<i>padding</i>)

    如果答案是否定的,则抛出 NoSuchAlgorithmException 异常。

自从:
1.4
参见:
  • 构造方法总结

    构造方法
    构造方法
    描述
    子类调用的构造方法。
  • 方法总结

    修饰符和类型
    方法
    描述
    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
    在单部分操作中加密或解密数据,或完成多部分操作。
    protected abstract int
    返回块大小(以字节为单位)。
    protected abstract byte[]
    返回新缓冲区中的初始化向量 (IV)。
    protected int
    以位为单位返回给定密钥对象的密钥大小。
    protected abstract int
    engineGetOutputSize(int inputLen)
    给定输入长度 inputLen(以字节为单位),返回输出缓冲区为了保存下一个 updatedoFinal 操作的结果所需的字节长度。
    protected abstract AlgorithmParameters
    返回与此密码一起使用的参数。
    protected abstract void
    engineInit(int opmode, Key key, AlgorithmParameters params, SecureRandom random)
    使用密钥、一组算法参数和随机源初始化此 CipherSpi 对象。
    protected abstract void
    engineInit(int opmode, Key key, SecureRandom random)
    使用密钥和随机源初始化此 CipherSpi 对象。
    protected abstract void
    engineInit(int opmode, Key key, AlgorithmParameterSpec params, SecureRandom random)
    使用密钥、一组算法参数和随机源初始化此 CipherSpi 对象。
    protected abstract void
    设置此密码的模式。
    protected abstract void
    设置此密码的填充机制。
    protected Key
    engineUnwrap(byte[] wrappedKey, String wrappedKeyAlgorithm, int wrappedKeyType)
    打开先前包装的密钥。
    protected abstract byte[]
    engineUpdate(byte[] input, int inputOffset, int inputLen)
    继续多部分加密或解密操作(取决于此 CipherSpi 对象的初始化方式),处理另一个数据部分。
    protected abstract int
    engineUpdate(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset)
    继续多部分加密或解密操作(取决于此 CipherSpi 对象的初始化方式),处理另一个数据部分。
    protected int
    继续多部分加密或解密操作(取决于此 CipherSpi 对象的初始化方式),处理另一个数据部分。
    protected void
    engineUpdateAAD(byte[] src, int offset, int len)
    使用提供的缓冲区的子集继续附加身份验证数据 (AAD) 的多部分更新。
    protected void
    继续附加身份验证数据 (AAD) 的多部分更新。
    protected byte[]
    包裹一把钥匙。

    在类 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
      设置此密码的模式。
      参数:
      mode - 密码模式
      抛出:
      NoSuchAlgorithmException - 如果请求的密码模式不存在
    • engineSetPadding

      protected abstract void engineSetPadding(String  padding) throws NoSuchPaddingException
      设置此密码的填充机制。
      参数:
      padding - 填充机制
      抛出:
      NoSuchPaddingException - 如果请求的填充机制不存在
    • engineGetBlockSize

      protected abstract int engineGetBlockSize()
      返回块大小(以字节为单位)。
      返回:
      块大小(以字节为单位),如果算法不是块密码,则为 0
    • engineGetOutputSize

      protected abstract int engineGetOutputSize(int inputLen)
      给定输入长度 inputLen(以字节为单位),返回输出缓冲区为了保存下一个 updatedoFinal 操作的结果所需的字节长度。

      此调用考虑了来自先前 update 调用、填充和 AEAD 标记的任何未处理(缓冲)数据。

      下一个 updatedoFinal 调用的实际输出长度可能小于此方法返回的长度。

      参数:
      inputLen - 输入长度(以字节为单位)
      返回:
      所需的输出缓冲区大小(以字节为单位)
    • engineGetIV

      protected abstract byte[] engineGetIV()
      返回新缓冲区中的初始化向量 (IV)。

      这在基于密码的加密或解密的上下文中很有用,其中 IV 源自用户提供的密码。

      返回:
      新缓冲区中的初始化向量,或者 null 如果算法不使用 IV,或者 IV 尚未设置
    • engineGetParameters

      protected abstract AlgorithmParameters  engineGetParameters()
      返回与此密码一起使用的参数。

      返回的参数可能与用于初始化此密码的参数相同,或者可能包含底层密码实现使用的其他默认或随机参数值。如果未提供所需的参数并且可以由密码生成,则返回生成的参数。否则,返回 null

      返回:
      与此密码一起使用的参数,或 null
    • engineInit

      protected abstract void engineInit(int opmode, Key  key, SecureRandom  random) throws InvalidKeyException
      使用密钥和随机源初始化此 CipherSpi 对象。

      CipherSpi 对象针对以下四种操作之一进行初始化:加密、解密、密钥包装或密钥解包,具体取决于 opmode 的值。

      如果此密码需要任何无法从给定的 key 派生的算法参数,则底层密码实现应该自行生成所需的参数(使用特定于提供者的默认值或随机值),如果它正在为加密或密钥包装进行初始化,并且如果正在初始化解密或密钥解包,则引发 InvalidKeyException。可以使用 engineGetParameters engineGetIV 检索生成的参数(如果参数是 IV)。

      如果此密码需要无法从输入参数派生的算法参数,并且没有合理的特定于提供者的默认值,则初始化必然会失败。

      如果此密码(包括其反馈或填充方案)需要任何随机字节(例如,用于参数生成),它将从 random 中获取它们。

      请注意,当 CipherSpi 对象被初始化时,它会丢失所有先前获得的状态。换句话说,初始化 CipherSpi 对象等同于创建该 CipherSpi 对象的新实例并对其进行初始化。

      参数:
      opmode - 此 CipherSpi 对象的操作模式(这是以下之一:ENCRYPT_MODEDECRYPT_MODEWRAP_MODEUNWRAP_MODE
      key - 加密密钥
      random - 随机源
      抛出:
      InvalidKeyException - 如果给定的密钥不适合初始化此密码,或者需要无法从给定密钥确定的算法参数
      UnsupportedOperationException - 如果 opmodeWRAP_MODEUNWRAP_MODE 未由密码实现
    • engineInit

      protected abstract void engineInit(int opmode, Key  key, AlgorithmParameterSpec  params, SecureRandom  random) throws InvalidKeyException , InvalidAlgorithmParameterException
      使用密钥、一组算法参数和随机源初始化此 CipherSpi 对象。

      CipherSpi 对象针对以下四种操作之一进行初始化:加密、解密、密钥包装或密钥解包,具体取决于 opmode 的值。

      如果此密码需要任何算法参数并且 paramsnull ,则底层密码实现应该在为加密或密钥包装初始化时自行生成所需的参数(使用特定于提供者的默认值或随机值),并引发 InvalidAlgorithmParameterException 如果它正在初始化以进行解密或密钥解包。可以使用 engineGetParameters engineGetIV 检索生成的参数(如果参数是 IV)。

      如果此密码需要无法从输入参数派生的算法参数,并且没有合理的特定于提供者的默认值,则初始化必然会失败。

      如果此密码(包括其反馈或填充方案)需要任何随机字节(例如,用于参数生成),它将从 random 中获取它们。

      请注意,当 CipherSpi 对象被初始化时,它会丢失所有先前获得的状态。换句话说,初始化 CipherSpi 对象等同于创建该 CipherSpi 对象的新实例并对其进行初始化。

      参数:
      opmode - 此 CipherSpi 对象的操作模式(这是以下之一:ENCRYPT_MODEDECRYPT_MODEWRAP_MODEUNWRAP_MODE
      key - 加密密钥
      params - 算法参数
      random - 随机源
      抛出:
      InvalidKeyException - 如果给定的密钥不适合初始化此密码
      InvalidAlgorithmParameterException - 如果给定的算法参数不适合此密码,或者如果此密码需要算法参数并且 paramsnull
      UnsupportedOperationException - 如果 opmodeWRAP_MODEUNWRAP_MODE 未由密码实现
    • engineInit

      protected abstract void engineInit(int opmode, Key  key, AlgorithmParameters  params, SecureRandom  random) throws InvalidKeyException , InvalidAlgorithmParameterException
      使用密钥、一组算法参数和随机源初始化此 CipherSpi 对象。

      CipherSpi 对象针对以下四种操作之一进行初始化:加密、解密、密钥包装或密钥解包,具体取决于 opmode 的值。

      如果此密码需要任何算法参数并且 paramsnull ,则底层密码实现应该在为加密或密钥包装初始化时自行生成所需的参数(使用特定于提供者的默认值或随机值),并引发 InvalidAlgorithmParameterException 如果它正在初始化以进行解密或密钥解包。可以使用 engineGetParameters engineGetIV 检索生成的参数(如果参数是 IV)。

      如果此密码需要无法从输入参数派生的算法参数,并且没有合理的特定于提供者的默认值,则初始化必然会失败。

      如果此密码(包括其反馈或填充方案)需要任何随机字节(例如,用于参数生成),它将从 random 中获取它们。

      请注意,当 CipherSpi 对象被初始化时,它会丢失所有先前获得的状态。换句话说,初始化 CipherSpi 对象等同于创建该 CipherSpi 对象的新实例并对其进行初始化。

      参数:
      opmode - 此 CipherSpi 对象的操作模式(这是以下之一:ENCRYPT_MODEDECRYPT_MODEWRAP_MODEUNWRAP_MODE
      key - 加密密钥
      params - 算法参数
      random - 随机源
      抛出:
      InvalidKeyException - 如果给定的密钥不适合初始化此密码
      InvalidAlgorithmParameterException - 如果给定的算法参数不适合此密码,或者此密码需要算法参数且 params 为空
      UnsupportedOperationException - 如果 opmodeWRAP_MODEUNWRAP_MODE 未由密码实现
    • engineUpdate

      protected abstract byte[] engineUpdate(byte[] input, int inputOffset, int inputLen)
      继续多部分加密或解密操作(取决于此 CipherSpi 对象的初始化方式),处理另一个数据部分。

      处理 input 缓冲区中的前 inputLen 个字节(从 inputOffset 开始),并将结果存储在新缓冲区中。

      参数:
      input - 输入缓冲区
      inputOffset - input 中输入开始的偏移量
      inputLen - 输入长度
      返回:
      带有结果的新缓冲区,或者 null 如果密码是块密码并且输入数据太短而无法生成新块
    • engineUpdate

      protected abstract int engineUpdate(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset) throws ShortBufferException
      继续多部分加密或解密操作(取决于此 CipherSpi 对象的初始化方式),处理另一个数据部分。

      处理 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
      继续多部分加密或解密操作(取决于此 CipherSpi 对象的初始化方式),处理另一个数据部分。

      处理从 input.position() 开始的所有 input.remaining() 字节。结果存储在输出缓冲区中。返回时,输入缓冲区的位置将等于其限制;它的限制不会改变。输出缓冲区的位置将提前 n,其中 n 是此方法返回的值;输出缓冲区的限制不会改变。

      如果 output.remaining() 字节不足以保存结果,则抛出 ShortBufferException

      如果子类可以比字节数组更有效地处理 ByteBuffers,则应考虑重写此方法。

      参数:
      input - 输入字节缓冲区
      output - 输出字节缓冲区
      返回:
      output 中存储的字节数
      抛出:
      ShortBufferException - 如果输出缓冲区空间不足
      NullPointerException - 如果任一参数为 null
      自从:
      1.5
    • engineDoFinal

      protected abstract byte[] engineDoFinal(byte[] input, int inputOffset, int inputLen) throws IllegalBlockSizeException , BadPaddingException
      在单部分操作中加密或解密数据,或完成多部分操作。数据被加密或解密,具体取决于此 CipherSpi 对象的初始化方式。

      input 缓冲区中的第一个 inputLen 字节,从 inputOffset 开始,包括在之前的 update 操作期间可能已经缓冲的任何输入字节,被处理,并应用填充(如果请求)。如果使用AEAD模式(例如GCM或CCM),则在加密的情况下附加认证标签,或在解密的情况下验证。结果存储在一个新的缓冲区中。

      完成后,此方法将此 CipherSpi 对象重置为之前通过调用 engineInit 初始化时所处的状态。也就是说,对象被重置并可用于加密或解密(取决于调用 engineInit 时指定的操作模式)更多数据。

      注意:如果抛出任何异常,这个CipherSpi对象可能需要重置才能再次使用。

      参数:
      input - 输入缓冲区
      inputOffset - input 中输入开始的偏移量
      inputLen - 输入长度
      返回:
      带有结果的新缓冲区
      抛出:
      IllegalBlockSizeException - 如果此密码是块密码,则没有请求填充(仅在加密模式下),并且此密码处理的数据的总输入长度不是块大小的倍数;或者如果此加密算法无法处理提供的输入数据
      BadPaddingException - 如果此 CipherSpi 对象处于解密模式,并且已请求(未)填充,但解密数据不受适当填充字节的限制
      AEADBadTagException - 如果此 CipherSpi 对象正在 AEAD 模式(例如 GCM 或 CCM)中解密,并且接收到的身份验证标签与计算值不匹配
    • engineDoFinal

      protected abstract int engineDoFinal(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset) throws ShortBufferException , IllegalBlockSizeException , BadPaddingException
      在单部分操作中加密或解密数据,或完成多部分操作。数据被加密或解密,具体取决于此 CipherSpi 对象的初始化方式。

      input 缓冲区中的第一个 inputLen 字节,从 inputOffset 开始,包括在之前的 update 操作期间可能已经缓冲的任何输入字节,被处理,并应用填充(如果请求)。如果使用了AEAD模式,例如GCM或CCM,则在加密的情况下附加认证标签,或者在解密的情况下验证认证标签。结果存储在 output 缓冲区中,从 outputOffset 开始(含)。

      如果 output 缓冲区太小而无法保存结果,则会抛出 ShortBufferException

      完成后,此方法将此 CipherSpi 对象重置为之前通过调用 engineInit 初始化时所处的状态。也就是说,对象被重置并可用于加密或解密(取决于调用 engineInit 时指定的操作模式)更多数据。

      注意:如果抛出任何异常,这个CipherSpi对象可能需要重置才能再次使用。

      参数:
      input - 输入缓冲区
      inputOffset - input 中输入开始的偏移量
      inputLen - 输入长度
      output - 结果的缓冲区
      outputOffset - output 中存储结果的偏移量
      返回:
      output 中存储的字节数
      抛出:
      IllegalBlockSizeException - 如果此密码是块密码,则没有请求填充(仅在加密模式下),并且此密码处理的数据的总输入长度不是块大小的倍数;或者如果此加密算法无法处理提供的输入数据
      ShortBufferException - 如果给定的输出缓冲区太小而无法保存结果
      BadPaddingException - 如果此 CipherSpi 对象处于解密模式,并且已请求(未)填充,但解密数据不受适当填充字节的限制
      AEADBadTagException - 如果此 CipherSpi 对象正在 AEAD 模式(例如 GCM 或 CCM)中解密,并且接收到的身份验证标签与计算值不匹配
    • engineDoFinal

      protected int engineDoFinal(ByteBuffer  input, ByteBuffer  output) throws ShortBufferException , IllegalBlockSizeException , BadPaddingException
      在单部分操作中加密或解密数据,或完成多部分操作。数据被加密或解密,具体取决于此 CipherSpi 对象的初始化方式。

      处理从 input.position() 开始的所有 input.remaining() 字节。如果使用了AEAD模式,例如GCM或CCM,则在加密的情况下附加认证标签,或者在解密的情况下验证认证标签。结果存储在输出缓冲区中。返回时,输入缓冲区的位置将等于其限制;它的限制不会改变。输出缓冲区的位置将提前 n,其中 n 是此方法返回的值;输出缓冲区的限制不会改变。

      如果 output.remaining() 字节不足以保存结果,则抛出 ShortBufferException

      完成后,此方法将此 CipherSpi 对象重置为之前通过调用 engineInit 初始化时所处的状态。也就是说,对象被重置并可用于加密或解密(取决于在调用 engineInit 更多数据时指定的操作模式。

      注意:如果抛出任何异常,这个CipherSpi对象可能需要重置才能再次使用。

      如果子类可以比字节数组更有效地处理 ByteBuffers,则应考虑重写此方法。

      参数:
      input - 输入字节缓冲区
      output - 输出字节缓冲区
      返回:
      output 中存储的字节数
      抛出:
      IllegalBlockSizeException - 如果此密码是块密码,则没有请求填充(仅在加密模式下),并且此密码处理的数据的总输入长度不是块大小的倍数;或者如果此加密算法无法处理提供的输入数据
      ShortBufferException - 如果输出缓冲区空间不足
      BadPaddingException - 如果此 CipherSpi 对象处于解密模式,并且已请求(未)填充,但解密数据不受适当填充字节的限制
      AEADBadTagException - 如果此 CipherSpi 对象正在 AEAD 模式(例如 GCM 或 CCM)中解密,并且接收到的身份验证标签与计算值不匹配
      NullPointerException - 如果任一参数为 null
      自从:
      1.5
    • engineWrap

      protected byte[] engineWrap(Key  key) throws IllegalBlockSizeException , InvalidKeyException
      包裹一把钥匙。

      此具体方法已添加到此先前定义的抽象类中。 (为了向后兼容,它不能是抽象的。)它可能被提供者覆盖以包装密钥。如果无法包装给定的密钥,则此类覆盖预计会抛出 IllegalBlockSizeExceptionInvalidKeyException(在指定情况下)。如果此方法未被覆盖,它总是抛出一个 UnsupportedOperationException

      参数:
      key - 要包装的密钥
      返回:
      包裹的key
      抛出:
      IllegalBlockSizeException - 如果此密码是块密码,则未请求填充,并且要包装的密钥的编码长度不是块大小的倍数
      InvalidKeyException - 如果用此密码包装密钥是不可能或不安全的(例如,硬件保护密钥正在传递给纯软件密码)
      UnsupportedOperationException - 如果不支持此方法
    • 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 不代表 wrappedKeyAlgorithmwrappedKeyType 类型的包装密钥
      UnsupportedOperationException - 如果不支持此方法
    • engineGetKeySize

      protected int engineGetKeySize(Key  key) throws InvalidKeyException
      以位为单位返回给定密钥对象的密钥大小。

      此具体方法已添加到此先前定义的抽象类中。如果它没有被提供者覆盖,它会抛出一个 UnsupportedOperationException

      参数:
      key - 关键对象
      返回:
      给定键对象的键大小
      抛出:
      InvalidKeyException - 如果 key 无效
    • engineUpdateAAD

      protected void engineUpdateAAD(byte[] src, int offset, int len)
      使用提供的缓冲区的子集继续附加身份验证数据 (AAD) 的多部分更新。

      在 AEAD(GCM 或 CCM)等模式下运行时,调用此方法可为密码提供 AAD。如果此密码在 GCM 或 CCM 模式下运行,则必须在开始对密文进行操作之前提供所有 AAD(通过 updatedoFinal 方法)。

      参数:
      src - 包含 AAD 的缓冲区
      offset - src 中 AAD 输入开始的偏移量
      len - AAD 字节数
      抛出:
      IllegalStateException - 如果此 CipherSpi 对象处于错误状态(例如,尚未初始化),不接受 AAD,或者如果在 GCM 或 CCM 模式下运行并且已调用其中一种 update 方法进行活动加密/解密手术
      UnsupportedOperationException - 如果此方法未被实现覆盖
      自从:
      1.7
    • engineUpdateAAD

      protected void engineUpdateAAD(ByteBuffer  src)
      继续附加身份验证数据 (AAD) 的多部分更新。

      在 AEAD(GCM 或 CCM)等模式下运行时,调用此方法可为密码提供 AAD。如果此密码在 GCM 或 CCM 模式下运行,则必须在开始对密文进行操作之前提供所有 AAD(通过 updatedoFinal 方法)。

      处理从 src.position() 开始的所有 src.remaining() 字节。返回时,输入缓冲区的位置将等于其限制;它的限制不会改变。

      参数:
      src - 包含 AAD 的缓冲区
      抛出:
      IllegalStateException - 如果此 CipherSpi 对象处于错误状态(例如,尚未初始化),不接受 AAD,或者如果在 GCM 或 CCM 模式下运行并且已调用其中一种 update 方法进行活动加密/解密手术
      UnsupportedOperationException - 如果此方法未被实现覆盖
      自从:
      1.7