JavaTM 2 Platform
Standard Ed. 5.0

javax.crypto
类 Cipher

java.lang.Object
  继承者 javax.crypto.Cipher
直接已知子类:
NullCipher

public class Cipher
extends Object

此类提供了针对加密和解密的密码 cipher 功能。它构成了 Java Cryptographic Extension (JCE) 框架的核心。

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

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

转换具有下面的形式:

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

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

在流 cipher 模式下(例如,DESCFBOFB 模式)请求块 cipher 时,用户可选择指定一次处理的位数,方法是将此数追加到模式名称中,如在 "DES/CFB8/NoPadding" 和 "DES/OFB32/PKCS5Padding" 转换中所示。如果未指定该数,则将使用特定于提供程序的默认值。(例如,"SunJCE" 提供程序使用默认的 64 位)。

从以下版本开始:
1.4
另请参见:
KeyGenerator, SecretKey

字段摘要
static int DECRYPT_MODE
          用于将 cipher 初始化为解密模式的常量。
static int ENCRYPT_MODE
          用于将 cipher 初始化为加密模式的常量。
static int PRIVATE_KEY
          用于指示要打开的密钥为“私钥”的常量。
static int PUBLIC_KEY
          用于指示要打开的密钥为“公钥”的常量。
static int SECRET_KEY
          用于指示要打开的密钥为“秘密密钥”的常量。
static int UNWRAP_MODE
          用于将 cipher 初始化为密钥打开模式的常量。
static int WRAP_MODE
          用于将 cipher 初始化为密钥包装模式的常量。
 
构造方法摘要
protected Cipher(CipherSpi cipherSpi, Provider provider, String transformation)
          创建 Cipher 对象。
 
方法摘要
 byte[] doFinal()
          结束多部分加密或解密操作(取决于 cipher 的初始化方式)。
 byte[] doFinal(byte[] input)
          按单部分操作加密或解密数据,或者结束一个多部分操作。
 int doFinal(byte[] output, int outputOffset)
          结束多部分加密或解密操作(取决于 cipher 的初始化方式)。
 byte[] doFinal(byte[] input, int inputOffset, int inputLen)
          按单部分操作加密或解密数据,或者结束一个多部分操作。
 int doFinal(byte[] input, int inputOffset, int inputLen, byte[] output)
          按单部分操作加密或解密数据,或者结束一个多部分操作。
 int doFinal(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset)
          按单部分操作加密或解密数据,或者结束一个多部分操作。
 int doFinal(ByteBuffer input, ByteBuffer output)
          按单部分操作加密或解密数据,或者结束一个多部分操作。
 String getAlgorithm()
          返回此 Cipher 对象的算法名称。
 int getBlockSize()
          返回块的大小(以字节为单位)。
 ExemptionMechanism getExemptionMechanism()
          返回此 cipher 使用的豁免机制对象。
static Cipher getInstance(String transformation)
          生成一个实现指定转换的 Cipher 对象。
static Cipher getInstance(String transformation, Provider provider)
          创建一个实现指定转换的 Cipher 对象,该转换由指定的提供程序提供。
static Cipher getInstance(String transformation, String provider)
          创建一个实现指定转换的 Cipher 对象,该转换由指定的提供程序提供。
 byte[] getIV()
          返回新缓冲区中的初始化向量 (IV)。
static int getMaxAllowedKeyLength(String transformation)
          根据所安装的 JCE 仲裁策略文件返回指定转换的最大密钥长度。
static AlgorithmParameterSpec getMaxAllowedParameterSpec(String transformation)
          根据仲裁策略文件返回包含最大 cipher 参数值的 AlgorithmParameterSpec 对象。
 int getOutputSize(int inputLen)
          在给定了输入长度 inputLen(以字节为单位)的情况下,返回用于保存下一个 updatedoFinal 操作结果所需的输出缓冲区长度的字节数。
 AlgorithmParameters getParameters()
          返回此 cipher 使用的参数。
 Provider getProvider()
          返回此 Cipher 对象的提供程序。
 void init(int opmode, Certificate certificate)
          用来自给定证书的公钥初始化此 cipher。
 void init(int opmode, Certificate certificate, SecureRandom random)
          用来自给定证书的公钥和随机源初始化此 cipher。
 void init(int opmode, Key key)
          用密钥初始化此 cipher。
 void init(int opmode, Key key, AlgorithmParameters params)
          用密钥和一组算法参数初始化此 cipher。
 void init(int opmode, Key key, AlgorithmParameterSpec params)
          用密钥和一组算法参数初始化此 cipher。
 void init(int opmode, Key key, AlgorithmParameterSpec params, SecureRandom random)
          用一个密钥、一组算法参数和一个随机源初始化此 cipher。
 void init(int opmode, Key key, AlgorithmParameters params, SecureRandom random)
          用一个密钥、一组算法参数和一个随机源初始化此 cipher。
 void init(int opmode, Key key, SecureRandom random)
          用密钥和随机源初始化此 cipher。
 Key unwrap(byte[] wrappedKey, String wrappedKeyAlgorithm, int wrappedKeyType)
          打开一个以前包装的密钥。
 byte[] update(byte[] input)
          继续多部分加密或解密操作(取决于此 cipher 的初始化方式),以处理其他数据部分。
 byte[] update(byte[] input, int inputOffset, int inputLen)
          继续多部分加密或解密操作(取决于此 cipher 的初始化方式),以处理其他数据部分。
 int update(byte[] input, int inputOffset, int inputLen, byte[] output)
          继续多部分加密或解密操作(取决于此 cipher 的初始化方式),以处理其他数据部分。
 int update(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset)
          继续多部分加密或解密操作(取决于此 cipher 的初始化方式),以处理其他数据部分。
 int update(ByteBuffer input, ByteBuffer output)
          继续多部分加密或解密操作(取决于此 cipher 的初始化方式),以处理其他数据部分。
 byte[] wrap(Key key)
          将密钥包装。
 
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

