|
|||||||||
摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 |
javax.crypto
类 CipherSpi
java.lang.Object javax.crypto.CipherSpi
-
public abstract class CipherSpi
- extends Object
此类为 Cipher
类定义了服务提供程序接口 (SPI)。此类中的所有抽象方法都必须由每个想要提供实现特定 cipher 算法的加密服务提供程序实现。
为创建封装了此 CipherSpi
类实例的 Cipher
实例,应用程序调用 Cipher
引擎类的 getInstance
工厂方法之一并指定请求的转换。作为可选项,应用程序还可以指定提供程序的名称。
转换 是描述为产生某种输出而在给定的输入上执行的操作(或一组操作)的字符串。转换始终包括加密算法的名称(例如,DES),后面可能跟有一个反馈模式和填充方案。
转换具有下面的形式:
- "算法/模式/填充”或
- "算法”
(后一种情况下,使用此模式和填充方案的特定于提供程序的默认值)。例如,以下是有效的转换:
Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");
一个提供程序可能为每个算法/模式/填充 组合提供一个单独的类,也有可能决定提供多个表示与算法 或算法/模式 或算法//填充 (注意,是双斜线)对应的子转换的一般类,在这种情况下,请求的模式和/或填充由 Cipher
的 getInstance
方法自动设置,它调用的是提供程序的 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
例如,某提供程序可能提供实现 DES/ECB/PKCS5Padding 的 CipherSpi
子类,以及实现 DES/CBC/PKCS5Padding、DES/CFB/PKCS5Padding 和 DES/OFB/PKCS5Padding 的 CipherSpi
子类。该提供程序在其主类中将有以下 Cipher
属性:
Cipher.
DES/ECB/PKCS5PaddingCipher.
DES/CBC/PKCS5PaddingCipher.
DES/CFB/PKCS5PaddingCipher.
DES/OFB/PKCS5Padding
另一个提供程序可能实现一个用于以上每个模式的类(即一个用于 ECB 的类、一个用于 CBC 的类、一个用于 CFB 的类及一个用于 OFB 的类),一个用于 PKCS5Padding 的类,以及一个通过子类化 CipherSpi
所得到的通用 DES 类。该提供程序在其主类中将有以下 Cipher
属性:
Cipher.
DES
Cipher
引擎类的 getInstance
工厂方法遵守这些规则,以便为“算法”形式的转换实例化提供程序的 CipherSpi
实现:
- 检查提供程序是否已为指定的“算法”注册了一个
CipherSpi
子类。如果已经注册,则实例化此类,使用其模式和填充方案的默认值(由提供程序给出)。
如果未注册,则抛出
NoSuchAlgorithmException
。
Cipher
引擎类的 getInstance
工厂方法遵守这些规则,以便为“算法/模式/填充”形式的转换实例化提供程序的 CipherSpi
实现:
- 检查提供程序是否已为指定的“算法/模式/填充”转换注册了一个
CipherSpi
子类。如果已注册,则将其实例化。
如果未注册,则转到下一步。
- 检查提供程序是否已为“算法/模式”子转换注册了一个
CipherSpi
子类。如果已注册,则将其实例化,并在新实例上调用
engineSetPadding(padding)
。如果未注册,则转到下一步。
- 检查提供程序是否已为“算法/填充”子转换注册了一个
CipherSpi
子类。如果已注册,则将其实例化,并在新实例上调用
engineSetMode(mode)
。如果未注册,则转到下一步。
- 检查提供程序是否已为“算法”子转换注册了一个
CipherSpi
子类。如果已注册,则将其实例化,并在新实例上调用
engineSetMode(mode)
和engineSetPadding(padding)
。如果未注册,则抛出
NoSuchAlgorithmException
。
- 从以下版本开始:
- 1.4
- 另请参见:
-
KeyGenerator
,SecretKey
构造方法摘要 | |
---|---|
CipherSpi() |
方法摘要 | |
---|---|
protected abstract byte[] |
engineDoFinal(byte[] input, int inputOffset, int inputLen) 按单部分操作加密或解密数据,或者结束一个多部分操作。 |
protected abstract int |
engineDoFinal(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset) 按单部分操作加密或解密数据,或者结束一个多部分操作。 |
protected int |
engineDoFinal(ByteBuffer input, ByteBuffer output) 按单部分操作加密或解密数据,或者结束一个多部分操作。 |
protected abstract int |
engineGetBlockSize() 返回块的大小(以字节为单位)。 |
protected abstract byte[] |
engineGetIV() 返回新缓冲区中的初始化向量 (IV)。 |
protected int |
engineGetKeySize(Key key) 返回给定密钥对象的密钥大小,以位为单位。 |
protected abstract int |
engineGetOutputSize(int inputLen) 在给定了输入长度 inputLen (以字节为单位)的情况下,返回用于保存下一个 update 或 doFinal 操作结果所需的输出缓冲区长度的字节数。 |
protected abstract AlgorithmParameters |
engineGetParameters() 返回此 cipher 使用的参数。 |
protected abstract void |
engineInit(int opmode, Key key, AlgorithmParameterSpec params, SecureRandom random) 用一个密钥、一组算法参数和一个随机源初始化此 cipher。 |
protected abstract void |
engineInit(int opmode, Key key, AlgorithmParameters params, SecureRandom random) 用一个密钥、一组算法参数和一个随机源初始化此 cipher。 |
protected abstract void |
engineInit(int opmode, Key key, SecureRandom random) 用密钥和随机源初始化此 cipher。 |
protected abstract void |
engineSetMode(String mode) 设置此 cipher 的模式。 |
protected abstract void |
engineSetPadding(String padding) 设置此 cipher 的填充机制。 |
protected Key |
engineUnwrap(byte[] wrappedKey, String wrappedKeyAlgorithm, int wrappedKeyType) 打开一个以前包装的密钥。 |
protected abstract byte[] |
engineUpdate(byte[] input, int inputOffset, int inputLen) 继续多部分加密或解密操作(取决于此 cipher 的初始化方式),以处理其他数据部分。 |
protected abstract int |
engineUpdate(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset) 继续多部分加密或解密操作(取决于此 cipher 的初始化方式),以处理其他数据部分。 |
protected int |
engineUpdate(ByteBuffer input, ByteBuffer output) 继续多部分加密或解密操作(取决于此 cipher 的初始化方式),以处理其他数据部分。 |
protected byte[] |
engineWrap(Key key) 将密钥包装。 |
从类 java.lang.Object 继承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
构造方法详细信息 |
---|
CipherSpi
public CipherSpi()
方法详细信息 |
---|
engineSetMode
protected abstract void engineSetMode(String mode) throws NoSuchAlgorithmException
- 设置此 cipher 的模式。
-
- 参数:
-
mode
- cipher 模式 - 抛出:
-
NoSuchAlgorithmException
- 如果请求的 cipher 模式不存在
engineSetPadding
protected abstract void engineSetPadding(String padding) throws NoSuchPaddingException
- 设置此 cipher 的填充机制。
-
- 参数:
-
padding
- 填充机制 - 抛出:
-
NoSuchPaddingException
- 如果请求的填充机制不存在
engineGetBlockSize
protected abstract int engineGetBlockSize()
- 返回块的大小(以字节为单位)。
-
- 返回:
- 块的大小(以字节为单位),如果基础算法不是块 cipher,则返回 0
engineGetOutputSize
protected abstract int engineGetOutputSize(int inputLen)
-
在给定了输入长度
inputLen
(以字节为单位)的情况下,返回用于保存下一个update
或doFinal
操作结果所需的输出缓冲区长度的字节数。此调用还考虑到来自上一个
update
调用的未处理(已缓存)数据和填充。下一个
update
或doFinal
调用的实际输出长度可能小于此方法返回的长度。 -
- 参数:
-
inputLen
- 输入长度(以字节为单位) - 返回:
- 所需的输出缓冲区大小(以字节为单位)
engineGetIV
protected abstract byte[] engineGetIV()
-
返回新缓冲区中的初始化向量 (IV)。
此方法在基于密码的加密或解密上下文中很有用,此时 IV 派生自用户提供的 passphrase。
-
- 返回:
- 新缓冲区中的初始化向量,如果基础算法不使用 IV,或 IV 尚未设置,则返回 null。
engineGetParameters
protected abstract AlgorithmParameters engineGetParameters()
-
返回此 cipher 使用的参数。
返回的参数可能与初始化此 cipher 所使用的参数相同;如果此 cipher 要求使用算法参数但却未使用任何参数进行初始化,则返回的参数可能会包含由默认值和随机生成的参数值的组合。
-
- 返回:
- 此 cipher 使用的参数,如果此 cipher 不使用任何参数,则返回 null。
engineInit
protected abstract void engineInit(int opmode, Key key, SecureRandom random) throws InvalidKeyException
-
用密钥和随机源初始化此 cipher。
为以下 4 种操作之一初始化该 cipher:加密、解密、密钥包装或密钥打开,这取决于
opmode
的值。如果此 cipher 要求使用任何算法参数,而此参数又无法从给定的
key
派生,则在被初始化为加密或密钥包装时,基础 cipher 实现将会自己生成所需的参数(使用特定于提供程序的默认或随机值);在初始化为解密或密钥打开时,将引发InvalidKeyException
。可以用engineGetParameters
或engineGetIV
检索生成的参数(如果该参数为 IV)。如果此 cipher(包括其基础反馈或填充方案)要求使用任何随机字节(例如,用于参数生成),那么它将从
random
获取这些随机字节。注意,当初始化 Cipher 对象时,它将失去所有以前获得的状态。换句话说,初始化 Cipher 相当于创建该 Cipher 的一个新实例并将其初始化。
-
- 参数:
-
opmode
- 此 cipher 的操作模式(其为如下之一:ENCRYPT_MODE
、DECRYPT_MODE
、WRAP_MODE
或UNWRAP_MODE
) -
key
- 加密密钥 -
random
- 随机源 - 抛出:
-
InvalidKeyException
- 如果给定的 key 不适合初始化此 cipher,如果要将此 cipher 初始化为解密,并且它所要求的算法参数无法从给定的 key 确定。