Module  java.base
软件包  javax.crypto

Class CipherSpi



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

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

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

    转换形式如下:

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

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

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

    提供者可以为算法/模式/填充的每个组合提供单独的类,或者可以决定提供表示对应于算法算法/模式算法//填充 (注意双斜杠)的子变换的更多通用类,其中情况下所请求模式和/或填充由自动设定getInstance的方法Cipher ,其调用engineSetModeengineSetPadding的提供者的子类的方法CipherSpi

    提供者主类中的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实现DES / ECB / PKCS5Padding,一个实现DES / CBC / PKCS5Padding,一个实现DES / CFB / PKCS5Padding,和又一一个实现DES / OFB / PKCS5Padding。 该提供商将在其主类中具有以下Cipher属性:

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

    另一个提供者可以针对上述各种模式实现一个类(即,一个用于ECB的类,一个用于CBC ,一个用于CBC ,一个用于CFB ,另一个用于OFB ),一个类用于PKCS5Padding ,以及一个通用的DES类,分类为CipherSpi 该提供商在其主类中将具有以下Cipher属性:

    •   Cipher.DES 

    Cipher引擎类的getInstance工厂方法遵循这些规则,以便实例化一个提供者的CipherSpi的实现,用于“ 算法 ”形式的转换:

    1. 检查提供者是否已经为指定的“ 算法 ”注册了一个CipherSpi的子类。

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

      如果答案是否定的,扔一个NoSuchAlgorithmException例外。

    Cipher引擎类的getInstance工厂方法遵循这些规则,以便实例化一个供应商的CipherSpi的实现,用于“ algorithm / mode / padding ”形式的转换:

    1. 检查提供者是否已经为指定的“ algorithm / mode / padding ”转换注册了一个CipherSpi的子类。

      如果答案为YES,则将其实例化。

      如果答案为否,请转到下一步。

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

      如果答案为YES,则将其实例化,并在新实例上调用engineSetPadding(padding)

      如果答案为否,请转到下一步。

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

      如果答案为YES,则将其实例化,并在新实例上调用engineSetMode(mode)

      如果答案为否,请转到下一步。

    4. 检查提供者是否已经为子转换“ 算法 ”注册了一个CipherSpi的子类。

      如果答案为YES,则将其实例化,并在新实例上调用engineSetMode(mode)engineSetPadding(padding)

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

    从以下版本开始:
    1.4
    另请参见:
    KeyGeneratorSecretKey
    • 构造方法摘要

      构造方法  
      Constructor 描述
      CipherSpi​()  
    • 方法摘要

      所有方法  接口方法  抽象方法  具体的方法 
      Modifier and Type 方法 描述
      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​()
      返回与此密码一起使用的参数。
      protected abstract void engineInit​(int opmode, Key key, AlgorithmParameters params, SecureRandom random)
      使用密钥,一组算法参数和随机源初始化此密码。
      protected abstract void engineInit​(int opmode, Key key, SecureRandom random)
      用密钥和随机源初始化此密码。
      protected abstract void engineInit​(int opmode, Key key, AlgorithmParameterSpec params, SecureRandom random)
      使用密钥,一组算法参数和随机源初始化此密码。
      protected abstract void engineSetMode​(String mode)
      设置此密码的模式。
      protected abstract void engineSetPadding​(String padding)
      设置这个密码的填充机制。
      protected Key engineUnwrap​(byte[] wrappedKey, String wrappedKeyAlgorithm, int wrappedKeyType)
      打开以前包装的钥匙。
      protected abstract byte[] engineUpdate​(byte[] input, int inputOffset, int inputLen)
      继续进行多部分加密或解密操作(取决于如何初始化该密码),处理另一个数据部分。
      protected abstract int engineUpdate​(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset)
      继续进行多部分加密或解密操作(取决于如何初始化该密码),处理另一个数据部分。
      protected int engineUpdate​(ByteBuffer input, ByteBuffer output)
      继续进行多部分加密或解密操作(取决于如何初始化该密码),处理另一个数据部分。
      protected void engineUpdateAAD​(byte[] src, int offset, int len)
      使用所提供的缓冲区的子集,继续进行附加认证数据(AAD)的多部分更新。
      protected void engineUpdateAAD​(ByteBuffer src)
      继续进行附加认证数据(AAD)的多部分更新。
      protected byte[] engineWrap​(Key key)
      包裹钥匙
    • 构造方法详细信息

      • CipherSpi

        public CipherSpi​()
    • 方法详细信息

      • 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是从用户提供的密码短语导出的。

        结果
        新缓冲区中的初始化向量,如果底层算法不使用IV,或者如果IV尚未设置,则为null。
      • engineGetParameters

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

        返回的参数可能与用于初始化此密码的参数相同,或者如果该密码需要算法参数但未被任何初始化,则可能包含底层密码实现使用的默认值和随机参数值的组合。

        结果
        与此密码一起使用的参数,如果此密码不使用任何参数,则为null。
      • engineInit

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

        根据opmode的值,对以下四个操作之一进行密码初始化:加密,解密,密钥包装或密钥解opmode

        如果此密码需要不能从给定的key导出的任何算法参数,则底层的密码实现应该自动生成所需的参数(使用提供者特定的默认值或随机值),如果它被初始化为加密或密钥包装,以及提出一个InvalidKeyException如果它被初始化解密或密钥解包。 可以使用engineGetParametersengineGetIV (如果参数为IV)检索生成的参数。

        如果该密码需要不能从输入参数导出的算法参数,并且没有合理的提供者特定的默认值,则初始化必然会失败。

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

        请注意,当一个Cipher对象被初始化时,它将失去所有先前获取的状态。 换句话说,初始化一个Cipher相当于创建一个新的Cipher实例并对其进行初始化。

        参数
        opmode -此cipher的操作模式(这是下列之一: 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
        使用密钥,一组算法参数和随机源初始化此密码。

        根据opmode的值,密码被初始化为以下四个操作之一:加密,解密,密钥包装或密钥解opmode

        如果此密码需要任何算法参数,并且params为null,则底层加密实现应该自动生成所需参数(使用提供者特定的默认值或随机值),如果它被初始化为加密或密钥包装,并且提出一个InvalidAlgorithmParameterException if正在为解密或密钥解包进行初始化。 生成的参数可以使用engineGetParametersengineGetIV (如果参数为IV)检索。

        如果该密码需要不能从输入参数导出的算法参数,并且没有合理的提供者特定的默认值,则初始化必然会失败。

        如果这个密码(包括其底层反馈或填充方案)需要任何随机字节(例如,用于参数生成),它将从random得到它们。

        请注意,当一个Cipher对象被初始化时,它将失去所有先前获取的状态。 换句话说,初始化一个Cipher相当于创建一个新的Cipher实例并对其进行初始化。

        参数
        opmode -此cipher的操作模式(这是下列之一: ENCRYPT_MODEDECRYPT_MODEWRAP_MODEUNWRAP_MODE
        key - 加密密钥
        params - 算法参数
        random - 随机性的来源
        异常
        InvalidKeyException - 如果给定的密钥不适合初始化此密码
        InvalidAlgorithmParameterException - 如果给定的算法参数不适合该密码,或者该密码需要算法参数,并且 params为空。
        UnsupportedOperationException - 如果 opmodeWRAP_MODEUNWRAP_MODE未被密码实现。
      • engineInit

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

        根据opmode的值,密码被初始化为以下四个操作之一:加密,解密,密钥包装或密钥解opmode

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

        如果该密码需要不能从输入参数导出的算法参数,并且没有合理的提供者特定的默认值,则初始化必然会失败。

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

        请注意,当一个Cipher对象被初始化时,它将失去所有先前获取的状态。 换句话说,初始化一个Cipher相当于创建一个新的Cipher实例并对其进行初始化。

        参数
        opmode -此cipher的操作模式(这是下列之一: 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)
        继续进行多部分加密或解密操作(取决于如何初始化该密码),处理另一个数据部分。

        第一inputLen字节在input缓冲区中,从inputOffset以下,被处理,并且结果被存储在新的缓冲器。

        参数
        input - 输入缓冲区
        inputOffset - input中的输入开始的偏移量
        inputLen - 输入长度
        结果
        具有结果的新缓冲区,如果底层密码是块密码,并且输入数据太短,导致新的块,则为null。
      • engineUpdate

        protected abstract int engineUpdate​(byte[] input,
                                            int inputOffset,
                                            int inputLen,
                                            byte[] output,
                                            int outputOffset)
                                     throws ShortBufferException
        继续进行多部分加密或解密操作(取决于如何初始化该密码),处理另一个数据部分。

        第一inputLen字节在input缓冲区中,从inputOffset以下,被处理,并且结果被存储在output缓冲区中,从outputOffset以下。

        如果output缓冲区太小而不能保存结果,则抛出一个ShortBufferException

        参数
        input - 输入缓冲区
        inputOffset - input中的输入开始的偏移量
        inputLen - 输入长度
        output - 结果的缓冲区
        outputOffset - output中存储结果的偏移量
        结果
        output存储的字节数
        异常
        ShortBufferException - 如果给定的输出缓冲区太小,不能保存结果
      • engineUpdate

        protected int engineUpdate​(ByteBuffer input,
                                   ByteBuffer output)
                            throws ShortBufferException
        继续进行多部分加密或解密操作(取决于如何初始化该密码),处理另一个数据部分。

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

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

        子类应该考虑覆盖此方法,如果它们可以比字节数组更有效地处理ByteBuffers。

        参数
        input - 输入ByteBuffer
        output - 输出ByteByffer
        结果
        output存储的字节数
        异常
        ShortBufferException - 如果输出缓冲区中没有足够的空间
        NullPointerException - 如果任一参数是 null
        从以下版本开始:
        1.5
      • engineDoFinal

        protected abstract byte[] engineDoFinal​(byte[] input,
                                                int inputOffset,
                                                int inputLen)
                                         throws IllegalBlockSizeException,
                                                BadPaddingException
        在单一部分操作中加密或解密数据,或完成多部分操作。 数据被加密或解密,这取决于这个密码如何初始化。

        第一inputLen字节在input缓冲区中,从inputOffset以下,并且可能在上一次期间已缓存的任何输入字节update操作,进行处理,填充(如果要求)被施加。 如果正在使用诸如GCM / CCM的AEAD模式,则在加密的情况下附加认证标签,或者在解密的情况下验证认证标签。 结果存储在一个新的缓冲区。

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

        注意:如果发生任何异常,则可能需要重新设置此密码对象,然后才能再次使用。

        参数
        input - 输入缓冲区
        inputOffset - input中的输入开始的偏移量
        inputLen - 输入长度
        结果
        新的缓冲区结果
        异常
        IllegalBlockSizeException - 如果该密码是块密码,则不会请求填充(仅在加密模式下),并且由该密码处理的数据的总输入长度不是块大小的倍数; 或者如果此加密算法无法处理提供的输入数据。
        BadPaddingException - 如果该密码处于解密模式,并且已经请求了(un)填充,但是解密的数据不受适当的填充字节的限制
        AEADBadTagException - 如果该密码在AEAD模式(例如GCM / CCM)中解密,并且接收的认证标签与计算值不匹配
      • engineDoFinal

        protected abstract int engineDoFinal​(byte[] input,
                                             int inputOffset,
                                             int inputLen,
                                             byte[] output,
                                             int outputOffset)
                                      throws ShortBufferException,
                                             IllegalBlockSizeException,
                                             BadPaddingException
        在单一部分操作中加密或解密数据,或完成多部分操作。 数据被加密或解密,这取决于这个密码如何初始化。

        第一inputLen字节在input缓冲区中,从inputOffset以下,并且可能在上一次期间已缓存的任何输入字节update操作,进行处理,填充(如果要求)被施加。 如果正在使用诸如GCM / CCM的AEAD模式,则在加密的情况下附加认证标签,或者在解密的情况下验证认证标签。 结果存储在output缓冲区中,从outputOffset开始。

        如果output缓冲区太小而不能保存结果,则抛出一个ShortBufferException

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

        注意:如果发生任何异常,则可能需要重新设置此密码对象,然后才能再次使用。

        参数
        input - 输入缓冲区
        inputOffset - input中的输入开始的偏移量
        inputLen - 输入长度
        output - 结果的缓冲区
        outputOffset - 其中存储结果的偏移量为 output
        结果
        output存储的字节数
        异常
        IllegalBlockSizeException - 如果该密码是块密码,则不会请求填充(仅在加密模式下),并且由该密码处理的数据的总输入长度不是块大小的倍数; 或者如果此加密算法无法处理提供的输入数据。
        ShortBufferException - 如果给定的输出缓冲区太小,不能保存结果
        BadPaddingException - 如果该密码处于解密模式,并且已经请求了(un)填充,但是解密的数据不受适当的填充字节的限制
        AEADBadTagException - 如果该密码在AEAD模式(例如GCM / CCM)中解密,并且接收到的认证标签与计算值不匹配
      • engineDoFinal

        protected int engineDoFinal​(ByteBuffer input,
                                    ByteBuffer output)
                             throws ShortBufferException,
                                    IllegalBlockSizeException,
                                    BadPaddingException
        在单一部分操作中加密或解密数据,或完成多部分操作。 数据被加密或解密,这取决于这个密码如何初始化。

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

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

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

        注意:如果发生任何异常,则可能需要重新设置此密码对象,然后才能再次使用。

        子类应该考虑覆盖此方法,如果它们可以比字节数组更有效地处理ByteBuffers。

        参数
        input - 输入ByteBuffer
        output - 输出ByteByffer
        结果
        output存储的字节数
        异常
        IllegalBlockSizeException - 如果该密码是块密码,则不会请求填充(仅在加密模式下),并且由该密码处理的数据的总输入长度不是块大小的倍数; 或者如果此加密算法无法处理提供的输入数据。
        ShortBufferException - 如果输出缓冲区中没有足够的空间
        BadPaddingException - 如果该密码处于解密模式,并且已经请求了(un)填充,但解密的数据不受适当的填充字节的限制
        AEADBadTagException - 如果该密码在AEAD模式(例如GCM / CCM)中解密,并且接收到的认证标签与计算值不匹配
        NullPointerException - 如果任一参数是 null
        从以下版本开始:
        1.5
      • engineWrap

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

        这个具体的方法已经添加到这个以前定义的抽象类中。 (为了向后兼容,它不能是抽象的。)提供者可以覆盖它来包装密钥。 如果给定的键无法被包装,这样的覆盖应该会引发IllegalBlockSizeException或InvalidKeyException(在指定的情况下)。 如果此方法未被覆盖,则会始终抛出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_KEY ,或PUBLIC_KEY
        结果
        展开的钥匙。
        异常
        NoSuchAlgorithmException - 如果没有安装的提供商可以为 wrappedKeyType创建类型为 wrappedKeyTypewrappedKeyAlgorithm
        InvalidKeyException - 如果 wrappedKey不表示 wrappedKeyTypewrappedKeyAlgorithm类型的包裹密钥。
        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 - 偏移量在 src ,其中AAD输入开始
        len - AAD字节数
        异常
        IllegalStateException - 如果此密码处于错误状态(例如,尚未初始化),则不接受AAD,或者在GCM或CCM模式下运行,并且已经为 update方法之一调用了主动加密/解密操作
        UnsupportedOperationException - 如果此方法尚未被实现覆盖
        从以下版本开始:
        1.7
      • engineUpdateAAD

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

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

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

        参数
        src - 包含AAD的缓冲区
        异常
        IllegalStateException - 如果此密码处于错误状态(例如,尚未初始化),则不接受AAD,或者如果以GCM或CCM模式运行,并且 update方法之一已经被用于主动加密/解密操作
        UnsupportedOperationException - 如果此方法尚未被实现覆盖
        从以下版本开始:
        1.7