字段详细信息

ENCRYPT_MODE

public static final int ENCRYPT_MODE
用于将 cipher 初始化为加密模式的常量。

另请参见:
常量字段值

DECRYPT_MODE

public static final int DECRYPT_MODE
用于将 cipher 初始化为解密模式的常量。

另请参见:
常量字段值

WRAP_MODE

public static final int WRAP_MODE
用于将 cipher 初始化为密钥包装模式的常量。

另请参见:
常量字段值

UNWRAP_MODE

public static final int UNWRAP_MODE
用于将 cipher 初始化为密钥打开模式的常量。

另请参见:
常量字段值

PUBLIC_KEY

public static final int PUBLIC_KEY
用于指示要打开的密钥为“公钥”的常量。

另请参见:
常量字段值

PRIVATE_KEY

public static final int PRIVATE_KEY
用于指示要打开的密钥为“私钥”的常量。

另请参见:
常量字段值

SECRET_KEY

public static final int SECRET_KEY
用于指示要打开的密钥为“秘密密钥”的常量。

另请参见:
常量字段值
构造方法详细信息

Cipher

protected Cipher(CipherSpi cipherSpi,
                 Provider provider,
                 String transformation)
创建 Cipher 对象。

参数:
cipherSpi - 代理
provider - 提供程序
transformation - 转换
方法详细信息

getInstance

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

如果默认的提供程序包提供了请求的转换实现,则会返回包含该实现的一个 Cipher 实例。如果默认的提供程序包中没有可用的转换,则将搜索其他的提供程序包。

参数:
transformation - 转换的名称,例如 DES/CBC/PKCS5Padding。有关标准转换名称的信息,请参见 Java Cryptography Extension Reference Guide 的附录 A。
返回:
实现所请求转换的 cipher
抛出:
NoSuchAlgorithmException - 如果 transformation 为 null、空、无效格式,或当前安装的提供程序中没有可用的转换。
NoSuchPaddingException - 如果 transformation 包含的填充方案不可用。

getInstance

public static final Cipher getInstance(String transformation,
                                       String provider)
                                throws NoSuchAlgorithmException,
                                       NoSuchProviderException,
                                       NoSuchPaddingException
创建一个实现指定转换的 Cipher 对象,该转换由指定的提供程序提供。

参数:
transformation - 转换的名称,例如 DES/CBC/PKCS5Padding。有关标准转换名称的信息,请参见 Java Cryptography Extension Reference Guide 的附录 A。
provider - 提供程序的名称
返回:
实现所请求转换的 cipher
抛出:
NoSuchAlgorithmException - 如果 transformation 为 null、空、无效格式,或指定的提供程序中没有可用的转换。
NoSuchProviderException - 如果指定的提供程序未配置。
NoSuchPaddingException - 如果 transformation 包含的填充方案不可用。
IllegalArgumentException - 如果 provider 为 null。

getInstance

public static final Cipher getInstance(String transformation,
                                       Provider provider)
                                throws NoSuchAlgorithmException,
                                       NoSuchPaddingException
创建一个实现指定转换的 Cipher 对象,该转换由指定的提供程序提供。注:该 provider 不必被注册。

参数:
transformation - 转换的名称,例如 DES/CBC/PKCS5Padding。有关标准转换名称的信息,请参见 Java Cryptography Extension Reference Guide 的附录 A。
provider - 提供程序
返回:
实现所请求转换的 cipher
抛出:
NoSuchAlgorithmException - 如果 transformation 为 null、空、无效格式,或指定的提供程序中没有可用的转换。
NoSuchPaddingException - 如果 transformation 包含的填充方案不可用。
IllegalArgumentException - 如果 provider 为 null。

getProvider

public final Provider getProvider()
返回此 Cipher 对象的提供程序。

