Module java.base
Package javax.crypto

Class CipherSpi

java.lang.Object
javax.crypto.CipherSpi

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

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

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

一个转换的形式为:

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

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

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

一个提供者可以为每个 算法/模式/填充 组合提供一个单独的类,或者决定提供更通用的类,表示对应于 算法算法/模式算法//填充 的子转换,这种情况下,请求的模式和/或填充由 CiphergetInstance 方法自动设置,该方法调用提供者的 CipherSpi 子类的 engineSetModeengineSetPadding 方法。

提供者主类中的 Cipher 属性可能具有以下格式:

  •      // 提供者的 "CipherSpi" 子类实现了 "algName",带有可插拔的模式和填充
         Cipher.algName
     
  •      // 提供者的 "CipherSpi" 子类实现了指定 "mode" 中的 "algName",带有可插拔的填充
         Cipher.algName/mode
     
  •      // 提供者的 "CipherSpi" 子类实现了 "algName" 中的指定 "padding",带有可插拔的模式
         Cipher.algName//padding
     
  •      // 提供者的 "CipherSpi" 子类实现了指定 "mode" 和 "padding" 中的 "algName"
         Cipher.algName/mode/padding
     

例如,一个提供者可以为 AES/ECB/PKCS5Padding 实现一个 CipherSpi 子类,为 AES/CBC/PKCS5Padding 实现一个,为 AES/CFB/PKCS5Padding 实现一个,还为 AES/OFB/PKCS5Padding 实现一个。该提供者在其主类中将具有以下 Cipher 属性:

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

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

  •      Cipher.AES
     

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

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

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

    如果答案是 NO,则抛出 NoSuchAlgorithmException 异常。

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

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

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

    如果答案是 NO,则转到下一步。

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

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

    如果答案是 NO,则转到下一步。

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

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

    如果答案是 NO,则转到下一步。

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

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

    如果答案是 NO,则抛出 NoSuchAlgorithmException 异常。

自 JDK 版本:
1.4
参见:
  • Constructor Summary

    Constructors
    Constructor
    Description
    子类调用的构造函数。
  • Method Summary

    Modifier and Type
    Method
    Description
    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)
    返回输出缓冲区需要的长度(以字节为单位),以便容纳下一个 updatedoFinal 操作的结果,给定输入长度 inputLen(以字节为单位)。
    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[]
    engineWrap(Key key)
    包装一个密钥。

    Methods declared in class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

    • CipherSpi

      public CipherSpi()
      子类调用的构造函数。
  • Method Details

    • 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)
      返回输出缓冲区需要的长度(以字节为单位),以便容纳下一个 updatedoFinal 操作的结果,给定输入长度 inputLen(以字节为单位)。

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

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

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

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

      这在基于密码的加密或解密的情况下很有用,其中 IV 是从用户提供的口令派生的。

      返回:
      初始化向量在新缓冲区中,如果算法不使用 IV,或者 IV 尚未设置,则返回 null
    • 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。生成的参数可以使用engineGetParametersengineGetIV()(如果参数是IV)来检索。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      参数:
      input - 输入缓冲区
      inputOffset - 输入开始的偏移量
      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 - 输入开始的偏移量
      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

      如果输出缓冲区的空间不足以容纳结果,子类应考虑重写此方法,以便可以比使用字节数组更有效地处理ByteBuffer。

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

      protected abstract byte[] engineDoFinal(byte[] input, int inputOffset, int inputLen) throws IllegalBlockSizeException, BadPaddingException
      单部操作中加密或解密数据,或完成多部操作。数据根据此 CipherSpi 对象的初始化方式进行加密或解密。

      处理 input 缓冲区中从 inputOffset 开始的前 inputLen 字节,以及可能在先前的 update 操作期间缓冲的任何输入字节,应用填充(如果请求)。如果正在使用 AEAD 模式(如 GCM 或 CCM),则在加密时附加认证标签,在解密时验证认证标签。结果存储在一个新的缓冲区中。

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

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

      参数:
      input - 输入缓冲区
      inputOffset - 输入开始的偏移量
      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 缓冲区中从 inputOffset 开始的前 inputLen 字节,以及可能在先前的 update 操作期间缓冲的任何输入字节,应用填充(如果请求)。如果正在使用 AEAD 模式(如 GCM 或 CCM),则在加密时附加认证标签,在解密时验证认证标签。结果存储在从 outputOffset 开始的 output 缓冲区中。

      如果 output 缓冲区不足以容纳结果,则会抛出 ShortBufferException

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

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

      参数:
      input - 输入缓冲区
      inputOffset - 输入开始的偏移量
      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 对象才能再次使用。

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

      参数:
      input - 输入 ByteBuffer
      output - 输出 ByteBuffer
      返回:
      存储在 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 - 要包装的密钥
      返回:
      包装后的密钥
      抛出:
      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 - 如果没有安装的提供程序可以为 wrappedKeyAlgorithmwrappedKeyType 类型创建密钥
      InvalidKeyException - 如果 wrappedKey 不代表 wrappedKeyType 类型的包装密钥,用于 wrappedKeyAlgorithm
      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模式运行,则必须在开始对密文进行操作(通过updatedoFinal方法)之前提供所有AAD。

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

      protected void engineUpdateAAD(ByteBuffer src)
      继续对附加认证数据(AAD)进行多部分更新。

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

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

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