public class Cipher extends Object
为了创建一个Cipher对象,应用程序调用Cipher的getInstance
方法,并将所请求的转换的名称传递给它。 可选地,可以指定提供者的名称。
转换是描述要在给定输入上执行的操作(或操作集)的字符串,以产生一些输出。 转换总是包括加密算法的名称(例如, DES ),并且可以跟随有反馈模式和填充方案。
转换形式如下:
(在后一种情况下,使用模式和填充方案的提供者特定的默认值)。 例如,以下是有效的转换:
Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");
使用诸如CFB
和OFB
之类的模式,块密码可以以比密码的实际块大OFB
单位加密数据。
当请求这样的模式时,您可以通过将该号码追加到“ DES/CFB8/NoPadding
”和“ DES/OFB32/PKCS5Padding
”转换中所示的模式名称来选择DES/OFB32/PKCS5Padding
位数。
如果没有指定此类号码,则使用特定于提供者的默认值。
(例如,SunJCE提供程序对DES使用默认值为64位)。因此,通过使用诸如CFB8或OFB8之类的8位模式,块密码可以转换为面向字节的流密码。
诸如使用关联数据的认证加密(AEAD)等模式为机密数据和未加密的附加关联数据(AAD)提供真实性保证。 (有关AEAD和AEAD算法(如GCM / CCM)的更多信息,请参阅RFC 5116 )计算认证标签时可以使用机密数据和AAD数据(类似于Mac
)。 该标签在加密期间附加到密文,并在解密后进行验证。
AEAD模式如GCM / CCM在开始密文真实性计算之前执行所有的AAD真实性计算。 为了避免必须在内部缓冲器的密文实施方案中,所有数据AAD必须提供给GCM / CCM的实现(经由updateAAD
方法)密文被处理之前 (通过update
种doFinal
方法)。
注意,GCM模式对于使用给定密钥加密的IV具有唯一性要求。 当GCM加密重复IVs时,这些用法将遭受伪造攻击。 因此,在使用GCM模式的每个加密操作之后,呼叫者应该使用具有不同IV值的GCM参数重新初始化密码对象。
GCMParameterSpec s = ...;
cipher.init(..., s);
// If the GCM parameters were generated by the provider, it can
// be retrieved by:
// cipher.getParameters().getParameterSpec(GCMParameterSpec.class);
cipher.updateAAD(...); // AAD
cipher.update(...); // Multi-part update
cipher.doFinal(...); // conclusion of operation
// Use a different IV value for every encryption
byte[] newIv = ...;
s = new GCMParameterSpec(s.getTLen(), newIv);
cipher.init(..., s);
...
Java平台的每个实现都需要支持以下标准Cipher
转换,括号中的键入:
KeyGenerator
, SecretKey
Modifier and Type | Field and Description |
---|---|
static int |
DECRYPT_MODE
常数用于将密码初始化为解密模式。
|
static int |
ENCRYPT_MODE
常数用于将密码初始化为加密模式。
|
static int |
PRIVATE_KEY
用于指示要解除密钥的常数是“私钥”。
|
static int |
PUBLIC_KEY
用于指示待解除密钥的常数是“公钥”。
|
static int |
SECRET_KEY
用于指示要解开的密钥的常数是“密钥”。
|
static int |
UNWRAP_MODE
常数用于将密码初始化为密钥解包模式。
|
static int |
WRAP_MODE
常数用于将密码初始化为密钥包装模式。
|
Modifier | Constructor and Description |
---|---|
protected |
Cipher(CipherSpi cipherSpi, Provider provider, String transformation)
创建一个Cipher对象。
|
Modifier and Type | Method and Description |
---|---|
byte[] |
doFinal()
完成多部分加密或解密操作,这取决于该密码如何初始化。
|
byte[] |
doFinal(byte[] input)
在单一部分操作中加密或解密数据,或完成多部分操作。
|
int |
doFinal(byte[] output, int outputOffset)
完成多部分加密或解密操作,这取决于该密码如何初始化。
|
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()
返回与此密码一起使用的豁免机制对象。
|
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)
返回一个AlgorithmParameterSpec对象,该对象包含根据管辖区策略文件的最大密码参数值。
|
int |
getOutputSize(int inputLen)
给定输入长度
inputLen (以字节为单位),返回输出缓冲区需要保存下一个
update 或
doFinal 操作的结果的字节长度。
|
AlgorithmParameters |
getParameters()
返回与此密码一起使用的参数。
|
Provider |
getProvider()
返回此
Cipher 对象的提供者。
|
void |
init(int opmode, Certificate certificate)
使用给定证书中的公钥初始化此密码。
|
void |
init(int opmode, Certificate certificate, SecureRandom random)
使用给定证书中的公钥和随机源初始化此密码。
|
void |
init(int opmode, Key key)
用密钥初始化此密码。
|
void |
init(int opmode, Key key, AlgorithmParameters params)
使用密钥和一组算法参数初始化此密码。
|
void |
init(int opmode, Key key, AlgorithmParameterSpec params)
使用密钥和一组算法参数初始化此密码。
|
void |
init(int opmode, Key key, AlgorithmParameterSpec params, SecureRandom random)
使用密钥,一组算法参数和随机源初始化此密码。
|
void |
init(int opmode, Key key, AlgorithmParameters params, SecureRandom random)
使用密钥,一组算法参数和随机源初始化此密码。
|
void |
init(int opmode, Key key, SecureRandom random)
用密钥和随机源初始化此密码。
|
Key |
unwrap(byte[] wrappedKey, String wrappedKeyAlgorithm, int wrappedKeyType)
打开以前包装的钥匙。
|
byte[] |
update(byte[] input)
继续进行多部分加密或解密操作(取决于如何初始化该密码),处理另一个数据部分。
|
byte[] |
update(byte[] input, int inputOffset, int inputLen)
继续进行多部分加密或解密操作(取决于如何初始化该密码),处理另一个数据部分。
|
int |
update(byte[] input, int inputOffset, int inputLen, byte[] output)
继续进行多部分加密或解密操作(取决于如何初始化该密码),处理另一个数据部分。
|
int |
update(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset)
继续进行多部分加密或解密操作(取决于如何初始化该密码),处理另一个数据部分。
|
int |
update(ByteBuffer input, ByteBuffer output)
继续进行多部分加密或解密操作(取决于如何初始化该密码),处理另一个数据部分。
|
void |
updateAAD(byte[] src)
继续进行附加认证数据(AAD)的多部分更新。
|
void |
updateAAD(byte[] src, int offset, int len)
使用所提供的缓冲区的子集,继续进行附加认证数据(AAD)的多部分更新。
|
void |
updateAAD(ByteBuffer src)
继续进行附加认证数据(AAD)的多部分更新。
|
byte[] |
wrap(Key key)
包裹钥匙
|
public static final int ENCRYPT_MODE
public static final int DECRYPT_MODE
public static final int WRAP_MODE
public static final int UNWRAP_MODE
public static final int PUBLIC_KEY
public static final int PRIVATE_KEY
public static final int SECRET_KEY
public static final Cipher getInstance(String transformation) throws NoSuchAlgorithmException, NoSuchPaddingException
Cipher
对象。
此方法遍历已注册的安全提供程序列表,从最优选的提供程序开始。 返回从支持指定算法的第一个Provider中封装CipherSpi实现的新Cipher对象。
请注意,注册提供商的列表可以通过Security.getProviders()
方法检索 。
transformation
- 转换的名称,例如DES / CBC / PKCS5Padding 。
有关标准转换名称的信息,请参阅Java Cryptography Architecture Standard Algorithm Name Documentation中的“密码”部分。
NoSuchAlgorithmException
- 如果
transformation
为空,为空,以无效格式,或者如果没有提供者支持指定算法的CipherSpi实现。
NoSuchPaddingException
- 如果
transformation
包含
transformation
用的填充方案。
Provider
public static final Cipher getInstance(String transformation, String provider) throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException
Cipher
对象。
返回从指定提供程序封装CipherSpi实现的新Cipher对象。 指定的提供者必须在安全提供程序列表中注册。
请注意,注册提供商的列表可以通过Security.getProviders()
方法检索 。
transformation
- 转换的名称,例如DES / CBC / PKCS5Padding 。
有关标准转换名称的信息,请参阅Java Cryptography Architecture Standard Algorithm Name Documentation中的“密码”部分。
provider
- 提供者的名称。
NoSuchAlgorithmException
- 如果
transformation
为空,为空,格式为无效,或者指定的算法的CipherSpi实现不能从指定的提供者获得。
NoSuchProviderException
- 如果指定的提供程序未在安全提供程序列表中注册。
NoSuchPaddingException
- 如果
transformation
包含
transformation
用的填充方案。
IllegalArgumentException
- 如果
provider
为空或为空。
Provider
public static final Cipher getInstance(String transformation, Provider provider) throws NoSuchAlgorithmException, NoSuchPaddingException
Cipher
对象。
返回从指定的Provider对象封装CipherSpi实现的新Cipher对象。 请注意,指定的Provider对象不必在提供者列表中注册。
transformation
- 转换的名称,例如DES / CBC / PKCS5Padding 。
有关标准转换名称的信息,请参阅Java Cryptography Architecture Standard Algorithm Name Documentation中的密码部分。
provider
- 提供商。
NoSuchAlgorithmException
- 如果
transformation
为空,为空,为无效格式,或者指定的算法的CipherSpi实现不能从指定的Provider对象获得。
NoSuchPaddingException
- 如果
transformation
包含
transformation
用的填充方案。
IllegalArgumentException
- 如果
provider
为空。
Provider
public final Provider getProvider()
Cipher
对象的提供者。
Cipher
对象的提供者
public final String getAlgorithm()
Cipher
对象的算法名称。
这是在创建此Cipher
对象的getInstance
呼叫之一中指定的getInstance
。
Cipher
。
public final int getBlockSize()
public final int getOutputSize(int inputLen)
inputLen
(以字节为单位),返回输出缓冲区需要保存下一个update
或doFinal
操作结果的字节长度。
此呼叫考虑了来自前一次update
呼叫,填充和update
标记的任何未处理(缓冲)数据。
下一个update
或doFinal
调用的实际输出长度可能小于此方法返回的长度。
inputLen
- 输入长度(以字节为单位)
IllegalStateException
- 如果此密码处于错误状态(例如尚未初始化)
public final byte[] getIV()
这在创建随机IV的情况下或在基于密码的加密或解密的情况下是有用的,其中IV是从用户提供的密码导出的。
public final AlgorithmParameters getParameters()
返回的参数可能与用于初始化此密码的参数相同,或者如果该密码需要算法参数但未被任何初始化,则可能包含底层密码实现使用的默认值和随机参数值的组合。
public final ExemptionMechanism getExemptionMechanism()
public final void init(int opmode, Key key) throws InvalidKeyException
根据opmode的值,对以下四个操作之一进行密码初始化:加密,解密,密钥包装或密钥解opmode
。
如果此密码需要不能从给定的key
导出的任何key
,则底层密码实现应该自动生成所需参数(使用提供者特定的默认值或随机值),如果它被初始化为加密或密钥包装,以及引发InvalidKeyException
,如果它被用于解密或密钥打开初始化。 生成的参数可以使用getParameters
或getIV
(如果参数是IV)来检索。
如果该密码需要不能从输入参数导出的算法参数,并且没有合理的提供者特定的默认值,则初始化必然会失败。
如果此cipher(包括其基础反馈或填充方案)需要随机字节(例如,用于参数生成),那么将使用让他们SecureRandom
实现的最高优先级安装的提供作为随机源。 (如果没有一个已安装的提供商提供SecureRandom的实现,将会使用系统提供的随机源。)
请注意,当一个Cipher对象被初始化时,它将失去所有先前获取的状态。 换句话说,初始化一个Cipher相当于创建一个新的Cipher实例并对其进行初始化。
opmode
-此cipher的操作模式(这是下列之一:
ENCRYPT_MODE
,
DECRYPT_MODE
,
WRAP_MODE
或
UNWRAP_MODE
)
key
- 关键
InvalidKeyException
- 如果给定的密钥不适于初始化该密码,或者需要不能从给定密钥确定的算法参数,或者给定的密钥具有超过最大允许密钥大小的密钥大小(从配置的管辖区策略文件确定) 。
UnsupportedOperationException
- if(@code opmode)是
WRAP_MODE
或
UNWRAP_MODE
但是模式不是由底层的
CipherSpi
。
public final void init(int opmode, Key key, SecureRandom random) throws InvalidKeyException
根据opmode的值,密码被初始化为以下四个操作之一:加密,解密,密钥包装或密钥解opmode
。
如果此密码需要不能从给定的key
导出的任何key
,则底层加密实现应该自动生成所需参数(使用提供者特定的默认值或随机值),如果它被初始化为加密或密钥包装,以及提高一个InvalidKeyException
如果它被初始化解密或密钥解包。 生成的参数可以使用getParameters
或getIV
(如果参数是IV)来检索。
如果该密码需要不能从输入参数导出的算法参数,并且没有合理的提供者特定的默认值,则初始化必然会失败。
如果这个密码(包括其底层反馈或填充方案)需要任何随机字节(例如,用于参数生成),它将从random
。
请注意,当一个Cipher对象被初始化时,它将失去所有先前获取的状态。 换句话说,初始化一个Cipher相当于创建一个新的Cipher实例并对其进行初始化。
opmode
-此cipher的操作模式(这是下列之一:
ENCRYPT_MODE
,
DECRYPT_MODE
,
WRAP_MODE
或
UNWRAP_MODE
)
key
- 加密密钥
random
-
random
的来源
InvalidKeyException
- 如果给定的密钥不适于初始化该密码,或者需要不能从给定密钥确定的算法参数,或者给定密钥具有超过最大允许密钥大小的密钥大小(从配置的管辖区策略文件确定) 。
UnsupportedOperationException
- if(@code opmode)是
WRAP_MODE
或
UNWRAP_MODE
但是模式不是由底层的
CipherSpi
。
public final void init(int opmode, Key key, AlgorithmParameterSpec params) throws InvalidKeyException, InvalidAlgorithmParameterException
根据opmode的值,密码被初始化为以下四个操作之一:加密,解密,密钥包装或密钥解opmode
。
如果此密码需要任何算法参数,并且params
为null,则底层加密实现应该自动生成必需的参数(使用特定于提供者的默认值或随机值),如果它被初始化为加密或密钥包装,并提出一个InvalidAlgorithmParameterException
if正在为解密或密钥解包进行初始化。 可以使用getParameters
或getIV
(如果参数为IV)检索生成的参数。
如果该密码需要不能从输入参数导出的算法参数,并且没有合理的提供者特定的默认值,则初始化必然会失败。
如果此cipher(包括其基础反馈或填充方案)需要随机字节(例如,用于参数生成),那么将使用让他们SecureRandom
实现的最高优先级安装的提供作为随机源。 (如果没有一个已安装的提供商提供SecureRandom的实现,将会使用系统提供的随机源。)
请注意,当一个Cipher对象被初始化时,它将失去所有先前获取的状态。 换句话说,初始化一个Cipher相当于创建一个新的Cipher实例并对其进行初始化。
opmode
-此cipher的操作模式(这是下列之一:
ENCRYPT_MODE
,
DECRYPT_MODE
,
WRAP_MODE
或
UNWRAP_MODE
)
key
- 加密密钥
params
- 算法参数
InvalidKeyException
- 如果给定的密钥不适合初始化此密码,或者其keysize超出了最大允许密钥大小(从配置的管辖区策略文件确定)。
InvalidAlgorithmParameterException
- 如果给定的算法参数不适合此密码,或该密码需要算法参数,并且
params
为空,或者给定的算法参数意味着超过合法限制(由配置的管辖区策略文件确定)的加密强度。
UnsupportedOperationException
- if(@code opmode)是
WRAP_MODE
或
UNWRAP_MODE
但是模式不是由底层的
CipherSpi
。
public final void init(int opmode, Key key, AlgorithmParameterSpec params, SecureRandom random) throws InvalidKeyException, InvalidAlgorithmParameterException
根据opmode的值,将密码初始化为以下四个操作之一:加密,解密,密钥包装或密钥解opmode
。
如果此密码需要任何算法参数,并且params
为null,则底层加密实现应该自动生成所需参数(使用特定于提供者的默认值或随机值),如果它被初始化为加密或密钥包装,并且提出一个InvalidAlgorithmParameterException
if正在为解密或密钥解包进行初始化。 生成的参数可以使用getParameters
或getIV
(如果参数是IV)来检索。
如果该密码需要不能从输入参数导出的算法参数,并且没有合理的提供者特定的默认值,则初始化必然会失败。
如果这个密码(包括其底层的反馈或填充方案)需要任何随机字节(例如,用于参数生成),它将从random
。
请注意,当一个Cipher对象被初始化时,它将失去所有先前获取的状态。 换句话说,初始化一个Cipher相当于创建一个新的Cipher实例并对其进行初始化。
opmode
-此cipher的操作模式(这是下列之一:
ENCRYPT_MODE
,
DECRYPT_MODE
,
WRAP_MODE
或
UNWRAP_MODE
)
key
- 加密密钥
params
- 算法参数
random
-
random
的来源
InvalidKeyException
- 如果给定的密钥不适合初始化该密码,或者其keysize超过最大允许密钥大小(从配置的管辖区策略文件确定)。
InvalidAlgorithmParameterException
- 如果给定的算法参数不适用于此密码,或者该密码需要算法参数,并且
params
为空,或者给定的算法参数意味着超过法定限制(由配置的管辖区策略文件确定)的加密强度。
UnsupportedOperationException
- if(@code opmode)是
WRAP_MODE
或
UNWRAP_MODE
但是模式不是由底层的
CipherSpi
。
public final void init(int opmode, Key key, AlgorithmParameters params) throws InvalidKeyException, InvalidAlgorithmParameterException
根据opmode的值,对以下四个操作之一进行密码初始化:加密,解密,密钥包装或密钥解opmode
。
如果此密码需要任何算法参数,并且params
为null,则底层加密实现应该自动生成所需参数(使用特定于提供者的默认值或随机值),如果它被初始化为加密或密钥包装,并且提出一个InvalidAlgorithmParameterException
if正在为解密或密钥解包进行初始化。 可以使用getParameters
或getIV
(如果参数为IV)来检索 生成的参数。
如果该密码需要不能从输入参数导出的算法参数,并且没有合理的提供者特定的默认值,则初始化必然会失败。
如果此cipher(包括其基础反馈或填充方案)需要随机字节(例如,用于参数生成),那么将使用让他们SecureRandom
实现的最高优先级安装的提供作为随机源。 (如果没有一个已安装的提供商提供SecureRandom的实现,将会使用系统提供的随机源。)
请注意,当一个Cipher对象被初始化时,它将失去所有先前获取的状态。 换句话说,初始化一个Cipher相当于创建一个新的Cipher实例并对其进行初始化。
opmode
-此cipher的操作模式(这是下列之一:
ENCRYPT_MODE
,
DECRYPT_MODE
,
WRAP_MODE
或
UNWRAP_MODE
)
key
- 加密密钥
params
- 算法参数
InvalidKeyException
- 如果给定的密钥不适用于初始化该密码,或者其keysize超过最大允许密钥大小(从配置的管辖区策略文件确定)。
InvalidAlgorithmParameterException
- 如果给定的算法参数不适合此密码,或该密码需要算法参数,并且
params
为空,或者给定的算法参数意味着超过法定限制(由配置的管辖区策略文件确定)的加密强度。
UnsupportedOperationException
- if(@code opmode)是
WRAP_MODE
或
UNWRAP_MODE
但是模式不是由底层的
CipherSpi
。
public final void init(int opmode, Key key, AlgorithmParameters params, SecureRandom random) throws InvalidKeyException, InvalidAlgorithmParameterException
根据opmode的值,对以下四个操作之一进行密码初始化:加密,解密,密钥包装或密钥解opmode
。
如果此密码需要任何算法参数,并且params
为null,则底层加密实现应该自动生成所需参数(使用特定于提供者的默认值或随机值),如果它被初始化为加密或密钥包装,并且提出一个InvalidAlgorithmParameterException
if正在为解密或密钥解包进行初始化。 生成的参数可以使用getParameters
或getIV
(如果参数是IV)来检索。
如果该密码需要不能从输入参数导出的算法参数,并且没有合理的提供者特定的默认值,则初始化必然会失败。
如果这个密码(包括其底层的反馈或填充方案)需要任何随机字节(例如,用于参数生成),它将从random
。
请注意,当一个Cipher对象被初始化时,它将失去所有先前获取的状态。 换句话说,初始化一个Cipher相当于创建一个新的Cipher实例并对其进行初始化。
opmode
-此cipher的操作模式(这是下列之一:
ENCRYPT_MODE
,
DECRYPT_MODE
,
WRAP_MODE
或
UNWRAP_MODE
)
key
- 加密密钥
params
- 算法参数
random
-
random
的来源
InvalidKeyException
- 如果给定的密钥不适用于初始化该密码,或者其keysize超过了允许的最大密钥大小(由配置的管辖区策略文件确定)。
InvalidAlgorithmParameterException
- 如果给定的算法参数不适合此密码,或者该密码需要算法参数,并且
params
为空,或者给定的算法参数意味着超过法定限制(由配置的管辖区策略文件确定)的加密强度。
UnsupportedOperationException
- if(@code opmode)是
WRAP_MODE
或
UNWRAP_MODE
但是模式不是由底层的
CipherSpi
。
public final void init(int opmode, Certificate certificate) throws InvalidKeyException
根据opmode的值,将密码初始化为以下四个操作之一:加密,解密,密钥包装或密钥解opmode
。
如果证书是类型X.509,并且密钥使用扩展字段被标记为关键,并且密钥使用扩展字段的值意味着证书中的公钥及其相应的私钥不应被用于由的值表示操作opmode
,一个InvalidKeyException
被抛出。
如果该密码需要任何不能从给定证书中的公开密钥导出的算法参数,则底层密码实现应该自动生成所需参数(使用特定于提供者的默认值或随机值),如果它被初始化为加密,密钥包装,并提出一个InvalidKeyException
如果它被初始化解密或密钥解包。 生成的参数可以使用getParameters
或getIV
(如果参数为IV)检索。
如果该密码需要不能从输入参数导出的算法参数,并且没有合理的提供者特定的默认值,则初始化必然会失败。
如果此cipher(包括其基础反馈或填充方案)需要随机字节(例如,用于参数生成),那么将使用让他们SecureRandom
实现的最高优先级安装的提供作为随机源。 (如果没有一个已安装的提供商提供SecureRandom的实现,将会使用系统提供的随机源。)
请注意,当一个Cipher对象被初始化时,它将失去所有先前获取的状态。 换句话说,初始化一个Cipher相当于创建一个新的Cipher实例并对其进行初始化。
opmode
-此cipher的操作模式(这是下列之一:
ENCRYPT_MODE
,
DECRYPT_MODE
,
WRAP_MODE
或
UNWRAP_MODE
)
certificate
- 证书
InvalidKeyException
- 如果给定证书中的公钥不适合初始化该密码,或者该密码需要不能从给定证书中的公钥确定的算法参数,或给定证书中的公钥密钥大小具有密钥长度超过最大允许密钥大小(由配置的管辖区策略文件确定)。
UnsupportedOperationException
- if(@code opmode)是
WRAP_MODE
或
UNWRAP_MODE
但是模式不是由底层的
CipherSpi
。
public final void init(int opmode, Certificate certificate, SecureRandom random) throws InvalidKeyException
根据opmode的值,密码被初始化为以下四个操作之一:加密,解密,密钥包装或密钥解opmode
。
如果证书是类型X.509,并且密钥使用扩展字段被标记为关键,并且密钥使用扩展字段的值意味着证书中的公钥及其相应的私钥不应被用于由的值表示操作opmode
,一个InvalidKeyException
被抛出。
如果此密码需要在给定的certificate
中无法从公钥中certificate
的任何算法certificate
,则底层加密实现应该自动生成所需参数(使用特定于提供者的默认值或随机值),如果它被初始化为加密,密钥包装,并提出一个InvalidKeyException
如果它被初始化解密或密钥解包。 可以使用getParameters
或getIV
(如果参数为IV)检索生成的参数。
如果该密码需要不能从输入参数导出的算法参数,并且没有合理的提供者特定的默认值,则初始化必然会失败。
如果这个密码(包括其底层反馈或填充方案)需要任何随机字节(例如,用于参数生成),它将从random
。
请注意,当一个Cipher对象被初始化时,它将失去所有先前获取的状态。 换句话说,初始化一个Cipher相当于创建一个新的Cipher实例并对其进行初始化。
opmode
-此cipher的操作模式(这是下列之一:
ENCRYPT_MODE
,
DECRYPT_MODE
,
WRAP_MODE
或
UNWRAP_MODE
)
certificate
- 证书
random
-
random
的来源
InvalidKeyException
- 如果给定证书中的公钥不适于初始化该密码,或者该密码需要不能根据给定证书中的公钥确定算法参数,或给定证书中的公钥密钥大小具有密钥长度超过最大允许密钥大小(由配置的管辖区策略文件确定)。
UnsupportedOperationException
- if(@code opmode)是
WRAP_MODE
或
UNWRAP_MODE
但是模式不是由底层的
CipherSpi
。
public final byte[] update(byte[] input)
处理input
缓冲区中的字节,结果存储在新的缓冲区中。
如果input
的长度为零,此方法返回null
。
input
- 输入缓冲区
IllegalStateException
- 如果此密码处于错误状态(例如,尚未初始化)
public final byte[] update(byte[] input, int inputOffset, int inputLen)
第一inputLen
字节在input
缓冲区中,从inputOffset
以下,被处理,并且结果被存储在新的缓冲器。
如果inputLen
为零,此方法返回null
。
input
- 输入缓冲区
inputOffset
-
input
中的输入开始的偏移量
inputLen
- 输入长度
IllegalStateException
- 如果此密码处于错误状态(例如,尚未初始化)
public final int update(byte[] input, int inputOffset, int inputLen, byte[] output) throws ShortBufferException
input
缓冲区中的第一个inputLen
字节(从input
开始, inputOffset
处理)被处理,结果存储在output
缓冲区中。
如果output
缓冲区太小而不能保存结果,则抛出ShortBufferException
。 在这种情况下,使用较大的输出缓冲区重复此呼叫。 使用getOutputSize
来确定输出缓冲区应该有多大。
如果inputLen
为零,则此方法返回零长度。
注意:该方法应该是安全的,这意味着input
和output
缓冲区可以引用相同的字节数组,当结果被复制到输出缓冲区中时,没有未处理的输入数据被覆盖。
input
- 输入缓冲区
inputOffset
-
input
中的输入开始的偏移量
inputLen
- 输入长度
output
- 结果的缓冲区
output
中的字节数
IllegalStateException
- 如果此密码处于错误状态(例如,尚未初始化)
ShortBufferException
- 如果给定的输出缓冲区太小,不能保存结果
public final int update(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset) throws ShortBufferException
第一inputLen
字节在input
缓冲区中,从inputOffset
以下,被处理,并且结果被存储在output
缓冲区中,从outputOffset
以下。
如果output
缓冲区太小而不能保存结果,则抛出ShortBufferException
。 在这种情况下,使用较大的输出缓冲区重复此呼叫。 使用getOutputSize
来确定输出缓冲区应该有多大。
如果inputLen
为零,则此方法返回零长度。
注意:该方法应该是复制安全的,这意味着input
和output
缓冲区可以引用相同的字节数组,当结果被复制到输出缓冲区中时,没有未处理的输入数据被覆盖。
input
- 输入缓冲区
inputOffset
-
input
中的输入开始的偏移量
inputLen
- 输入长度
output
- 结果的缓冲区
outputOffset
- 存储结果的
output
中的偏移量
output
中的字节数
IllegalStateException
- 如果此密码处于错误状态(例如,尚未初始化)
ShortBufferException
- 如果给定的输出缓冲区太小,不能保存结果
public final int update(ByteBuffer input, ByteBuffer output) throws ShortBufferException
所有input.remaining()
起始字节input.position()
进行处理。 结果存储在输出缓冲区中。 返回时,输入缓冲区的位置将等于其限制; 其限制将不会改变。 输出缓冲区的位置将提前n,其中n是此方法返回的值; 输出缓冲区的限制将不会改变。
如果output.remaining()
字节不足以保存结果,则抛出ShortBufferException
。 在这种情况下,使用较大的输出缓冲区重复此呼叫。 使用getOutputSize
来确定输出缓冲区应该有多大。
注意:该方法应该是复制安全的,这意味着input
和output
缓冲区可以引用相同的内存块,并且当结果被复制到输出缓冲区中时,没有未处理的输入数据被覆盖。
input
- 输入ByteBuffer
output
- 输出ByteByffer
output
中的字节数
IllegalStateException
- 如果此密码处于错误状态(例如,尚未初始化)
IllegalArgumentException
- 如果输入和输出是相同的对象
ReadOnlyBufferException
- 输出缓冲区是否为只读
ShortBufferException
- 如果输出缓冲区中没有足够的空间
public final byte[] doFinal() throws IllegalBlockSizeException, BadPaddingException
在以前的update
操作中可能已被缓冲的输入数据被处理,并且应用填充(如果请求)。 如果正在使用诸如GCM / CCM的AEAD模式,则在加密的情况下附加认证标签,或者在解密的情况下验证认证标签。 结果存储在一个新的缓冲区。
完成后,此方法将此密码对象重置为先前通过调用init
。 也就是说,该对象被复位并且可用于加密或解密(取决于这是在调用所指定的操作模式init
)更多的数据。
注意:如果发生任何异常,则可能需要重新设置此密码对象,然后才能再次使用。
IllegalStateException
- 如果此密码处于错误状态(例如,尚未初始化)
IllegalBlockSizeException
- 如果该密码是块密码,则不会请求填充(仅在加密模式下),并且由该密码处理的数据的总输入长度不是块大小的倍数;
或者如果此加密算法无法处理提供的输入数据。
BadPaddingException
- 如果该密码处于解密模式,并且已经请求了(un)填充,但解密的数据不受适当的填充字节的限制
AEADBadTagException
- 如果该密码在AEAD模式(例如GCM / CCM)中解密,并且接收到的认证标签与计算值不匹配
public final int doFinal(byte[] output, int outputOffset) throws IllegalBlockSizeException, ShortBufferException, BadPaddingException
在以前的update
操作中可能已经缓冲的输入数据被处理,并且应用填充(如果请求)。 如果正在使用诸如GCM / CCM的AEAD模式,则在加密的情况下附加认证标签,或者在解密的情况下验证认证标签。 结果存储在output
缓冲区中,从outputOffset
开始。
如果output
缓冲区太小而不能保存结果,则会抛出一个ShortBufferException
。 在这种情况下,使用较大的输出缓冲区重复此呼叫。 使用getOutputSize
来确定输出缓冲区应该有多大。
完成后,此方法将此密码对象重置为先前通过调用init
。 也就是说,该对象被复位并且可用于加密或解密(取决于这是在调用所指定的操作模式init
)更多的数据。
注意:如果发生任何异常,则可能需要重新设置此密码对象,然后才能再次使用。
output
- 结果的缓冲区
outputOffset
- 存储结果的
output
中的偏移量
output
中的字节数
IllegalStateException
- 如果此密码处于错误状态(例如,尚未初始化)
IllegalBlockSizeException
- 如果该密码是块密码,则不会请求填充(仅在加密模式下),并且由该密码处理的数据的总输入长度不是块大小的倍数;
或者如果此加密算法无法处理提供的输入数据。
ShortBufferException
- 如果给定的输出缓冲区太小,不能保存结果
BadPaddingException
- 如果该密码处于解密模式,并且已经请求了(un)填充,但是解密的数据不受适当的填充字节的限制
AEADBadTagException
- 如果该密码在AEAD模式(如GCM / CCM)中解密,并且接收的认证标签与计算值不匹配
public final byte[] doFinal(byte[] input) throws IllegalBlockSizeException, BadPaddingException
input
缓冲区中的字节以及在先前的update
操作中可能已被缓冲的任何输入字节将被处理,并且应用了填充(如果请求)。 如果正在使用诸如GCM / CCM的AEAD模式,则在加密的情况下附加认证标签,或者在解密的情况下验证认证标签。 结果存储在一个新的缓冲区。
完成后,此方法将此密码对象重置为先前通过调用init
。 也就是说,该对象被复位并且可用于加密或解密(取决于这是在调用所指定的操作模式init
)更多的数据。
注意:如果发生任何异常,则可能需要重新设置此密码对象,然后才能再次使用。
input
- 输入缓冲区
IllegalStateException
- 如果此密码处于错误状态(例如,尚未初始化)
IllegalBlockSizeException
- 如果该密码是块密码,则不会请求填充(仅在加密模式下),并且由该密码处理的数据的总输入长度不是块大小的倍数;
或者如果此加密算法无法处理提供的输入数据。
BadPaddingException
- 如果该密码处于解密模式,并且已经请求了(un)填充,但是解密的数据不被适当的填充字节
AEADBadTagException
- 如果该密码在AEAD模式(例如GCM / CCM)中解密,并且接收到的认证标签与计算值不匹配
public final byte[] doFinal(byte[] input, int inputOffset, int inputLen) throws IllegalBlockSizeException, BadPaddingException
第一inputLen
字节在input
缓冲区中,从inputOffset
以下,并且可能在上一次期间已缓存的任何输入字节update
操作,进行处理,填充(如果要求)被施加。 如果正在使用诸如GCM / CCM的AEAD模式,则在加密的情况下附加认证标签,或者在解密的情况下验证认证标签。 结果存储在一个新的缓冲区。
完成后,该方法将此密码对象重置为先前通过调用init
。 也就是说,该对象被复位并且可用于加密或解密(取决于这是在调用所指定的操作模式init
)更多的数据。
注意:如果发生任何异常,则可能需要重新设置此密码对象,然后才能再次使用。
input
- 输入缓冲区
inputOffset
-
input
的输入开始的偏移量
inputLen
- 输入长度
IllegalStateException
- 如果此密码处于错误状态(例如,尚未初始化)
IllegalBlockSizeException
- 如果该密码是块密码,则不会请求填充(仅在加密模式下),并且由该密码处理的数据的总输入长度不是块大小的倍数;
或者如果此加密算法无法处理提供的输入数据。
BadPaddingException
- 如果该密码处于解密模式,并且已经请求了(un)填充,但是解密的数据不受适当的填充字节的限制
AEADBadTagException
- 如果该密码在AEAD模式(如GCM / CCM)中解密,并且接收的认证标签与计算值不匹配
public final int doFinal(byte[] input, int inputOffset, int inputLen, byte[] output) throws ShortBufferException, IllegalBlockSizeException, BadPaddingException
第一inputLen
字节在input
缓冲区中,从inputOffset
以下,并且可能在上一次期间已缓存的任何输入字节update
操作,进行处理,填充(如果要求)被施加。 如果正在使用诸如GCM / CCM的AEAD模式,则在加密的情况下附加认证标签,或者在解密的情况下验证认证标签。 结果存储在output
缓冲区中。
如果output
缓冲区太小而不能保存结果,则抛出ShortBufferException
。 在这种情况下,使用较大的输出缓冲区重复此呼叫。 使用getOutputSize
确定输出缓冲区应该有多大。
完成后,此方法将此密码对象重置为先前通过调用init
。 也就是说,该对象被复位并且可用于加密或解密(取决于这是在调用所指定的操作模式init
)更多的数据。
注意:如果发生任何异常,则可能需要重新设置此密码对象,然后才能再次使用。
注意:该方法应该是安全的,这意味着input
和output
缓冲区可以引用相同的字节数组,当结果被复制到输出缓冲区中时,没有未处理的输入数据被覆盖。
input
- 输入缓冲区
inputOffset
-
input
中的输入开始的偏移量
inputLen
- 输入长度
output
- 结果的缓冲区
output
中的字节数
IllegalStateException
- 如果此密码处于错误状态(例如,尚未初始化)
IllegalBlockSizeException
- 如果该密码是块密码,则不会请求填充(仅在加密模式下),并且由该密码处理的数据的总输入长度不是块大小的倍数;
或者如果此加密算法无法处理提供的输入数据。
ShortBufferException
- 如果给定的输出缓冲区太小,不能保存结果
BadPaddingException
- 如果该密码处于解密模式,并且已经请求了(un)填充,但解密的数据不受适当的填充字节的限制
AEADBadTagException
- 如果该密码在AEAD模式(例如GCM / CCM)中解密,并且接收到的认证标签与计算值不匹配
public final int doFinal(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
。 在这种情况下,使用较大的输出缓冲区重复此呼叫。 使用getOutputSize
来确定输出缓冲区应该有多大。
完成后,此方法将此密码对象重置为先前通过调用init
。 也就是说,该对象被复位并且可用于加密或解密(取决于这是在调用所指定的操作模式init
)更多的数据。
注意:如果发生任何异常,则可能需要重新设置此密码对象,然后才能再次使用。
注意:该方法应该是安全的,这意味着input
和output
缓冲区可以引用相同的字节数组,当结果被复制到输出缓冲区中时,没有未处理的输入数据被覆盖。
input
- 输入缓冲区
inputOffset
-
input
中的输入开始的偏移量
inputLen
- 输入长度
output
- 结果的缓冲区
outputOffset
- 存储结果的偏移量为
output
output
中的字节数
IllegalStateException
- 如果此密码处于错误状态(例如,尚未初始化)
IllegalBlockSizeException
- 如果该密码是块密码,则不会请求填充(仅在加密模式下),并且由该密码处理的数据的总输入长度不是块大小的倍数;
或者如果此加密算法无法处理提供的输入数据。
ShortBufferException
- 如果给定的输出缓冲区太小,不能保存结果
BadPaddingException
- 如果该密码处于解密模式,并且已经请求了(un)填充,但是解密的数据不受适当的填充字节的限制
AEADBadTagException
- 如果该密码在AEAD模式(例如GCM / CCM)中解密,并且接收的认证标签与计算值不匹配
public final int doFinal(ByteBuffer input, ByteBuffer output) throws ShortBufferException, IllegalBlockSizeException, BadPaddingException
所有input.remaining()
起始字节input.position()
进行处理。 如果正在使用诸如GCM / CCM的AEAD模式,则在加密的情况下附加认证标签,或者在解密的情况下验证认证标签。 结果存储在输出缓冲区中。 返回时,输入缓冲区的位置将等于其限制; 其限制将不会改变。 输出缓冲区的位置将提前n,其中n是此方法返回的值; 输出缓冲区的限制将不会改变。
如果output.remaining()
字节不足以容纳结果,则抛出ShortBufferException
。 在这种情况下,使用较大的输出缓冲区重复此呼叫。 使用getOutputSize
来确定输出缓冲区应该有多大。
完成后,该方法将此密码对象重置为先前通过调用init
。 也就是说,该对象被复位并且可用于加密或解密(取决于这是在调用所指定的操作模式init
)更多的数据。
注意:如果发生任何异常,则可能需要重新设置此密码对象,然后才能再次使用。
注意:该方法应该是安全的,这意味着input
和output
缓冲区可以引用相同的字节数组,当结果被复制到输出缓冲区中时,没有未处理的输入数据被覆盖。
input
- 输入ByteBuffer
output
- 输出ByteBuffer
output
中的字节数
IllegalStateException
- 如果此密码处于错误状态(例如,尚未初始化)
IllegalArgumentException
- 如果输入和输出是相同的对象
ReadOnlyBufferException
- 输出缓冲区是否为只读
IllegalBlockSizeException
- 如果该密码是块密码,则不会请求填充(仅在加密模式下),并且由该密码处理的数据的总输入长度不是块大小的倍数;
或者如果此加密算法无法处理提供的输入数据。
ShortBufferException
- 如果输出缓冲区中没有足够的空间
BadPaddingException
- 如果该密码处于解密模式,并且已经请求了(un)填充,但是解密的数据不受适当的填充字节的限制
AEADBadTagException
- 如果该密码在AEAD模式(例如GCM / CCM)中解密,并且接收到的认证标签与计算值不匹配
public final byte[] wrap(Key key) throws IllegalBlockSizeException, InvalidKeyException
key
- 要包装的关键。
IllegalStateException
- 如果此密码处于错误状态(例如,尚未初始化)。
IllegalBlockSizeException
- 如果该密码是块密码,则不请求填充,并且要包装的密钥的编码长度不是块大小的倍数。
InvalidKeyException
- 如果使用该密码将密钥包装是不可能或不安全的(例如,硬件保护密钥正在传递给仅软件密码)。
UnsupportedOperationException
- 如果不支持
CipherSpi
中的相应方法。
public final Key unwrap(byte[] wrappedKey, String wrappedKeyAlgorithm, int wrappedKeyType) throws InvalidKeyException, NoSuchAlgorithmException
wrappedKey
- 要解开的关键。
wrappedKeyAlgorithm
- 与包裹密钥相关联的算法。
wrappedKeyType
- 包装钥匙的类型。
这必须是一个SECRET_KEY
, PRIVATE_KEY
,或PUBLIC_KEY
。
IllegalStateException
- 如果此密码处于错误状态(例如,尚未初始化)。
NoSuchAlgorithmException
-如果没有安装供应商可以创建类型的键
wrappedKeyType
为
wrappedKeyAlgorithm
。
InvalidKeyException
-如果
wrappedKey
不表示类型的包装的密钥
wrappedKeyType
为
wrappedKeyAlgorithm
。
UnsupportedOperationException
- 如果不支持
CipherSpi
中的相应方法。
public static final int getMaxAllowedKeyLength(String transformation) throws NoSuchAlgorithmException
transformation
- 密码转换。
NullPointerException
- 如果
transformation
为空。
NoSuchAlgorithmException
- 如果
transformation
不是有效的转换,即以“算法”或“算法/模式/填充”的形式。
public static final AlgorithmParameterSpec getMaxAllowedParameterSpec(String transformation) throws NoSuchAlgorithmException
transformation
- 密码转换。
NullPointerException
- 如果
transformation
为空。
NoSuchAlgorithmException
- 如果
transformation
不是有效的转换,即以“算法”或“算法/模式/填充”的形式。
public final void updateAAD(byte[] src)
当使用AEAD(GCM / CCM)等模式运行时,调用此方法可以为密码提供AAD。 如果此密码在GCM或CCM模式下运行,则必须在密文开始操作之前(通过update
和doFinal
方法)提供所有AAD。
src
- 包含附加认证数据的缓冲区
IllegalArgumentException
- 如果
src
字节数组为空
IllegalStateException
- 如果此密码处于错误状态(例如尚未初始化),则不接受AAD,或者在GCM或CCM模式下运行,并且
update
方法之一已被调用用于主动加密/解密操作
UnsupportedOperationException
-如果在相应的方法
CipherSpi
尚未覆盖的实现
public final void updateAAD(byte[] src, int offset, int len)
当使用AEAD(GCM / CCM)等模式运行时,调用此方法可以为密码提供AAD。 如果此密码在GCM或CCM模式下运行,则必须在密文开始操作之前(通过update
和doFinal
方法)提供所有AAD。
src
- 包含AAD的缓冲区
offset
- 偏移在
src
其中AAD输入开始
len
- AAD字节数
IllegalArgumentException
- 如果
src
字节数组为空,或者
offset
或
length
小于0,或
offset
和
len
的总和大于
src
字节数组的长度
IllegalStateException
- 如果此密码处于错误状态(例如,尚未初始化),则不接受AAD,或者在GCM或CCM模式下运行,并且
update
方法之一已经被调用用于主动加密/解密操作
UnsupportedOperationException
-如果在相应的方法
CipherSpi
尚未覆盖的实现
public final void updateAAD(ByteBuffer src)
当使用AEAD(GCM / CCM)等模式运行时,调用此方法可以为密码提供AAD。 如果此密码在GCM或CCM模式下运行,则必须在密文开始操作之前(通过update
和doFinal
方法)提供所有AAD。
所有src.remaining()
起始字节src.position()
进行处理。 返回时,输入缓冲区的位置将等于其限制; 其限制将不会改变。
src
- 包含AAD的缓冲区
IllegalArgumentException
- 如果
src ByteBuffer
为空
IllegalStateException
- 如果此密码处于错误状态(例如,尚未初始化),则不接受AAD,或者在GCM或CCM模式下运行,并且
update
方法中的一个已被调用用于主动加密/解密操作
UnsupportedOperationException
-如果在相应的方法
CipherSpi
尚未覆盖的实现