返回:
Cipher 对象的提供程序

getAlgorithm

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

这与创建此 Cipher 对象的 getInstance 调用之一指定的名称相同。

返回:
Cipher 对象的算法名称。

getBlockSize

public final int getBlockSize()
返回块的大小(以字节为单位)。

返回:
块的大小(以字节为单位),如果基础算法不是块 cipher,则返回 0

getOutputSize

public final int getOutputSize(int inputLen)
在给定了输入长度 inputLen(以字节为单位)的情况下,返回用于保存下一个 updatedoFinal 操作结果所需的输出缓冲区长度的字节数。

此调用还考虑到来自上一个 update 调用的未处理(已缓存)数据和填充。

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

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

getIV

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

此方法在创建随机 IV 的情况下或者在基于密码的加密或解密上下文中(其中,IV 派生自用户提供的密码)很有用。

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

getParameters

public final AlgorithmParameters getParameters()
返回此 cipher 使用的参数。

返回的参数可能与初始化此 cipher 所使用的参数相同;如果此 cipher 要求使用算法参数但却未使用任何参数进行初始化,则返回的参数可能会包含由默认值和随机生成的参数值的组合。

返回:
此 cipher 使用的参数,如果此 cipher 不使用任何参数,则返回 null。

getExemptionMechanism

public final ExemptionMechanism getExemptionMechanism()
返回此 cipher 使用的豁免机制对象。

返回:
此 cipher 使用的豁免机制对象,如果此 cipher 不使用任何豁免机制,则返回 null。

init

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

为以下 4 种操作之一初始化该 cipher:加密、解密、密钥包装或密钥打开,这取决于 opmode 的值。

如果此 cipher 要求使用任何算法参数,而此参数又无法从给定的 key 派生,则在被初始化为加密或密钥包装时,基础 cipher 实现将会自己生成所需的参数(使用特定于提供程序的默认或随机值);在初始化为解密或密钥打开时,将引发 InvalidKeyException。可以用 getParametersgetIV 检索生成的参数(如果该参数为 IV)。

如果此 cipher(包括其基础反馈或填充方案)要求使用任何随机字节(例如,用于参数生成),那么它将使用具有最高优先级的已安装提供程序的 SecureRandom 实现获得这些字节以充当随机源。(如果已安装的提供程序中没有一个可提供 SecureRandom 的实现,则将使用系统提供的随机源)。

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

