public abstract class CipherSpi
extends Object
java.lang.Object | |
↳ | javax.crypto.CipherSpi |
该类定义了Cipher
类的 ( SPI )。 这个类中的所有抽象方法都必须由每个希望提供特定密码算法实现的加密服务提供者来实现。
为了创建的实例Cipher
,它封装了这个实例CipherSpi
类,应用程序调用的一个getInstance
的工厂方法Cipher
引擎类,并指定请求的转换 。 或者,应用程序也可以指定提供者的名称。
转换是一个字符串,用于描述要在给定输入上执行的操作(或一组操作),以生成一些输出。 转换总是包括加密算法的名称(例如, DES ),并且可能后跟反馈模式和填充方案。
转型的形式是:
(在后一种情况下,使用模式和填充方案的提供者特定默认值)。 例如,以下是有效的转换:
Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");
提供者可以为 算法/模式/填充的每个组合提供单独的类,或者可以决定提供更通用的类,其表示与 算法或 算法/模式或 算法//填充 (注意双斜线)对应的子变换,其中如果请求的模式和/或填充由 getInstance
方法 Cipher
自动设置,该方法调用提供者的子类 CipherSpi
的 engineSetMode
和 engineSetPadding
方法。
提供者主类中的 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的一个, CFB的一个, OFB的一个类), PKCS5Padding的一个类以及从CipherSpi
子类的通用DES类实现类。 该提供者在其主类中将具有以下Cipher
属性:
Cipher.
DES
Cipher
引擎类的 getInstance
工厂方法遵循这些规则,以实例化提供者的实现 CipherSpi
以进行“ 算法 ”形式的转换:
CipherSpi
for the specified "algorithm". 如果答案为YES,则实例化此类,使用其模式和填充方案默认值(由提供者提供)。
如果答案为否,则抛出 NoSuchAlgorithmException
异常。
该 getInstance
的工厂方法 Cipher
引擎类遵循这些规则,以实例化一个提供者实现的 CipherSpi
的形式“ 算法/模式/填充 ”的转变:
CipherSpi
for the specified "algorithm/mode/padding" transformation. 如果答案是YES,则将其实例化。
如果答案为否,请转至下一步。
CipherSpi
for the sub-transformation "algorithm/mode". 如果答案为YES,则将其实例化,然后在新实例上调用 engineSetPadding(padding)
。
如果答案为否,请转至下一步。
CipherSpi
for the sub-transformation "algorithm//padding" (note the double slashes). 如果答案为YES,则将其实例化,然后在新实例上调用 engineSetMode(mode)
。
如果答案为否,请转至下一步。
CipherSpi
for the sub-transformation "algorithm". 如果答案为YES,则将其实例化,并在新实例上调用 engineSetMode(mode)
和 engineSetPadding(padding)
。
如果答案为否,则抛出 NoSuchAlgorithmException
异常。
也可以看看:
Public constructors |
|
---|---|
CipherSpi() |
Protected methods |
|
---|---|
abstract int |
engineDoFinal(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset) 在单部分操作中加密或解密数据,或完成多部分操作。 |
int |
engineDoFinal(ByteBuffer input, ByteBuffer output) 在单部分操作中加密或解密数据,或完成多部分操作。 |
abstract byte[] |
engineDoFinal(byte[] input, int inputOffset, int inputLen) 在单部分操作中加密或解密数据,或完成多部分操作。 |
abstract int |
engineGetBlockSize() 返回块大小(以字节为单位)。 |
abstract byte[] |
engineGetIV() 返回新缓冲区中的初始化向量(IV)。 |
int |
engineGetKeySize(Key key) 以位为单位返回给定键对象的键大小。 |
abstract int |
engineGetOutputSize(int inputLen) 给定输入长度 |
abstract AlgorithmParameters |
engineGetParameters() 返回此密码使用的参数。 |
abstract void |
engineInit(int opmode, Key key, SecureRandom random) 用密钥和随机源初始化此密码。 |
abstract void |
engineInit(int opmode, Key key, AlgorithmParameterSpec params, SecureRandom random) 使用密钥,一组算法参数和一个随机源初始化此密码。 |
abstract void |
engineInit(int opmode, Key key, AlgorithmParameters params, SecureRandom random) 使用密钥,一组算法参数和一个随机源初始化此密码。 |
abstract void |
engineSetMode(String mode) 设置此密码的模式。 |
abstract void |
engineSetPadding(String padding) 设置此密码的填充机制。 |
Key |
engineUnwrap(byte[] wrappedKey, String wrappedKeyAlgorithm, int wrappedKeyType) 打开以前包装的密钥。 |
abstract byte[] |
engineUpdate(byte[] input, int inputOffset, int inputLen) 继续进行多部分加密或解密操作(取决于此密码的初始化方式),处理另一个数据部分。 |
abstract int |
engineUpdate(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset) 继续进行多部分加密或解密操作(取决于此密码的初始化方式),处理另一个数据部分。 |
int |
engineUpdate(ByteBuffer input, ByteBuffer output) 继续进行多部分加密或解密操作(取决于此密码的初始化方式),处理另一个数据部分。 |
void |
engineUpdateAAD(byte[] src, int offset, int len) 使用提供的缓冲区的子集继续多部分更新附加验证数据(AAD)。 |
void |
engineUpdateAAD(ByteBuffer src) 继续更新附加验证数据(AAD)。 |
byte[] |
engineWrap(Key key) 包裹一把钥匙。 |
Inherited methods |
|
---|---|
From class java.lang.Object
|
int engineDoFinal (byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset)
在单部分操作中加密或解密数据,或完成多部分操作。 数据被加密或解密,取决于这个密码是如何初始化的。
第一inputLen
字节在input
缓冲区中,从inputOffset
以下,并且可能在上一次期间已缓存的任何输入字节update
操作,进行处理,填充(如果要求)被施加。 如果使用诸如GCM / CCM的AEAD模式,则在加密的情况下附加认证标签,或者在解密的情况下验证。 结果存储在output
缓冲区中,从outputOffset
开始(包括outputOffset
。
如果 output
缓冲区太小而无法保存结果, ShortBufferException
抛出 ShortBufferException
。
完成后,此方法会将此密码对象重置为之前通过调用engineInit
初始化时的状态。 也就是说,该对象被重置并可用于加密或解密(取决于调用engineInit
时指定的操作模式)更多数据。
注意:如果抛出任何异常,则可能需要重置此密码对象才能再次使用它。
Parameters | |
---|---|
input |
byte : the input buffer |
inputOffset |
int : the offset in input where the input starts |
inputLen |
int : the input length |
output |
byte : the buffer for the result |
outputOffset |
int : the offset in output where the result is stored |
Returns | |
---|---|
int |
the number of bytes stored in output |
Throws | |
---|---|
IllegalBlockSizeException |
if this cipher is a block cipher, no padding has been requested (only in encryption mode), and the total input length of the data processed by this cipher is not a multiple of block size; or if this encryption algorithm is unable to process the input data provided. |
ShortBufferException |
if the given output buffer is too small to hold the result |
BadPaddingException |
if this cipher is in decryption mode, and (un)padding has been requested, but the decrypted data is not bounded by the appropriate padding bytes |
AEADBadTagException |
if this cipher is decrypting in an AEAD mode (such as GCM/CCM), and the received authentication tag does not match the calculated value |
int engineDoFinal (ByteBuffer input, ByteBuffer output)
在单部分操作中加密或解密数据,或完成多部分操作。 数据被加密或解密,取决于这个密码是如何初始化的。
所有input.remaining()
起始字节input.position()
被处理。 如果使用诸如GCM / CCM的AEAD模式,则在加密的情况下附加认证标签,或者在解密的情况下验证。 结果存储在输出缓冲区中。 返回时,输入缓冲区的位置将等于它的限制; 其限制不会改变。 输出缓冲区的位置将前进n,其中n是此方法返回的值; 输出缓冲区的限制不会改变。
如果 output.remaining()
字节不足以保存结果,则引发 ShortBufferException
。
完成后,此方法会将此密码对象重置为之前通过调用engineInit
初始化时的状态。 也就是说,该对象被重置并可用于加密或解密(取决于调用engineInit
时指定的操作模式)更多数据。
注意:如果抛出任何异常,则可能需要重置此密码对象才能再次使用它。
如果子类可以比字节数组更有效地处理ByteBuffers,则子类应考虑覆盖此方法。
Parameters | |
---|---|
input |
ByteBuffer : the input ByteBuffer |
output |
ByteBuffer : the output ByteByffer |
Returns | |
---|---|
int |
the number of bytes stored in output |
Throws | |
---|---|
IllegalBlockSizeException |
if this cipher is a block cipher, no padding has been requested (only in encryption mode), and the total input length of the data processed by this cipher is not a multiple of block size; or if this encryption algorithm is unable to process the input data provided. |
ShortBufferException |
if there is insufficient space in the output buffer |
BadPaddingException |
if this cipher is in decryption mode, and (un)padding has been requested, but the decrypted data is not bounded by the appropriate padding bytes |
AEADBadTagException |
if this cipher is decrypting in an AEAD mode (such as GCM/CCM), and the received authentication tag does not match the calculated value |
NullPointerException |
if either parameter is null |
byte[] engineDoFinal (byte[] input, int inputOffset, int inputLen)
在单部分操作中加密或解密数据,或完成多部分操作。 数据被加密或解密,取决于这个密码是如何初始化的。
第一inputLen
字节在input
缓冲区中,从inputOffset
以下,并且可能在上一次期间已缓存的任何输入字节update
操作,进行处理,填充(如果要求)被施加。 如果使用诸如GCM / CCM的AEAD模式,则在加密的情况下附加认证标签,或者在解密的情况下验证。 结果存储在新的缓冲区中。
完成后,此方法将此密码对象重置为之前通过调用engineInit
初始化时的状态。 也就是说,该对象被重置并可用于加密或解密更多数据(取决于调用engineInit
时指定的操作模式)。
注意:如果抛出任何异常,则可能需要重置此密码对象才能再次使用它。
Parameters | |
---|---|
input |
byte : the input buffer |
inputOffset |
int : the offset in input where the input starts |
inputLen |
int : the input length |
Returns | |
---|---|
byte[] |
the new buffer with the result |
Throws | |
---|---|
IllegalBlockSizeException |
if this cipher is a block cipher, no padding has been requested (only in encryption mode), and the total input length of the data processed by this cipher is not a multiple of block size; or if this encryption algorithm is unable to process the input data provided. |
BadPaddingException |
if this cipher is in decryption mode, and (un)padding has been requested, but the decrypted data is not bounded by the appropriate padding bytes |
AEADBadTagException |
if this cipher is decrypting in an AEAD mode (such as GCM/CCM), and the received authentication tag does not match the calculated value |
int engineGetBlockSize ()
返回块大小(以字节为单位)。
Returns | |
---|---|
int |
the block size (in bytes), or 0 if the underlying algorithm is not a block cipher |
byte[] engineGetIV ()
返回新缓冲区中的初始化向量(IV)。
这在基于密码的加密或解密方面非常有用,其中IV源自用户提供的密码。
Returns | |
---|---|
byte[] |
the initialization vector in a new buffer, or null if the underlying algorithm does not use an IV, or if the IV has not yet been set. |
int engineGetKeySize (Key key)
以位为单位返回给定键对象的键大小。
这个具体的方法已被添加到这个以前定义的抽象类。 如果提供程序不覆盖它,则会抛出UnsupportedOperationException
。
Parameters | |
---|---|
key |
Key : the key object. |
Returns | |
---|---|
int |
the key size of the given key object. |
Throws | |
---|---|
InvalidKeyException |
if key is invalid. |
int engineGetOutputSize (int inputLen)
给定输入长度 inputLen
(以字节为单位),返回输出缓冲区需要保留下一个 update
或 doFinal
操作结果 inputLen
的字节长度。
此调用考虑到来自先前的 update
调用,填充和AEAD标记的任何未处理(缓冲)的数据。
下一个 update
或 doFinal
调用的实际输出长度可能小于此方法返回的长度。
Parameters | |
---|---|
inputLen |
int : the input length (in bytes) |
Returns | |
---|---|
int |
the required output buffer size (in bytes) |
AlgorithmParameters engineGetParameters ()
返回此密码使用的参数。
返回的参数可能与用于初始化此密码的参数相同,或者如果此密码需要算法参数但未用任何初始值进行初始化,则可能包含底层密码实现使用的默认参数值和随机参数值的组合。
Returns | |
---|---|
AlgorithmParameters |
the parameters used with this cipher, or null if this cipher does not use any parameters. |
void engineInit (int opmode, Key key, SecureRandom random)
用密钥和随机源初始化此密码。
密码初始化为以下四种操作之一:加密,解密,密钥打包或密钥解包,具体取决于 opmode
的值。
如果此密码要求任何算法参数不能从给定的key
,则底层密码实现应该自己生成所需的参数(使用特定于提供者的默认值或随机值),如果它正在初始化用于加密或密钥包装,以及如果它正在初始化用于解密或密钥解InvalidKeyException
则提出InvalidKeyException
。 生成的参数可以使用engineGetParameters
或engineGetIV
(如果参数是IV)来检索。
如果此密码需要不能从输入参数派生的算法参数,并且没有合理的特定于提供者的默认值,则初始化必然会失败。
如果此密码(包括其基础反馈或填充方案)需要任何随机字节(例如,用于参数生成),则它将从 random
获得它们。
请注意,当Cipher对象初始化时,它会丢失所有先前获取的状态。 换句话说,初始化密码就相当于创建该密码的一个新实例并对其进行初始化。
Parameters | |
---|---|
opmode |
int : the operation mode of this cipher (this is one of the following: ENCRYPT_MODE , DECRYPT_MODE , WRAP_MODE or UNWRAP_MODE ) |
key |
Key : the encryption key |
random |
SecureRandom : the source of randomness |
Throws | |
---|---|
InvalidKeyException |
if the given key is inappropriate for initializing this cipher, or requires algorithm parameters that cannot be determined from the given key. |
void engineInit (int opmode, Key key, AlgorithmParameterSpec params, SecureRandom random)
使用密钥,一组算法参数和一个随机源初始化此密码。
密码初始化为以下四种操作之一:加密,解密,密钥打包或密钥解包,具体取决于 opmode
的值。
如果此密码需要任何算法参数,并且params
为空,则假定基础密码实现本身(使用特定于提供者的默认值或随机值)自动生成所需参数(如果正在初始化其加密或密钥包装),并且引发InvalidAlgorithmParameterException
if它正在被初始化用于解密或密钥解包。 生成的参数可以使用engineGetParameters
或engineGetIV
(如果参数是IV)来检索。
如果此密码需要不能从输入参数派生的算法参数,并且没有合理的特定于提供者的默认值,则初始化必然会失败。
如果此密码(包括其基础反馈或填充方案)需要任何随机字节(例如,用于参数生成),它将从 random
获得它们。
请注意,当Cipher对象初始化时,它会丢失所有先前获取的状态。 换句话说,初始化密码就相当于创建该密码的一个新实例并对其进行初始化。
Parameters | |
---|---|
opmode |
int : the operation mode of this cipher (this is one of the following: ENCRYPT_MODE , DECRYPT_MODE , WRAP_MODE or UNWRAP_MODE ) |
key |
Key : the encryption key |
params |
AlgorithmParameterSpec : the algorithm parameters |
random |
SecureRandom : the source of randomness |
Throws | |
---|---|
InvalidKeyException |
if the given key is inappropriate for initializing this cipher |
InvalidAlgorithmParameterException |
if the given algorithm parameters are inappropriate for this cipher, or if this cipher requires algorithm parameters and params is null. |
void engineInit (int opmode, Key key, AlgorithmParameters params, SecureRandom random)
使用密钥,一组算法参数和一个随机源初始化此密码。
密码初始化为以下四种操作之一:加密,解密,密钥打包或密钥解包,具体取决于 opmode
的值。
如果此密码需要任何算法参数且params
为空,则基础密码实现本身应该生成所需的参数(使用提供程序特定的默认值或随机值)(如果它正在初始化用于加密或密钥包装),并引发InvalidAlgorithmParameterException
if它正在被初始化用于解密或密钥解包。 生成的参数可以使用engineGetParameters
或engineGetIV
(如果参数是IV)来检索。
如果此密码需要不能从输入参数派生的算法参数,并且没有合理的特定于提供者的默认值,则初始化必然会失败。
如果该密码(包括其基础反馈或填充方案)需要任何随机字节(例如,用于参数生成),则它将从 random
获得它们。
请注意,当Cipher对象初始化时,它会丢失所有先前获取的状态。 换句话说,初始化密码就相当于创建该密码的一个新实例并对其进行初始化。
Parameters | |
---|---|
opmode |
int : the operation mode of this cipher (this is one of the following: ENCRYPT_MODE , DECRYPT_MODE , WRAP_MODE or UNWRAP_MODE ) |
key |
Key : the encryption key |
params |
AlgorithmParameters : the algorithm parameters |
random |
SecureRandom : the source of randomness |
Throws | |
---|---|
InvalidKeyException |
if the given key is inappropriate for initializing this cipher |
InvalidAlgorithmParameterException |
if the given algorithm parameters are inappropriate for this cipher, or if this cipher requires algorithm parameters and params is null. |
void engineSetMode (String mode)
设置此密码的模式。
Parameters | |
---|---|
mode |
String : the cipher mode |
Throws | |
---|---|
NoSuchAlgorithmException |
if the requested cipher mode does not exist |
void engineSetPadding (String padding)
设置此密码的填充机制。
Parameters | |
---|---|
padding |
String : the padding mechanism |
Throws | |
---|---|
NoSuchPaddingException |
if the requested padding mechanism does not exist |
Key engineUnwrap (byte[] wrappedKey, String wrappedKeyAlgorithm, int wrappedKeyType)
打开以前包装的密钥。
这个具体的方法已被添加到这个以前定义的抽象类。 (为了向后兼容,它不能是抽象的。)提供者可能会重写它,以便打开先前包装的密钥。 如果给定的包装密钥不能被解包,那么这样的覆盖预计会引发InvalidKeyException。 如果这个方法没有被覆盖,它总是抛出一个UnsupportedOperationException异常。
Parameters | |
---|---|
wrappedKey |
byte : the key to be unwrapped. |
wrappedKeyAlgorithm |
String : the algorithm associated with the wrapped key. |
wrappedKeyType |
int : the type of the wrapped key. This is one of SECRET_KEY , PRIVATE_KEY , or PUBLIC_KEY . |
Returns | |
---|---|
Key |
the unwrapped key. |
Throws | |
---|---|
NoSuchAlgorithmException |
if no installed providers can create keys of type wrappedKeyType for the wrappedKeyAlgorithm . |
InvalidKeyException |
if wrappedKey does not represent a wrapped key of type wrappedKeyType for the wrappedKeyAlgorithm . |
byte[] engineUpdate (byte[] input, int inputOffset, int inputLen)
继续进行多部分加密或解密操作(取决于此密码的初始化方式),处理另一个数据部分。
第一 inputLen
字节在 input
缓冲区中,从 inputOffset
以下,被处理,并且结果被存储在新的缓冲器。
Parameters | |
---|---|
input |
byte : the input buffer |
inputOffset |
int : the offset in input where the input starts |
inputLen |
int : the input length |
Returns | |
---|---|
byte[] |
the new buffer with the result, or null if the underlying cipher is a block cipher and the input data is too short to result in a new block. |
int engineUpdate (byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset)
继续进行多部分加密或解密操作(取决于此密码的初始化方式),处理另一个数据部分。
第一 inputLen
字节在 input
缓冲区中,从 inputOffset
以下,被处理,并且结果被存储在 output
缓冲区中,从 outputOffset
以下。
如果 output
缓冲区太小而无法保留结果, ShortBufferException
抛出 ShortBufferException
。
Parameters | |
---|---|
input |
byte : the input buffer |
inputOffset |
int : the offset in input where the input starts |
inputLen |
int : the input length |
output |
byte : the buffer for the result |
outputOffset |
int : the offset in output where the result is stored |
Returns | |
---|---|
int |
the number of bytes stored in output |
Throws | |
---|---|
ShortBufferException |
if the given output buffer is too small to hold the result |
int engineUpdate (ByteBuffer input, ByteBuffer output)
继续进行多部分加密或解密操作(取决于此密码的初始化方式),处理另一个数据部分。
所有input.remaining()
起始字节input.position()
被处理。 结果存储在输出缓冲区中。 返回时,输入缓冲区的位置将等于它的限制; 其限制不会改变。 输出缓冲区的位置将前进n,其中n是此方法返回的值; 输出缓冲区的限制不会改变。
如果 output.remaining()
字节不足以保存结果, ShortBufferException
抛出 ShortBufferException
。
如果子类可以比字节数组更有效地处理ByteBuffers,则子类应考虑覆盖此方法。
Parameters | |
---|---|
input |
ByteBuffer : the input ByteBuffer |
output |
ByteBuffer : the output ByteByffer |
Returns | |
---|---|
int |
the number of bytes stored in output |
Throws | |
---|---|
ShortBufferException |
if there is insufficient space in the output buffer |
NullPointerException |
if either parameter is null |
void engineUpdateAAD (byte[] src, int offset, int len)
使用提供的缓冲区的子集继续多部分更新附加验证数据(AAD)。
在AEAD(GCM / CCM)等模式下操作时,调用此方法可为AAD提供密码。 如果此密码以GCM或CCM模式运行,则必须在开始对密文进行操作之前提供所有AAD(通过update
和doFinal
方法)。
Parameters | |
---|---|
src |
byte : the buffer containing the AAD |
offset |
int : the offset in src where the AAD input starts |
len |
int : the number of AAD bytes |
Throws | |
---|---|
IllegalStateException |
if this cipher is in a wrong state (e.g., has not been initialized), does not accept AAD, or if operating in either GCM or CCM mode and one of the update methods has already been called for the active encryption/decryption operation |
UnsupportedOperationException |
if this method has not been overridden by an implementation |
void engineUpdateAAD (ByteBuffer src)
继续更新附加验证数据(AAD)。
在AEAD(GCM / CCM)等模式下操作时,调用此方法可为AAD提供密码。 如果此密码以GCM或CCM模式运行,则必须在开始对密文进行操作之前提供所有AAD(通过update
和doFinal
方法)。
所有src.remaining()
起始字节src.position()
被处理。 返回时,输入缓冲区的位置将等于它的限制; 其限制不会改变。
Parameters | |
---|---|
src |
ByteBuffer : the buffer containing the AAD |
Throws | |
---|---|
IllegalStateException |
if this cipher is in a wrong state (e.g., has not been initialized), does not accept AAD, or if operating in either GCM or CCM mode and one of the update methods has already been called for the active encryption/decryption operation |
UnsupportedOperationException |
if this method has not been overridden by an implementation |
byte[] engineWrap (Key key)
包裹一把钥匙。
这个具体的方法已被添加到这个以前定义的抽象类。 (为了向后兼容,它不能是抽象的。)提供者可能会覆盖它以包装一个密钥。 如果给定的密钥不能被包装,这样的覆盖预计会引发IllegalBlockSizeException或InvalidKeyException(在指定的情况下)。 如果这个方法没有被覆盖,它总是抛出一个UnsupportedOperationException异常。
Parameters | |
---|---|
key |
Key : the key to be wrapped. |
Returns | |
---|---|
byte[] |
the wrapped key. |
Throws | |
---|---|
IllegalBlockSizeException |
if this cipher is a block cipher, no padding has been requested, and the length of the encoding of the key to be wrapped is not a multiple of the block size. |
InvalidKeyException |
if it is impossible or unsafe to wrap the key with this cipher (e.g., a hardware protected key is being passed to a software-only cipher). |