Module java.base
Package javax.crypto

Class Cipher

java.lang.Object
javax.crypto.Cipher
直接已知的子类:
NullCipher

public class Cipher extends Object
该类提供了加密和解密的加密密码功能。它构成了Java Cryptographic Extension (JCE)框架的核心。

为了创建一个Cipher对象,应用程序调用密码的getInstance方法,并将请求的转换的名称传递给它。可选地,可以指定提供程序的名称。

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

一个转换的形式为:

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

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

     Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
 
使用诸如CFBOFB的模式,分组密码可以以小于密码实际块大小的单位加密数据。当请求这种模式时,可以选择指定要一次处理的位数,方法是将此数字附加到模式名称中,如"AES/CFB8/NoPadding"和"AES/OFB32/PKCS5Padding"转换所示。如果未指定此类数字,则使用提供程序特定的默认值。 (请参阅JDK提供程序文档以获取JDK提供程序默认值。) 因此,通过使用8位模式(如CFB8或OFB8),分组密码可以转换为面向字节的流密码。

诸如带有相关数据的认证加密(AEAD)的模式为机密数据和未加密的附加相关数据(AAD)提供真实性保证。 (请参阅 RFC 5116 以获取有关AEAD和AAD算法(如GCM/CCM)的更多信息。) 在计算认证标签(类似于Mac)时,可以使用机密数据和AAD数据。此标签在加密期间附加到密文上,并在解密期间进行验证。

诸如GCM/CCM的AEAD模式在开始处理密文真实性计算之前执行所有AAD真实性计算。为了避免实现必须在内部缓冲密文,所有AAD数据必须提供给GCM/CCM实现(通过updateAAD方法)处理密文(通过updatedoFinal方法)之前。

请注意,GCM模式对使用给定密钥进行加密的IV具有唯一性要求。当IV在GCM加密中重复使用时,此类用法容易受到伪造攻击。因此,在使用GCM模式进行每次加密操作后,调用者应重新初始化具有不同IV值的Cipher对象。

     GCMParameterSpec s = ...;
     cipher.init(..., s);

     // 如果GCM参数由提供程序生成,可以通过以下方式检索:
     // cipher.getParameters().getParameterSpec(GCMParameterSpec.class);

     cipher.updateAAD(...);  // AAD
     cipher.update(...);     // 多部分更新
     cipher.doFinal(...);    // 操作的结束

     // 对每次加密使用不同的IV值
     byte[] newIv = ...;
     s = new GCMParameterSpec(s.getTLen(), newIv);
     cipher.init(..., s);
     ...

 
ChaCha20和ChaCha20-Poly1305算法对具有给定密钥的唯一性nonce具有类似要求。在每次加密或解密操作之后,调用者应使用指定不同nonce值的参数重新初始化其ChaCha20或ChaCha20-Poly1305密码。请参阅RFC 7539以获取有关ChaCha20和ChaCha20-Poly1305算法的更多信息。

Java平台的每个实现都必须支持以下标准Cipher对象转换,其中括号中是密钥大小:

  • AES/CBC/NoPadding (128)
  • AES/CBC/PKCS5Padding (128)
  • AES/ECB/NoPadding (128)
  • AES/ECB/PKCS5Padding (128)
  • AES/GCM/NoPadding (128)
  • DESede/CBC/NoPadding (168)
  • DESede/CBC/PKCS5Padding (168)
  • DESede/ECB/NoPadding (168)
  • DESede/ECB/PKCS5Padding (168)
  • RSA/ECB/PKCS1Padding (1024, 2048)
  • RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024, 2048)
  • RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024, 2048)