参数:
opmode - 此 cipher 的操作模式(其为如下之一:ENCRYPT_MODEDECRYPT_MODEWRAP_MODEUNWRAP_MODE
key - 密钥
抛出:
InvalidKeyException - 如果给定的 key 不适合初始化此 cipher;如果此 cipher 初始化为解密,并且它所要求的算法参数无法从给定的 key 确定;如果给定 key 的 keysize 超出最大允许 keysize(由已配置的仲裁策略文件确定)。

init

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

为以下 4 种操作之一初始化该 cipher:加密、解密、密钥包装或密钥打开,这取决于 opmode 的值。

如果此 cipher 要求使用任何算法参数,而此参数又无法从给定的 key 派生,则在被初始化为加密或密钥包装时,基础 cipher 实现将会自己生成所需的参数(使用特定于提供程序的默认或随机值);在初始化为解密或密钥打开时,将引发 InvalidKeyException。可以用 getParametersgetIV 检索生成的参数(如果该参数为 IV)。

如果此 cipher(包括其基础反馈或填充方案)要求使用任何随机字节(例如,用于参数生成),那么它将从 random 获取这些随机字节。

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

参数:
opmode - 此 cipher 的操作模式(其为如下之一:ENCRYPT_MODEDECRYPT_MODEWRAP_MODEUNWRAP_MODE
key - 加密密钥
random - 随机源
抛出:
InvalidKeyException - 如果给定的 key 不适合初始化此 cipher;如果此 cipher 初始化为解密,并且它所要求的算法参数无法从给定的 key 确定;如果给定 key 的 keysize 超出最大允许 keysize(由已配置的仲裁策略文件确定)。

init

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

为以下 4 种操作之一初始化该 cipher:加密、解密、密钥包装或密钥打开,这取决于 opmode 的值。

如果此 cipher 要求使用任何算法参数,而 params 为 null,则在被初始化为加密或密钥包装时,基础 cipher 实现将会自己生成所需的参数(使用特定于提供程序的默认或随机值);在初始化为解密或密钥打开时,将引发 InvalidAlgorithmParameterException。可以用 getParametersgetIV 检索生成的参数(如果该参数为 IV)。

如果此 cipher(包括其基础反馈或填充方案)要求使用任何随机字节(例如,用于参数生成),那么它将使用具有最高优先级的已安装提供程序的 SecureRandom 实现获得这些字节以充当随机源。(如果已安装的提供程序中没有一个可提供 SecureRandom 的实现,则将使用系统提供的随机源)。

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

参数:
opmode - 此 cipher 的操作模式(其为如下之一:ENCRYPT_MODEDECRYPT_MODEWRAP_MODEUNWRAP_MODE
key - 加密密钥
params - 算法参数
抛出:
InvalidKeyException - 如果给定的 key 不适合初始化此 cipher,或其 keysize 超出最大允许 keysize(由已配置的仲裁策略文件确定)。
InvalidAlgorithmParameterException - 如果给定的算法参数不适合此 cipher,或此 cipher 初始化为解密,且要求使用算法参数而 params 为 null,或者给定的算法参数所含的加密强度可能超出合法限制(由已配置的仲裁策略文件确定)。

init

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

为以下 4 种操作之一初始化该 cipher:加密、解密、密钥包装或密钥打开,这取决于 opmode 的值。

如果此 cipher 要求使用任何算法参数,而 params 为 null,则在被初始化为加密或密钥包装时,基础 cipher 实现将会自己生成所需的参数(使用特定于提供程序的默认或随机值);在初始化为解密或密钥打开时,将引发 InvalidAlgorithmParameterException。可以用 getParametersgetIV 检索生成的参数(如果该参数为 IV)。

如果此 cipher(包括其基础反馈或填充方案)要求使用任何随机字节(例如,用于参数生成),那么它将从 random 获取这些随机字节。

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

参数:
opmode - 此 cipher 的操作模式(其为如下之一:ENCRYPT_MODEDECRYPT_MODEWRAP_MODEUNWRAP_MODE
key - 加密密钥
params - 算法参数
random - 随机源
抛出:
InvalidKeyException - 如果给定的 key 不适合初始化此 cipher,或其 keysize 超出最大允许 keysize(由已配置的仲裁策略文件确定)。
InvalidAlgorithmParameterException - 如果给定的算法参数不适合此 cipher,或此 cipher 初始化为解密,且要求使用算法参数而 params 为 null,或者给定的算法参数所含的加密强度可能超出合法限制(由已配置的仲裁策略文件确定)。

init

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

为以下 4 种操作之一初始化该 cipher:加密、解密、密钥包装或密钥打开,这取决于 opmode 的值。

如果此 cipher 要求使用任何算法参数,而 params 为 null,则在被初始化为加密或密钥包装时,基础 cipher 实现将会自己生成所需的参数(使用特定于提供程序的默认或随机值);在初始化为解密或密钥打开时,将引发 InvalidAlgorithmParameterException。可以用 getParametersgetIV 检索生成的参数(如果该参数为 IV)。

如果此 cipher(包括其基础反馈或填充方案)要求使用任何随机字节(例如,用于参数生成),那么它将使用具有最高优先级的已安装提供程序的 SecureRandom 实现获得这些字节以充当随机源。(如果已安装的提供程序中没有一个可提供 SecureRandom 的实现,则将使用系统提供的随机源)。

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

参数:
opmode - 此 cipher 的操作模式(其为如下之一:ENCRYPT_MODEDECRYPT_MODEWRAP_MODEUNWRAP_MODE
key - 加密密钥
params - 算法参数
抛出:
InvalidKeyException - 如果给定的 key 不适合初始化此 cipher,或其 keysize 超出最大允许 keysize(由已配置的仲裁策略文件确定)。
InvalidAlgorithmParameterException - 如果给定的算法参数不适合此 cipher,或此 cipher 初始化为解密,且要求使用算法参数而 params 为 null,或者给定的算法参数所含的加密强度可能超出合法限制(由已配置的仲裁策略文件确定)。

init

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

为以下 4 种操作之一初始化该 cipher:加密、解密、密钥包装或密钥打开,这取决于 opmode 的值。

如果此 cipher 要求使用任何算法参数,而 params 为 null,则在被初始化为加密或密钥包装时,基础 cipher 实现将会自己生成所需的参数(使用特定于提供程序的默认或随机值);在初始化为解密或密钥打开时,将引发 InvalidAlgorithmParameterException。可以用 getParametersgetIV 检索生成的参数(如果该参数为 IV)。

如果此 cipher(包括其基础反馈或填充方案)要求使用任何随机字节(例如,用于参数生成),那么它将从 random 获取这些随机字节。

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

参数:
opmode - 此 cipher 的操作模式(其为如下之一:ENCRYPT_MODEDECRYPT_MODEWRAP_MODEUNWRAP_MODE
key - 加密密钥
params - 算法参数
random - 随机源
抛出:
InvalidKeyException - 如果给定的 key 不适合初始化此 cipher,或其 keysize 超出最大允许 keysize(由已配置的仲裁策略文件确定)。
InvalidAlgorithmParameterException - 如果给定的算法参数不适合此 cipher,或此 cipher 初始化为解密,且要求使用算法参数而 params 为 null,或者给定的算法参数所含的加密强度可能超出合法限制(由已配置的仲裁策略文件确定)。

init

public final void init(int opmode,
                       Certificate certificate)
                throws InvalidKeyException
用来自给定证书的公钥初始化此 cipher。

为以下 4 种操作之一初始化该 cipher:加密、解密、密钥包装或密钥打开,这取决于 opmode 的值。

如果证书类型为 X.509 并有一个标记为关键的 key usage 扩展字段,且此 key usage 扩展字段的值意味着在 opmode 的值所代表的操作中将不使用该证书中的公钥及其相应的私钥,则抛出 InvalidKeyException

如果此 cipher 要求使用任何算法参数,而此参数又无法从给定证书中的公钥派生,则在被初始化为加密或密钥包装时,基础 cipher 实现将会自己生成所需的参数(使用特定于提供程序的默认或随机值);在初始化为解密或密钥打开时,将引发 InvalidKeyException。可以用 getParametersgetIV 检索生成的参数(如果该参数为 IV)。

如果此 cipher(包括其基础反馈或填充方案)要求使用任何随机字节(例如,用于参数生成),那么它将使用具有最高优先级的已安装提供程序的 SecureRandom 实现获得这些字节以充当随机源。(如果已安装的提供程序中没有一个可提供 SecureRandom 的实现,则将使用系统提供的随机源)。

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

参数:
opmode - 此 cipher 的操作模式(其为如下之一:ENCRYPT_MODEDECRYPT_MODEWRAP_MODEUNWRAP_MODE
certificate - 证书
抛出:
InvalidKeyException - 如果给定证书中的公钥不适合初始化此 cipher,或者此 cipher 初始化为解密或打开密钥,并且它要求的算法参数无法从给定证书的公钥中确定,或者给定证书中公钥的 keysize 超出最大允许 keysize(由已配置的仲裁策略文件确定)。

init

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

为以下 4 种操作之一初始化该 cipher:加密、解密、密钥包装或密钥打开,这取决于 opmode 的值。

如果证书类型为 X.509 并有一个标记为关键的 key usage 扩展字段,且此 key usage 扩展字段的值意味着在 opmode 的值所代表的操作中将不使用该证书中的公钥及其相应的私钥,则抛出 InvalidKeyException

如果此 cipher 要求使用任何算法参数,而此参数又无法从给定 certificate 中的公钥派生,则在被初始化为加密或密钥包装时,基础 cipher 实现将会自己生成所需的参数(使用特定于提供程序的默认或随机值);在初始化为解密或密钥打开时,将引发 InvalidKeyException。可以用 getParametersgetIV 检索生成的参数(如果该参数为 IV)。

如果此 cipher(包括其基础反馈或填充方案)要求使用任何随机字节(例如,用于参数生成),那么它将从 random 获取这些随机字节。

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

参数:
opmode - 此 cipher 的操作模式(其为如下之一:ENCRYPT_MODEDECRYPT_MODEWRAP_MODEUNWRAP_MODE
certificate - 证书
random - 随机源
抛出:
InvalidKeyException - 如果给定证书中的公钥不适合初始化此 cipher,或者此 cipher 初始化为解密或打开密钥,并且它要求的算法参数无法从给定证书的公钥中确定,或者给定证书中公钥的 keysize 超出最大允许 keysize(由已配置的仲裁策略文件确定)。

update

public final byte[] update(byte[] input)
继续多部分加密或解密操作(取决于此 cipher 的初始化方式),以处理其他数据部分。

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

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

参数:
input - 输入缓冲区
返回:
包含结果的新缓冲区,如果基础 cipher 为块 cipher 并且输入数据太短而无法形成新的块时,则返回 null。
抛出:
IllegalStateException - 如果此 cipher 处于错误的状态(例如,尚未初始化)

update

public final byte[] update(byte[] input,
                           int inputOffset,
                           int inputLen)
继续多部分加密或解密操作(取决于此 cipher 的初始化方式),以处理其他数据部分。

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

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

参数:
input - 输入缓冲区
inputOffset - input 中输入开始位置的偏移量
inputLen - 输入长度
返回:
包含结果的新缓冲区,如果基础 cipher 为块 cipher 并且输入数据太短而无法形成新的块时,则返回 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 缓冲区可引用相同的 byte 数组,并且在将结果复制到输出缓冲区时,不会覆盖任何未处理的输入数据。

参数:
input - 输入缓冲区
inputOffset - input 中输入开始位置的偏移量
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 缓冲区可引用相同的 byte 数组,并且在将结果复制到输出缓冲区时,不会覆盖任何未处理的输入数据。

参数:
input - 输入缓冲区
inputOffset - input 中输入开始位置的偏移量
inputLen - 输入长度
output - 保存结果的缓冲区
outputOffset - output 中存储结果的位置的偏移量
返回:
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 - 如果输出缓冲区中没有足够的空间
从以下版本开始:
1.5

doFinal

public final byte[] doFinal()
                     throws IllegalBlockSizeException,
                            BadPaddingException
结束多部分加密或解密操作(取决于 cipher 的初始化方式)。

处理在上一次 update 操作中可能已缓存的输入数据,其中应用了填充(如果请求)。结果存储在新缓冲区中。

结束时,此方法将把此 cipher 对象重置为上一次调用 init 初始化得到的状态。即重置该对象,可供加密或解密(取决于调用 init 时指定的操作模式)更多的数据。

注:如果抛出了任何异常,则再次使用此 cipher 对象前,可能需要将其重置。

返回:
存储结果的新缓冲区
抛出:
IllegalStateException - 如果此 cipher 处于错误的状态(例如,尚未初始化)
IllegalBlockSizeException - 如果此 cipher 为块 cipher,未请求任何填充(只针对加密模式),并且由此 cipher 处理的数据总输入长度不是块大小的倍数,如果此加密算法无法处理所提供的输入数据。
BadPaddingException - 如果此 cipher 为解密模式,并且未请求填充或不填充,但解密的数据没有用适当的填充字节所限制

doFinal

public final int doFinal(byte[] output,
                         int outputOffset)
                  throws IllegalBlockSizeException,
                         ShortBufferException,
                         BadPaddingException
结束多部分加密或解密操作(取决于 cipher 的初始化方式)。

处理在上一次 update 操作中可能已缓存的输入数据,其中应用了填充(如果请求)。结果存储在 output 缓冲区中从 outputOffset(包含)开始的位置。

如果 output 缓冲区太小无法保存该结果,则抛出 ShortBufferException。这种情况下,使用一个稍大的缓冲区再次调用。使用 getOutputSize 确定输出缓冲区应为多大。

结束时,此方法将把此 cipher 对象重置为上一次调用 init 初始化得到的状态。即重置该对象,可供加密或解密(取决于调用 init 时指定的操作模式)更多的数据。

注:如果抛出了任何异常,则再次使用此 cipher 对象前,可能需要将其重置。

参数:
output - 用于保存结果的缓冲区
outputOffset - output 中的偏移量,即结果保存的位置
返回:
output 中存储的字节数
抛出:
IllegalStateException - 如果此 cipher 处于错误的状态(例如,尚未初始化)
IllegalBlockSizeException - 如果此 cipher 为块 cipher,未请求任何填充(只针对加密模式),并且由此 cipher 处理的数据总输入长度不是块大小的倍数,如果此加密算法无法处理所提供的输入数据。
ShortBufferException - 如果给定的输出缓冲区太小无法保存结果
BadPaddingException - 如果 cipher 为解密模式,并且未请求填充或不填充,但解密的数据没有用适当的填充字节所限制

doFinal

public final byte[] doFinal(byte[] input)
                     throws IllegalBlockSizeException,
                            BadPaddingException
按单部分操作加密或解密数据,或者结束一个多部分操作。数据被加密还是解密取决于此 cipher 的初始化方式。

处理 input 缓冲区中的字节以及可能在上一次 update 操作中已缓存的任何输入字节,其中应用了填充(如果请求)。结果存储在新缓冲区中。

结束时,此方法将把此 cipher 对象重置为上一次调用 init 初始化得到的状态。即重置该对象,可供加密或解密(取决于调用 init 时指定的操作模式)更多的数据。

注:如果抛出了任何异常,则再次使用此 cipher 对象前,可能需要将其重置。

参数:
input - 输入缓冲区
返回:
存储结果的新缓冲区
抛出:
IllegalStateException - 如果此 cipher 处于错误的状态(例如,尚未初始化)
IllegalBlockSizeException - 如果此 cipher 为块 cipher,未请求任何填充(只针对加密模式),并且由此 cipher 处理的数据总输入长度不是块大小的倍数,如果此加密算法无法处理所提供的输入数据。
BadPaddingException - 如果此 cipher 为解密模式,并且未请求填充或不填充,但解密的数据没有用适当的填充字节所限制

doFinal

public final byte[] doFinal(byte[] input,
                            int inputOffset,
                            int inputLen)
                     throws IllegalBlockSizeException,
                            BadPaddingException
按单部分操作加密或解密数据,或者结束一个多部分操作。数据被加密还是解密取决于此 cipher 的初始化方式。

处理 input 缓冲区中从 inputOffset 开始(包含)的前 inputLen 个字节以及可能在上一次 update 操作过程中已缓存的任何输入字节,其中应用了填充(如果需要)。结果存储在新缓冲区中。

结束时,此方法将把此 cipher 对象重置为上一次调用 init 初始化得到的状态。即重置该对象,可供加密或解密(取决于调用 init 时指定的操作模式)更多的数据。

注:如果抛出了任何异常,则再次使用此 cipher 对象前,可能需要将其重置。

参数:
input - 输入缓冲区
inputOffset - input 中输入开始位置的偏移量
inputLen - 输入长度
返回:
存储结果的新缓冲区
抛出:
IllegalStateException - 如果此 cipher 处于错误的状态(例如,尚未初始化)
IllegalBlockSizeException - 如果此 cipher 为块 cipher,未请求任何填充(只针对加密模式),并且由此 cipher 处理的数据总输入长度不是块大小的倍数,如果此加密算法无法处理所提供的输入数据。
BadPaddingException - 如果此 cipher 为解密模式,并且未请求填充或不填充,但解密的数据没有用适当的填充字节所限制

doFinal

public final int doFinal(byte[] input,
                         int inputOffset,
                         int inputLen,
                         byte[] output)
                  throws ShortBufferException,
                         IllegalBlockSizeException,
                         BadPaddingException
按单部分操作加密或解密数据,或者结束一个多部分操作。数据被加密还是解密取决于此 cipher 的初始化方式。

处理 input 缓冲区中从 inputOffset 开始(包含)的前 inputLen 个字节以及可能在上一次 update 操作过程中已缓存的任何输入字节,其中应用了填充(如果需要)。结果存储在 output 缓冲区中。

如果 output 缓冲区太小无法保存该结果,则抛出 ShortBufferException。这种情况下,使用一个稍大的缓冲区再次调用。使用 getOutputSize 确定输出缓冲区应为多大。

结束时,此方法将把此 cipher 对象重置为上一次调用 init 初始化得到的状态。即重置该对象,可供加密或解密(取决于调用 init 时指定的操作模式)更多的数据。

注:如果抛出了任何异常,则再次使用此 cipher 对象前,可能需要将其重置。

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

参数:
input - 输入缓冲区
inputOffset - input 中输入开始位置的偏移量
inputLen - 输入长度
output - 保存结果的缓冲区
返回:
output 中存储的字节数
抛出:
IllegalStateException - 如果此 cipher 处于错误的状态(例如,尚未初始化)
IllegalBlockSizeException - 如果此 cipher 为块 cipher,未请求任何填充(只针对加密模式),并且由此 cipher 处理的数据总输入长度不是块大小的倍数,如果此加密算法无法处理所提供的输入数据。
ShortBufferException - 如果给定的输出缓冲区太小无法保存结果
BadPaddingException - 如果 cipher 为解密模式,并且未请求填充或不填充,但解密的数据没有用适当的填充字节所限制

doFinal

public final int doFinal(byte[] input,
                         int inputOffset,
                         int inputLen,
                         byte[] output,
                         int outputOffset)
                  throws ShortBufferException,
                         IllegalBlockSizeException,
                         BadPaddingException
按单部分操作加密或解密数据,或者结束一个多部分操作。数据被加密还是解密取决于此 cipher 的初始化方式。

处理 input 缓冲区中从 inputOffset 开始(包含)的前 inputLen 个字节以及可能在上一次 update 操作过程中已缓存的任何输入字节,其中应用了填充(如果需要)。结果存储在 output 缓冲区中从 outputOffset(包含)开始的位置。

如果 output 缓冲区太小无法保存该结果,则抛出 ShortBufferException。这种情况下,使用一个稍大的缓冲区再次调用。使用 getOutputSize 确定输出缓冲区应为多大。

结束时,此方法将把此 cipher 对象重置为上一次调用 init 初始化得到的状态。即重置该对象,可供加密或解密(取决于调用 init 时指定的操作模式)更多的数据。

注:如果抛出了任何异常,则再次使用此 cipher 对象前,可能需要将其重置。

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

参数:
input - 输入缓冲区
inputOffset - input 中输入开始位置的偏移量
inputLen - 输入长度
output - 保存结果的缓冲区
outputOffset - output 中存储结果的位置的偏移量
返回:
output 中存储的字节数
抛出:
IllegalStateException - 如果此 cipher 处于错误的状态(例如,尚未初始化)
IllegalBlockSizeException - 如果此 cipher 为块 cipher,未请求任何填充(只针对加密模式),并且由此 cipher 处理的数据总输入长度不是块大小的倍数,如果此加密算法无法处理所提供的输入数据。
ShortBufferException - 如果给定的输出缓冲区太小无法保存结果
BadPaddingException - 如果 cipher 为解密模式,并且未请求填充或不填充,但解密的数据没有用适当的填充字节所限制

doFinal

public final int doFinal(ByteBuffer input,
                         ByteBuffer output)
                  throws ShortBufferException,
                         IllegalBlockSizeException,
                         BadPaddingException
按单部分操作加密或解密数据,或者结束一个多部分操作。数据被加密还是解密取决于此 cipher 的初始化方式。

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

如果 output.remaining() 个字节还不够保存该结果,则抛出 ShortBufferException。这种情况下,使用一个稍大的缓冲区再次调用。使用 getOutputSize 确定输出缓冲区应为多大。

结束时,此方法将把此 cipher 对象重置为上一次调用 init 初始化得到的状态。即重置该对象,可供加密或解密(取决于调用 init 时指定的操作模式)更多的数据。

注:如果抛出了任何异常,则再次使用此 cipher 对象前,可能需要将其重置。

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

参数:
input - 输入 ByteBuffer
output - 输出 ByteBuffer
返回:
output 中存储的字节数
抛出:
IllegalStateException - 如果此 cipher 处于错误的状态(例如,尚未初始化)
IllegalArgumentException - 如果输入和输出为相同的对象
ReadOnlyBufferException - 如果输出缓冲区为只读
IllegalBlockSizeException - 如果此 cipher 为块 cipher,未请求任何填充(只针对加密模式),并且由此 cipher 处理的数据总输入长度不是块大小的倍数;如果此加密算法无法处理所提供的输入数据。
ShortBufferException - 如果输出缓冲区没有足够的空间
BadPaddingException - 如果 cipher 为解密模式,并且未请求填充或不填充,但解密的数据没有用适当的填充字节所限制
从以下版本开始:
1.5

wrap

public final byte[] wrap(Key key)
                  throws IllegalBlockSizeException,
                         InvalidKeyException
将密钥包装。

参数:
key - 要包装的密钥。
返回:
已包装的密钥。
抛出:
IllegalStateException - 如果此 cipher 处于错误的状态(例如,尚未初始化)
IllegalBlockSizeException - 如果此 cipher 为块 cipher,未请求填充,并且要包装的密钥的编码长度不是块大小的倍数。
InvalidKeyException - 如果不可能用此 cipher 包装该密钥,或这样做不安全(例如,将一个硬件保护的密钥传给只要求软件保护的 cipher)。

unwrap

public final Key unwrap(byte[] wrappedKey,
                        String wrappedKeyAlgorithm,
                        int wrappedKeyType)
                 throws InvalidKeyException,
                        NoSuchAlgorithmException
打开一个以前包装的密钥。

参数:
wrappedKey - 要打开的密钥。
wrappedKeyAlgorithm - 与此包装密钥关联的算法。
wrappedKeyType - 已包装密钥的类型。此类型必须为 SECRET_KEYPRIVATE_KEYPUBLIC_KEY 之一。
返回:
打开的密钥。
抛出:
IllegalStateException - 如果此 cipher 处于错误的状态(例如,尚未初始化)
NoSuchAlgorithmException - 如果没有一个已安装的提供程序能够为 wrappedKeyAlgorithm 创建类型为 wrappedKeyType 的密钥。
InvalidKeyException - 如果 wrappedKey 并不为 wrappedKeyAlgorithm 表示类型为 wrappedKeyType 的已包装密钥。

getMaxAllowedKeyLength

public static final int getMaxAllowedKeyLength(String transformation)
                                        throws NoSuchAlgorithmException
根据所安装的 JCE 仲裁策略文件返回指定转换的最大密钥长度。如果安装了 JCE 无限制强度仲裁策略文件,则返回 Integer.MAX_VALUE。有关 JCE 仲裁策略文件中的默认密钥大小的更多信息,请参见 JCE Reference Guide 中的附录 E。

参数:
transformation - cipher 转换。
返回:
最大密钥长度(以位为单位) 或 Integer.MAX_VALUE。
抛出:
NullPointerException - 如果 transformation 为 null。
NoSuchAlgorithmException - 如果 transformation 不是有效的转换,即格式不为“算法”或“算法/模式/填充”。
从以下版本开始:
1.5

getMaxAllowedParameterSpec

public static final AlgorithmParameterSpec getMaxAllowedParameterSpec(String transformation)
                                                               throws NoSuchAlgorithmException
根据仲裁策略文件返回包含最大 cipher 参数值的 AlgorithmParameterSpec 对象。如果安装了 JCE 无限制强度仲裁策略文件,或者策略文件中对适用于指定转换的参数没有最大限制,则返回 null。

参数:
transformation - cipher 转换。
返回:
保存最大值或 null 的 AlgorithmParameterSpec。
抛出:
NullPointerException - 如果 transformation 为 null。
NoSuchAlgorithmException - 如果 transformation 不是有效的转换,即格式不为“算法”或“算法/模式/填充”。
从以下版本开始:
1.5

JavaTM 2 Platform
Standard Ed. 5.0

提交错误或意见
有关更多的 API 参考资料和开发人员文档,请参阅 Java 2 SDK SE 开发人员文档。该文档包含更详细的、面向开发人员的描述,以及总体概述、术语定义、使用技巧和工作代码示例。

版权所有 2004 Sun Microsystems, Inc. 保留所有权利。 请遵守许可证条款。另请参阅文档重新分发政策