这些转换在Java安全标准算法名称规范的Cipher部分中进行了描述。请查阅您的实现的发布文档,以查看是否支持其他转换。
自从:
1.4
参见:
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final int
    用于将密码初始化为解密模式的常量。
    static final int
    用于将密码初始化为加密模式的常量。
    static final int
    用于指示要解包的密钥是“私钥”的常量。
    static final int
    用于指示要解包的密钥是“公钥”的常量。
    static final int
    用于指示要解包的密钥是“秘密密钥”的常量。
    static final int
    用于将密码初始化为密钥解包模式的常量。
    static final int
    用于将密码初始化为密钥包装模式的常量。
  • Constructor Summary

    Constructors
    Modifier
    Constructor
    Description
    protected
    Cipher(CipherSpi cipherSpi, Provider provider, String transformation)
    创建一个Cipher对象。
  • Method Summary

    Modifier and Type
    Method
    Description
    final byte[]
    完成多部分加密或解密操作,具体取决于此Cipher对象的初始化方式。
    final byte[]
    doFinal(byte[] input)
    在单部分操作中加密或解密数据,或完成多部分操作。
    final int
    doFinal(byte[] output, int outputOffset)
    完成多部分加密或解密操作,具体取决于此Cipher对象的初始化方式。
    final byte[]
    doFinal(byte[] input, int inputOffset, int inputLen)
    在单部分操作中加密或解密数据,或完成多部分操作。
    final int
    doFinal(byte[] input, int inputOffset, int inputLen, byte[] output)
    在单部分操作中加密或解密数据,或完成多部分操作。
    final int
    doFinal(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset)
    在单部分操作中加密或解密数据,或完成多部分操作。
    final int
    doFinal(ByteBuffer input, ByteBuffer output)
    在单部分操作中加密或解密数据,或完成多部分操作。
    final String
    返回此Cipher对象的算法名称。
    final int
    返回块大小(以字节为单位)。
    返回与此Cipher对象一起使用的豁免机制对象。
    static final Cipher
    getInstance(String transformation)
    返回实现指定转换的Cipher对象。
    static final Cipher
    getInstance(String transformation, String provider)
    返回实现指定转换的Cipher对象。
    static final Cipher
    getInstance(String transformation, Provider provider)
    返回实现指定转换的Cipher对象。
    final byte[]
    getIV()
    在新缓冲区中返回初始化向量(IV)。
    static final int
    getMaxAllowedKeyLength(String transformation)
    根据已安装的JCE管辖政策文件,返回指定转换的最大密钥长度。
    static final AlgorithmParameterSpec
    返回包含根据管辖政策文件的最大Cipher参数值的AlgorithmParameterSpec对象。
    final int
    getOutputSize(int inputLen)
    返回输出缓冲区需要的字节长度,以便容纳下一个updatedoFinal操作的结果,给定输入长度inputLen(以字节为单位)。
    返回与此Cipher对象一起使用的参数。
    final Provider
    返回此Cipher对象的提供程序。
    final void
    init(int opmode, Certificate certificate)
    使用给定证书的公钥初始化此Cipher对象。
    final void
    init(int opmode, Certificate certificate, SecureRandom random)
    使用给定证书的公钥和随机源初始化此Cipher对象。
    final void
    init(int opmode, Key key)
    使用密钥初始化此Cipher对象。
    final void
    init(int opmode, Key key, AlgorithmParameters params)
    使用密钥和一组算法参数初始化此Cipher对象。
    final void
    init(int opmode, Key key, AlgorithmParameters params, SecureRandom random)
    使用密钥、一组算法参数和随机源初始化此Cipher对象。
    final void
    init(int opmode, Key key, SecureRandom random)
    使用密钥和随机源初始化此Cipher对象。
    final void
    init(int opmode, Key key, AlgorithmParameterSpec params)
    使用密钥和一组算法参数初始化此Cipher对象。
    final void
    init(int opmode, Key key, AlgorithmParameterSpec params, SecureRandom random)
    使用密钥、一组算法参数和随机源初始化此Cipher对象。
    返回此Cipher对象的String表示形式。
    final Key
    unwrap(byte[] wrappedKey, String wrappedKeyAlgorithm, int wrappedKeyType)
    解包先前包装的密钥。
    final byte[]
    update(byte[] input)
    继续多部分加密或解密操作(具体取决于此Cipher对象的初始化方式),处理另一个数据部分。
    final byte[]
    update(byte[] input, int inputOffset, int inputLen)
    继续多部分加密或解密操作(具体取决于此Cipher对象的初始化方式),处理另一个数据部分。
    final int
    update(byte[] input, int inputOffset, int inputLen, byte[] output)
    继续多部分加密或解密操作(具体取决于此Cipher对象的初始化方式),处理另一个数据部分。
    final int
    update(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset)
    继续多部分加密或解密操作(具体取决于此Cipher对象的初始化方式),处理另一个数据部分。
    final int
    update(ByteBuffer input, ByteBuffer output)
    继续多部分加密或解密操作(具体取决于此Cipher对象的初始化方式),处理另一个数据部分。
    final void
    updateAAD(byte[] src)
    继续附加认证数据(AAD)的多部分更新。
    final void
    updateAAD(byte[] src, int offset, int len)
    使用提供的缓冲区的子集继续附加认证数据(AAD)的多部分更新。
    final void
    继续附加认证数据(AAD)的多部分更新。
    final byte[]
    wrap(Key key)
    包装一个密钥。

    Methods declared in class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
  • Field Details

    • ENCRYPT_MODE

      public static final int ENCRYPT_MODE
      用于将密码初始化为加密模式的常量。
      参见:
    • DECRYPT_MODE

      public static final int DECRYPT_MODE
      用于将密码初始化为解密模式的常量。
      参见:
    • WRAP_MODE

      public static final int WRAP_MODE
      用于将密码器初始化为密钥包装模式的常量。
      参见:
    • UNWRAP_MODE

      public static final int UNWRAP_MODE
      用于将密码器初始化为密钥解包模式的常量。
      参见:
    • PUBLIC_KEY

      public static final int PUBLIC_KEY
      用于指示待解包密钥是“公钥”的常量。
      参见:
    • PRIVATE_KEY

      public static final int PRIVATE_KEY
      用于指示待解包密钥是“私钥”的常量。
      参见:
    • SECRET_KEY

      public static final int SECRET_KEY
      用于指示待解包密钥是“秘密密钥”的常量。
      参见:
  • Constructor Details

  • Method Details

    • getInstance

      public static final Cipher getInstance(String transformation) throws NoSuchAlgorithmException, NoSuchPaddingException
      返回一个实现指定转换的Cipher对象。

      此方法遍历已注册的安全提供者列表,从最首选的提供者开始。返回一个新的Cipher对象,封装了第一个支持指定算法的CipherSpi实现的提供者。

      请注意,已注册提供者列表可以通过Security.getProviders()方法检索。

      API注释:
      建议使用完全指定算法、模式和填充的转换。如果不这样做,提供者将使用默认的模式和填充,这可能不符合您应用程序的安全要求。
      实现注释:
      JDK参考实现还使用jdk.security.provider.preferred Security属性来确定指定算法的首选提供者顺序。这可能与Security.getProviders()返回的提供者顺序不同。有关JDK提供者使用的转换默认值,请参阅JDK提供者文档中的Cipher Transformations部分。
      参数:
      transformation - 转换的名称,例如,AES/CBC/PKCS5Padding。有关标准转换名称的信息,请参阅Java安全标准算法名称规范中的Cipher部分。
      返回:
      实现请求转换的Cipher对象
      抛出:
      NoSuchAlgorithmException - 如果transformationnull、空、格式无效,或者没有提供者支持指定算法的CipherSpi实现
      NoSuchPaddingException - 如果transformation包含不可用的填充方案
      参见:
    • getInstance

      public static final Cipher getInstance(String transformation, String provider) throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException
      返回一个实现指定转换的Cipher对象。

      返回一个新的Cipher对象,封装了来自指定提供者的CipherSpi实现。指定的提供者必须在安全提供者列表中注册。

      请注意,已注册提供者列表可以通过Security.getProviders()方法检索。

      API注释:
      建议使用完全指定算法、模式和填充的转换。如果不这样做,提供者将使用默认的模式和填充,这可能不符合您应用程序的安全要求。
      实现注释:
      有关JDK提供者使用的转换默认值,请参阅JDK提供者文档中的Cipher Transformations部分。
      参数:
      transformation - 转换的名称,例如,AES/CBC/PKCS5Padding。有关标准转换名称的信息,请参阅Java安全标准算法名称规范中的Cipher部分。
      provider - 提供者的名称
      返回:
      实现请求转换的Cipher对象
      抛出:
      IllegalArgumentException - 如果providernull或空
      NoSuchAlgorithmException - 如果transformationnull、空、格式无效,或者指定提供者的CipherSpi实现不可用
      NoSuchPaddingException - 如果transformation包含不可用的填充方案
      NoSuchProviderException - 如果指定的提供者未在安全提供者列表中注册
      参见:
    • getInstance

      public static final Cipher getInstance(String transformation, Provider provider) throws NoSuchAlgorithmException, NoSuchPaddingException
      返回一个实现指定转换的Cipher对象。

      返回一个新的Cipher对象,封装了来自指定providerCipherSpi实现。请注意,指定的provider对象不必在提供者列表中注册。

      API注释:
      建议使用完全指定算法、模式和填充的转换。如果不这样做,提供者将使用默认的模式和填充,这可能不符合您应用程序的安全要求。
      实现注释:
      有关JDK提供者使用的转换默认值,请参阅JDK提供者文档中的Cipher Transformations部分。
      参数:
      transformation - 转换的名称,例如,AES/CBC/PKCS5Padding。有关标准转换名称的信息,请参阅Java安全标准算法名称规范中的Cipher部分。
      provider - 提供者
      返回:
      实现请求转换的Cipher对象
      抛出:
      IllegalArgumentException - 如果providernull
      NoSuchAlgorithmException - 如果transformationnull、空、格式无效,或者指定provider对象的CipherSpi实现不可用
      NoSuchPaddingException - 如果transformation包含不可用的填充方案
      参见:
    • getProvider

      public final Provider getProvider()
      返回此Cipher对象的提供者。
      返回:
      Cipher对象的提供者
    • getAlgorithm

      public final String getAlgorithm()
      返回此Cipher对象的算法名称。

      这是在创建此Cipher对象的getInstance调用中指定的名称。

      返回:
      Cipher对象的算法名称
    • getBlockSize

      public final int getBlockSize()
      返回块大小(以字节为单位)。
      返回:
      块大小(以字节为单位),如果此密码器不是块密码,则为0
    • getOutputSize

      public final int getOutputSize(int inputLen)
      返回输出缓冲区需要的长度(以字节为单位),以便容纳下一个updatedoFinal操作的结果,给定输入长度inputLen(以字节为单位)。

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

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

      参数:
      inputLen - 输入长度(以字节为单位)
      返回:
      所需的输出缓冲区大小(以字节为单位)
      抛出:
      IllegalStateException - 如果此Cipher对象处于错误状态(例如,尚未初始化)
    • getIV

      public final byte[] getIV()
      返回一个新缓冲区中的初始化向量(IV)。

      在随机IV被创建的情况下或在基于密码的加密或解密的情况下,其中IV是从用户提供的密码派生的情况下,这是有用的。

      返回:
      初始化向量在新缓冲区中,如果此密码不使用IV,或者IV尚未设置,则返回null
    • getParameters

      public final AlgorithmParameters getParameters()
      返回与此Cipher对象一起使用的参数。

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

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

      public final ExemptionMechanism getExemptionMechanism()
      返回与此Cipher对象一起使用的豁免机制对象。
      返回:
      与此Cipher对象一起使用的豁免机制对象,如果此Cipher对象不使用任何豁免机制,则返回null
    • init

      public final void init(int opmode, Key key) throws InvalidKeyException
      使用密钥初始化此Cipher对象。

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

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

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

      如果此密码(包括其反馈或填充方案)需要任何随机字节(例如,用于参数生成),它将使用安装的提供程序中优先级最高的SecureRandom实现作为随机性来源。 (如果没有安装的提供程序提供SecureRandom的实现,则将使用系统提供的随机性来源。)

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

      参数:
      opmode - 此Cipher对象的操作模式(以下之一:ENCRYPT_MODEDECRYPT_MODEWRAP_MODEUNWRAP_MODE
      key - 密钥
      抛出:
      InvalidKeyException - 如果给定的密钥不适合初始化此密码,或者需要无法从给定密钥确定的算法参数,或者给定密钥的密钥大小超过最大允许的密钥大小(根据配置的司法管辖区策略文件确定)
      UnsupportedOperationException - 如果opmodeWRAP_MODEUNWRAP_MODE,但模式未由底层CipherSpi实现
      InvalidParameterException - 如果opmode不是已识别的值之一
    • init

      public final void init(int opmode, Key key, SecureRandom random) throws InvalidKeyException
      使用密钥和随机性源初始化此Cipher对象。

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

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

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

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

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

      参数:
      opmode - 此Cipher对象的操作模式(以下之一:ENCRYPT_MODEDECRYPT_MODEWRAP_MODEUNWRAP_MODE
      key - 加密密钥
      random - 随机性源
      抛出:
      InvalidKeyException - 如果给定的密钥不适合初始化此密码,或者需要无法从给定密钥确定的算法参数,或者给定密钥的密钥大小超过最大允许的密钥大小(根据配置的司法管辖区策略文件确定)
      UnsupportedOperationException - 如果opmodeWRAP_MODEUNWRAP_MODE,但模式未由底层CipherSpi实现
      InvalidParameterException - 如果opmode不是已识别的值之一
    • init

      public final void init(int opmode, Key key, AlgorithmParameterSpec params) throws InvalidKeyException, InvalidAlgorithmParameterException
      使用密钥和一组算法参数初始化此Cipher对象。

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

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

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

      如果此密码(包括其反馈或填充方案)需要任何随机字节(例如,用于参数生成),它将使用安装的提供程序中优先级最高的SecureRandom实现作为随机性来源。 (如果没有安装的提供程序提供SecureRandom的实现,则将使用系统提供的随机性来源。)

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

      参数:
      opmode - 此Cipher对象的操作模式(以下之一:ENCRYPT_MODEDECRYPT_MODEWRAP_MODEUNWRAP_MODE
      key - 加密密钥
      params - 算法参数
      抛出:
      InvalidKeyException - 如果给定的密钥不适合初始化此密码,或者其密钥大小超过最大允许的密钥大小(根据配置的司法管辖区策略文件确定)
      InvalidAlgorithmParameterException - 如果给定的算法参数不适合此密码,或者此密码需要算法参数并且paramsnull,或者给定的算法参数暗示的加密强度将超过法定限制(根据配置的司法管辖区策略文件确定)
      UnsupportedOperationException - 如果opmodeWRAP_MODEUNWRAP_MODE,但模式未由底层CipherSpi实现
      InvalidParameterException - 如果opmode不是已识别的值之一
    • init

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

      Cipher对象根据opmode的值初始化为以下四种操作之一:加密、解密、密钥包装或密钥解包。

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

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

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

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

      参数:
      opmode - 此Cipher对象的操作模式(以下之一:ENCRYPT_MODEDECRYPT_MODEWRAP_MODEUNWRAP_MODE
      key - 加密密钥
      params - 算法参数
      random - 随机源
      抛出:
      InvalidKeyException - 如果给定的密钥不适合初始化此密码,或其密钥大小超过最大允许的密钥大小(根据配置的司法管辖区策略文件确定)
      InvalidAlgorithmParameterException - 如果给定的算法参数不适合此密码,或此密码需要算法参数且paramsnull,或给定的算法参数暗示的加密强度将超出法定限制(根据配置的司法管辖区策略文件确定)
      UnsupportedOperationException - 如果opmodeWRAP_MODEUNWRAP_MODE,但底层CipherSpi未实现该模式
      InvalidParameterException - 如果opmode不是已识别的值之一
    • init

      public final void init(int opmode, Key key, AlgorithmParameters params) throws InvalidKeyException, InvalidAlgorithmParameterException
      使用密钥和一组算法参数初始化此Cipher对象。

      Cipher对象根据opmode的值初始化为以下四种操作之一:加密、解密、密钥包装或密钥解包。

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

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

      如果此密码(包括其反馈或填充方案)需要任何随机字节(例如,用于参数生成),它将使用安装的提供程序中优先级最高的SecureRandom实现作为随机源。(如果安装的提供程序都不提供SecureRandom的实现,则将使用系统提供的随机源。)

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

      参数:
      opmode - 此Cipher对象的操作模式(以下之一:ENCRYPT_MODEDECRYPT_MODEWRAP_MODEUNWRAP_MODE
      key - 加密密钥
      params - 算法参数
      抛出:
      InvalidKeyException - 如果给定的密钥不适合初始化此密码,或其密钥大小超过最大允许的密钥大小(根据配置的司法管辖区策略文件)。
      InvalidAlgorithmParameterException - 如果给定的算法参数不适合此密码,或此密码需要算法参数且paramsnull,或给定的算法参数暗示的加密强度将超出法定限制(根据配置的司法管辖区策略文件确定)
      UnsupportedOperationException - 如果opmodeWRAP_MODEUNWRAP_MODE,但底层CipherSpi未实现该模式
      InvalidParameterException - 如果opmode不是已识别的值之一
    • init

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

      Cipher对象根据opmode的值初始化为以下四种操作之一:加密、解密、密钥包装或密钥解包。

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

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

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

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

      参数:
      opmode - 此Cipher对象的操作模式(以下之一:ENCRYPT_MODEDECRYPT_MODEWRAP_MODEUNWRAP_MODE
      key - 加密密钥
      params - 算法参数
      random - 随机源
      抛出:
      InvalidKeyException - 如果给定的密钥不适合初始化此密码,或其密钥大小超过最大允许的密钥大小(根据配置的司法管辖区策略文件)
      InvalidAlgorithmParameterException - 如果给定的算法参数不适合此密码,或此密码需要算法参数且paramsnull,或给定的算法参数暗示的加密强度将超出法定限制(根据配置的司法管辖区策略文件确定)
      UnsupportedOperationException - 如果opmodeWRAP_MODEUNWRAP_MODE,但底层CipherSpi未实现该模式
      InvalidParameterException - 如果opmode不是已识别的值之一
    • init

      public final void init(int opmode, Certificate certificate) throws InvalidKeyException
      初始化此Cipher对象,使用给定证书中的公钥。

      Cipher对象根据opmode的值,初始化为以下四种操作之一:加密、解密、密钥包装或密钥解包。

      如果证书是X.509类型,并且具有标记为关键的密钥用途扩展字段,并且密钥用途扩展字段的值暗示证书中的公钥及其对应的私钥不应用于由opmode值表示的操作,则会抛出InvalidKeyException异常。

      如果此密码需要任何无法从给定证书中的公钥派生的算法参数,则底层密码实现应自行生成所需的参数(使用特定于提供程序的默认值或随机值),如果它被初始化为加密或密钥包装,则如果它被初始化为解密或密钥解包,则会引发InvalidKeyException。生成的参数可以使用getParametersgetIV(如果参数是IV)来检索。

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

      如果此密码(包括其反馈或填充方案)需要任何随机字节(例如,用于参数生成),它将使用安装的提供程序中优先级最高的SecureRandom实现作为随机源。(如果没有安装的提供程序提供SecureRandom的实现,则将使用系统提供的随机源。)

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

      参数:
      opmode - 此Cipher对象的操作模式(以下之一:ENCRYPT_MODEDECRYPT_MODEWRAP_MODEUNWRAP_MODE
      certificate - 证书
      抛出:
      InvalidKeyException - 如果给定证书中的公钥不适合初始化此密码,或者此密码需要无法从给定证书中的公钥确定的算法参数,或者给定证书中的公钥的密钥大小超过最大允许的密钥大小(由配置的司法管辖区策略文件确定)
      UnsupportedOperationException - 如果opmodeWRAP_MODEUNWRAP_MODE,但底层CipherSpi未实现该模式
      InvalidParameterException - 如果opmode不是已识别的值之一
    • init

      public final void init(int opmode, Certificate certificate, SecureRandom random) throws InvalidKeyException
      使用给定证书中的公钥和随机源初始化此Cipher对象。

      Cipher对象根据opmode的值,初始化为以下四种操作之一:加密、解密、密钥包装或密钥解包。

      如果证书是X.509类型,并且具有标记为关键的密钥用途扩展字段,并且密钥用途扩展字段的值暗示证书中的公钥及其对应的私钥不应用于由opmode值表示的操作,则会抛出InvalidKeyException异常。

      如果此密码需要任何无法从给定certificate中的公钥派生的算法参数,则底层密码实现应自行生成所需的参数(使用特定于提供程序的默认值或随机值),如果它被初始化为加密或密钥包装,则如果它被初始化为解密或密钥解包,则会引发InvalidKeyException。生成的参数可以使用getParametersgetIV(如果参数是IV)来检索。

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

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

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

      参数:
      opmode - 此Cipher对象的操作模式(以下之一:ENCRYPT_MODEDECRYPT_MODEWRAP_MODEUNWRAP_MODE
      certificate - 证书
      random - 随机源
      抛出:
      InvalidKeyException - 如果给定证书中的公钥不适合初始化此密码,或者此密码需要无法从给定证书中的公钥确定的算法参数,或者给定证书中的公钥的密钥大小超过最大允许的密钥大小(由配置的司法管辖区策略文件确定)
      UnsupportedOperationException - 如果opmodeWRAP_MODEUNWRAP_MODE,但底层CipherSpi未实现该模式
      InvalidParameterException - 如果opmode不是已识别的值之一
    • update

      public final byte[] update(byte[] input)
      继续多部分加密或解密操作(取决于此Cipher对象的初始化方式),处理另一个数据部分。

      处理input缓冲区中的字节,并将结果存储在新缓冲区中。

      如果input长度为零,则此方法返回null

      参数:
      input - 输入缓冲区
      返回:
      结果的新缓冲区,如果此密码是块密码且输入数据太短而无法生成新块,则返回null
      抛出:
      IllegalStateException - 如果此Cipher对象处于错误状态(例如,尚未初始化)
    • update

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

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

      如果inputLen为零,则此方法返回null

      参数:
      input - 输入缓冲区
      inputOffset - 输入开始的偏移量
      inputLen - 输入长度
      返回:
      结果的新缓冲区,如果此密码是块密码且输入数据太短而无法生成新块,则返回null
      抛出:
      IllegalStateException - 如果此Cipher对象处于错误状态(例如,尚未初始化)
    • update

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

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

      如果output缓冲区太小而无法容纳结果,则会抛出ShortBufferException。在这种情况下,请使用更大的输出缓冲区重复此调用。使用getOutputSize确定输出缓冲区应有多大。

      如果inputLen为零,则此方法返回零长度。

      注意:此方法应是安全的复制,这意味着inputoutput缓冲区可以引用相同的字节数组,并且在将结果复制到输出缓冲区时不会覆盖未处理的输入数据。

      参数:
      input - 输入缓冲区
      inputOffset - 输入开始的偏移量
      inputLen - 输入长度
      output - 结果的缓冲区
      返回:
      存储在output中的字节数
      抛出:
      IllegalStateException - 如果此Cipher对象处于错误状态(例如,尚未初始化)
      ShortBufferException - 如果给定的输出缓冲区太小而无法容纳结果
    • update

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

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

      如果 output 缓冲区太小无法容纳结果,则会抛出 ShortBufferException。在这种情况下,请使用更大的输出缓冲区重复调用此方法。使用 getOutputSize 来确定输出缓冲区应该有多大。

      如果 inputLen 为零,则此方法返回零长度。

      注意:此方法应该是安全的复制,这意味着 inputoutput 缓冲区可以引用相同的字节数组,并且在将结果复制到输出缓冲区时不会覆盖未处理的输入数据。

      参数:
      input - 输入缓冲区
      inputOffset - 输入开始的偏移量
      inputLen - 输入长度
      output - 结果的缓冲区
      outputOffset - 存储结果的输出缓冲区中的偏移量
      返回:
      存储在 output 中的字节数
      抛出:
      IllegalStateException - 如果此 Cipher 对象处于错误状态(例如,未初始化)
      ShortBufferException - 如果给定的输出缓冲区太小无法容纳结果
    • update

      public final int update(ByteBuffer input, ByteBuffer output) throws ShortBufferException
      继续多部分加密或解密操作(取决于此 Cipher 对象的初始化方式),处理另一个数据部分。

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

      如果 output.remaining() 字节不足以容纳结果,则会抛出 ShortBufferException。在这种情况下,请使用更大的输出缓冲区重复调用此方法。使用 getOutputSize 来确定输出缓冲区应该有多大。

      注意:此方法应该是安全的复制,这意味着 inputoutput 缓冲区可以引用相同的内存块,并且在将结果复制到输出缓冲区时不会覆盖未处理的输入数据。

      参数:
      input - 输入 ByteBuffer
      output - 输出 ByteBuffer
      返回:
      存储在 output 中的字节数
      抛出:
      IllegalStateException - 如果此 Cipher 对象处于错误状态(例如,未初始化)
      IllegalArgumentException - 如果输入和输出是同一个对象
      ReadOnlyBufferException - 如果输出缓冲区是只读的
      ShortBufferException - 如果输出缓冲区空间不足
      自 JDK 版本:
      1.5
    • doFinal

      public final byte[] doFinal() throws IllegalBlockSizeException, BadPaddingException
      完成多部分加密或解密操作,取决于此 Cipher 对象的初始化方式。

      可能在先前的 update 操作期间已缓冲的输入数据将被处理,并应用填充(如果请求)。如果正在使用 AEAD 模式(如 GCM/CCM),则在加密时附加认证标签,或在解密时验证认证标签。结果存储在新缓冲区中。

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

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

      返回:
      带有结果的新缓冲区
      抛出:
      IllegalStateException - 如果此 Cipher 对象处于错误状态(例如,未初始化)
      IllegalBlockSizeException - 如果此密码是块密码,未请求填充(仅在加密模式下),并且此密码处理的数据的总输入长度不是块大小的倍数;或者如果此加密算法无法处理提供的输入数据。
      BadPaddingException - 如果此 Cipher 对象处于解密模式,并且已请求(反)填充,但解密的数据未受适当填充字节的限制
      AEADBadTagException - 如果此 Cipher 对象正在 AEAD 模式(如 GCM/CCM)中解密,并且接收到的认证标签与计算值不匹配
    • doFinal

      public final int doFinal(byte[] output, int outputOffset) throws IllegalBlockSizeException, ShortBufferException, BadPaddingException
      完成多部分加密或解密操作,取决于此 Cipher 对象的初始化方式。

      可能在先前的 update 操作期间已缓冲的输入数据将被处理,并应用填充(如果请求)。如果正在使用 AEAD 模式(如 GCM/CCM),则在加密时附加认证标签,或在解密时验证认证标签。结果存储在 output 缓冲区中,从 outputOffset 开始。

      如果 output 缓冲区太小无法容纳结果,则会抛出 ShortBufferException。在这种情况下,请使用更大的输出缓冲区重复调用此方法。使用 getOutputSize 来确定输出缓冲区应该有多大。

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

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

      参数:
      output - 结果的缓冲区
      outputOffset - 存储结果的输出缓冲区中的偏移量
      返回:
      存储在 output 中的字节数
      抛出:
      IllegalStateException - 如果此 Cipher 对象处于错误状态(例如,未初始化)
      IllegalBlockSizeException - 如果此密码是块密码,未请求填充(仅在加密模式下),并且此密码处理的数据的总输入长度不是块大小的倍数;或者如果此加密算法无法处理提供的输入数据。
      ShortBufferException - 如果给定的输出缓冲区太小无法容纳结果
      BadPaddingException - 如果此 Cipher 对象处于解密模式,并且已请求(反)填充,但解密的数据未受适当填充字节的限制
      AEADBadTagException - 如果此 Cipher 对象正在 AEAD 模式(如 GCM/CCM)中解密,并且接收到的认证标签与计算值不匹配
    • doFinal

      public final byte[] doFinal(byte[] input) throws IllegalBlockSizeException, BadPaddingException
      在单部分操作中加密或解密数据,或完成多部分操作。数据将根据此 Cipher 对象的初始化方式进行加密或解密。

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

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

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

      参数:
      input - 输入缓冲区
      返回:
      带有结果的新缓冲区
      抛出:
      IllegalStateException - 如果此 Cipher 对象处于错误状态(例如,未初始化)
      IllegalBlockSizeException - 如果此密码是块密码,未请求填充(仅在加密模式下),并且此密码处理的数据的总输入长度不是块大小的倍数;或者如果此加密算法无法处理提供的输入数据。
      BadPaddingException - 如果此 Cipher 对象处于解密模式,并且已请求(反)填充,但解密的数据未受适当填充字节的限制
      AEADBadTagException - 如果此 Cipher 对象正在 AEAD 模式(如 GCM/CCM)中解密,并且接收到的认证标签与计算值不匹配
    • doFinal

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

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

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

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

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

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

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

      如果 output 缓冲区太小无法容纳结果,则会抛出 ShortBufferException。在这种情况下,请使用更大的输出缓冲区重复此调用。使用 getOutputSize 来确定输出缓冲区应该有多大。

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

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

      注意:此方法应该是安全的复制,这意味着 inputoutput 缓冲区可以引用相同的字节数组,并且在将结果复制到输出缓冲区时不会覆盖未处理的输入数据。

      参数:
      input - 输入缓冲区
      inputOffset - 输入开始的 input 中的偏移量
      inputLen - 输入长度
      output - 结果的缓冲区
      返回:
      存储在 output 中的字节数
      抛出:
      IllegalStateException - 如果此 Cipher 对象处于错误状态(例如,尚未初始化)
      IllegalBlockSizeException - 如果此密码是块密码,未请求填充(仅在加密模式下),并且此密码处理的数据的总输入长度不是块大小的倍数;或者如果此加密算法无法处理提供的输入数据。
      ShortBufferException - 如果给定的输出缓冲区太小无法容纳结果
      BadPaddingException - 如果此 Cipher 对象处于解密模式,并且已请求(反)填充,但解密数据未受适当填充字节的限制
      AEADBadTagException - 如果此 Cipher 对象正在以 AEAD 模式(如 GCM/CCM)解密,并且接收到的认证标签与计算值不匹配
    • doFinal

      public final int doFinal(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset) throws ShortBufferException, IllegalBlockSizeException, BadPaddingException
      单部操作中加密或解密数据,或完成多部操作。数据根据此 Cipher 对象的初始化方式进行加密或解密。

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

      如果 output 缓冲区太小无法容纳结果,则会抛出 ShortBufferException。在这种情况下,请使用更大的输出缓冲区重复此调用。使用 getOutputSize 来确定输出缓冲区应该有多大。

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

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

      注意:此方法应该是安全的复制,这意味着 inputoutput 缓冲区可以引用相同的字节数组,并且在将结果复制到输出缓冲区时不会覆盖未处理的输入数据。

      参数:
      input - 输入缓冲区
      inputOffset - 输入开始的 input 中的偏移量
      inputLen - 输入长度
      output - 结果的缓冲区
      outputOffset - 存储结果的 output 中的偏移量
      返回:
      存储在 output 中的字节数
      抛出:
      IllegalStateException - 如果此 Cipher 对象处于错误状态(例如,尚未初始化)
      IllegalBlockSizeException - 如果此密码是块密码,未请求填充(仅在加密模式下),并且此密码处理的数据的总输入长度不是块大小的倍数;或者如果此加密算法无法处理提供的输入数据。
      ShortBufferException - 如果给定的输出缓冲区太小无法容纳结果
      BadPaddingException - 如果此 Cipher 对象处于解密模式,并且已请求(反)填充,但解密数据未受适当填充字节的限制
      AEADBadTagException - 如果此 Cipher 对象正在以 AEAD 模式(如 GCM/CCM)解密,并且接收到的认证标签与计算值不匹配
    • doFinal

      public final int doFinal(ByteBuffer input, ByteBuffer output) throws ShortBufferException, IllegalBlockSizeException, BadPaddingException
      单部操作中加密或解密数据,或完成多部操作。数据根据此 Cipher 对象的初始化方式进行加密或解密。

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

      如果 output.remaining() 字节不足以容纳结果,则会抛出 ShortBufferException。在这种情况下,请使用更大的输出缓冲区重复此调用。使用 getOutputSize 来确定输出缓冲区应该有多大。

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

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

      注意:此方法应该是安全的复制,这意味着 inputoutput 缓冲区可以引用相同的字节数组,并且在将结果复制到输出缓冲区时不会覆盖未处理的输入数据。

      参数:
      input - 输入的 ByteBuffer
      output - 输出的 ByteBuffer
      返回值:
      存储在 output 中的字节数
      抛出:
      IllegalStateException - 如果此 Cipher 对象处于错误状态(例如,未初始化)
      IllegalArgumentException - 如果输入和输出是同一个对象
      ReadOnlyBufferException - 如果输出缓冲区是只读的
      IllegalBlockSizeException - 如果此密码是块密码,未请求填充(仅在加密模式下),并且此密码处理的数据的总输入长度不是块大小的倍数;或者如果此加密算法无法处理提供的输入数据。
      ShortBufferException - 如果输出缓冲区中空间不足
      BadPaddingException - 如果此 Cipher 对象处于解密模式,并且已请求(反)填充,但解密的数据不受适当填充字节的限制
      AEADBadTagException - 如果此 Cipher 对象在 AEAD 模式(如 GCM/CCM)下解密,并且接收到的认证标签与计算的值不匹配
      自版本:
      1.5
    • wrap

      public final byte[] wrap(Key key) throws IllegalBlockSizeException, InvalidKeyException
      包装密钥。
      参数:
      key - 要包装的密钥
      返回值:
      包装后的密钥
      抛出:
      IllegalStateException - 如果此 Cipher 对象处于错误状态(例如,未初始化)
      IllegalBlockSizeException - 如果此密码是块密码,未请求填充,并且要包装的密钥的编码长度不是块大小的倍数
      InvalidKeyException - 如果使用此密码包装密钥不可能或不安全(例如,将硬件受保护密钥传递给仅软件的密码)
      UnsupportedOperationException - 如果 CipherSpi 中的相应方法不受支持
    • unwrap

      public final Key unwrap(byte[] wrappedKey, String wrappedKeyAlgorithm, int wrappedKeyType) throws InvalidKeyException, NoSuchAlgorithmException
      解包先前包装的密钥。
      参数:
      wrappedKey - 要解包的密钥
      wrappedKeyAlgorithm - 与包装密钥关联的算法
      wrappedKeyType - 包装密钥的类型。必须是 SECRET_KEYPRIVATE_KEYPUBLIC_KEY 中的一个
      返回值:
      解包后的密钥
      抛出:
      IllegalStateException - 如果此 Cipher 对象处于错误状态(例如,未初始化)
      NoSuchAlgorithmException - 如果没有安装的提供程序可以为 wrappedKeyType 类型的密钥创建 wrappedKeyAlgorithm
      InvalidKeyException - 如果 wrappedKey 不代表 wrappedKeyType 类型的包装密钥,用于 wrappedKeyAlgorithm
      UnsupportedOperationException - 如果 CipherSpi 中的相应方法未被实现覆盖
    • getMaxAllowedKeyLength

      public static final int getMaxAllowedKeyLength(String transformation) throws NoSuchAlgorithmException
      根据安装的 JCE 管辖策略文件,返回指定转换的最大密钥长度。如果安装了 JCE 无限制强度管辖策略文件,则将返回 Integer.MAX_VALUE。有关默认密钥大小和 JCE 管辖策略文件的更多信息,请参阅 JDK 提供程序文档中的密码学默认值和限制。
      参数:
      transformation - 密码转换
      返回值:
      位数中的最大密钥长度或 Integer.MAX_VALUE
      抛出:
      NullPointerException - 如果 transformationnull
      NoSuchAlgorithmException - 如果 transformation 不是有效的转换,即以 "algorithm" 或 "algorithm/mode/padding" 的形式
      自版本:
      1.5
    • getMaxAllowedParameterSpec

      public static final AlgorithmParameterSpec getMaxAllowedParameterSpec(String transformation) throws NoSuchAlgorithmException
      返回一个包含根据管辖策略文件的最大 Cipher 参数值的 {code AlgorithmParameterSpec} 对象。如果安装了 JCE 无限制强度管辖策略文件或在策略文件中对指定转换的参数没有最大限制,则将返回 null
      参数:
      transformation - 密码转换
      返回值:
      一个包含最大值或 null 的 {code AlgorithmParameterSpec} 对象
      抛出:
      NullPointerException - 如果 transformationnull
      NoSuchAlgorithmException - 如果 transformation 不是有效的转换,即以 "algorithm" 或 "algorithm/mode/padding" 的形式
      自版本:
      1.5
    • updateAAD

      public final void updateAAD(byte[] src)
      继续对附加认证数据(AAD)进行多部分更新。

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

      参数:
      src - 包含附加认证数据的缓冲区
      抛出:
      IllegalArgumentException - 如果 src 字节数组为 null
      IllegalStateException - 如果此 Cipher 对象处于错误状态(例如,未初始化),不接受 AAD,或者在 GCM 或 CCM 模式下操作,并且已为活动加密/解密操作调用了其中一个 update 方法
      UnsupportedOperationException - 如果 CipherSpi 中的相应方法未被实现覆盖
      自版本:
      1.7
    • updateAAD

      public final void updateAAD(byte[] src, int offset, int len)
      继续对附加认证数据(AAD)进行多部分更新,使用提供的缓冲区的子集。

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

      参数:
      src - 包含 AAD 的缓冲区
      offset - AAD 输入在 src 中开始的偏移量
      len - AAD 字节数
      抛出:
      IllegalArgumentException - 如果 src 字节数组为 null,或者 offsetlength 小于 0,或者 offsetlen 的总和大于 src 字节数组的长度
      IllegalStateException - 如果此 Cipher 对象处于错误状态(例如,未初始化),不接受 AAD,或者在 GCM 或 CCM 模式下操作,并且已为活动加密/解密操作调用了其中一个 update 方法
      UnsupportedOperationException - 如果 CipherSpi 中的相应方法未被实现覆盖
      自版本:
      1.7
    • updateAAD

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

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

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

      参数:
      src - 包含AAD的缓冲区
      抛出:
      IllegalArgumentException - 如果src ByteBuffernull
      IllegalStateException - 如果此Cipher对象处于错误状态(例如,未初始化),不接受AAD,或者在GCM或CCM模式下操作并且已经为活动加密/解密操作调用了update方法之一
      UnsupportedOperationException - 如果CipherSpi中的相应方法未被实现重写
      自从:
      1.7
    • toString

      public String toString()
      返回此Cipher对象的String表示形式。
      覆盖:
      toString 在类中 Object
      实现说明:
      此实现返回一个包含此Cipher对象的转换、模式和提供程序的StringString的确切格式未指定,可能会更改。
      返回:
      描述此Cipher对象的字符串