| 
 | JavaTM Platform Standard Ed. 6 | |||||||||
| 上一个类 下一个类 | 框架 无框架 | |||||||||
| 摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 | |||||||||
java.lang.Objectjavax.crypto.CipherSpi
public abstract class CipherSpi
此类为 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/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 子类。
如果已经注册,则实例化此类,使用其模式和填充方案的默认值(由提供者给出)。
如果未注册,则抛出 NoSuchAlgorithmException。
 
Cipher 引擎类的 getInstance 工厂方法遵守这些规则,以便为“算法/模式/填充”形式的转换实例化提供者的 CipherSpi 实现:
 
 
CipherSpi 子类。
如果已注册,则将其实例化。
如果未注册,则转到下一步。
CipherSpi 子类。
如果已注册,则将其实例化,并在新实例上调用 engineSetPadding(padding)。
如果未注册,则转到下一步。
CipherSpi 子类(注意,是双斜线的)。
如果已注册,则将其实例化,并在新实例上调用 engineSetMode(mode)。
如果未注册,则转到下一步。
CipherSpi 子类。
如果已注册,则将其实例化,并在新实例上调用 engineSetMode(mode) 和 engineSetPadding(padding)。
如果未注册,则抛出 NoSuchAlgorithmException。
 
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 | 
| 构造方法详细信息 | 
|---|
public CipherSpi()
| 方法详细信息 | 
|---|
protected abstract void engineSetMode(String mode)
                               throws NoSuchAlgorithmException
mode - cipher 模式
NoSuchAlgorithmException - 如果请求的 cipher 模式不存在
protected abstract void engineSetPadding(String padding)
                                  throws NoSuchPaddingException
padding - 填充机制
NoSuchPaddingException - 如果请求的填充机制不存在protected abstract int engineGetBlockSize()
protected abstract int engineGetOutputSize(int inputLen)
inputLen(以字节为单位)的情况下,返回用于保存下一个 update 或 doFinal 操作结果所需的输出缓冲区长度的字节数。
 
此调用还考虑到来自上一个 update 调用的任何未处理(已缓存)的数据和填充。
下一个 update 或 doFinal 调用的实际输出长度可能小于此方法返回的长度。
inputLen - 输入长度(以字节为单位)
protected abstract byte[] engineGetIV()
此方法在基于密码的加密或解密上下文中很有用,此时 IV 派生自用户提供的 passphrase。
protected abstract AlgorithmParameters engineGetParameters()
返回的参数可能与初始化此 cipher 所使用的参数相同;如果此 cipher 要求使用算法参数但却未使用任何参数进行初始化,则返回的参数可能会包含由默认值和底层 cipher 实现所使用的随机参数值的组合。
protected abstract void engineInit(int opmode,
                                   Key key,
                                   SecureRandom random)
                            throws InvalidKeyException
为以下 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 确定。
protected abstract void engineInit(int opmode,
                                   Key key,
                                   AlgorithmParameterSpec params,
                                   SecureRandom random)
                            throws InvalidKeyException,
                                   InvalidAlgorithmParameterException
为以下 4 种操作之一初始化该 cipher:加密、解密、密钥包装或密钥打开,这取决于 opmode 的值。
如果此 cipher 要求使用任何算法参数,而 params 为 null,则在被初始化为加密或密钥包装时,底层 cipher 实现将会自己生成所需的参数(使用特定于提供者的默认或随机值);在初始化为解密或密钥打开时,将引发 InvalidAlgorithmParameterException。可以用 engineGetParameters 或 engineGetIV 获取生成的参数(如果该参数为 IV)。
如果此 cipher(包括其底层反馈或填充方案)要求使用任何随机字节(例如,用于参数生成),那么它将从 random 获取这些随机字节。
注意,当初始化 Cipher 对象时,它将失去所有以前获得的状态。换句话说,初始化 Cipher 相当于创建该 Cipher 的一个新实例并将其初始化。
opmode - 此 cipher 的操作模式(其为如下之一:ENCRYPT_MODE、DECRYPT_MODE、WRAP_MODE 或 UNWRAP_MODE)key - 加密密钥params - 算法参数random - 随机源
InvalidKeyException - 如果给定的 key 不适合初始化此 cipher
InvalidAlgorithmParameterException - 如果给定的算法参数不适合此 cipher,如果要将此 cipher 初始化为解密,并且要求使用算法参数,而 params 为 null。
protected abstract void engineInit(int opmode,
                                   Key key,
                                   AlgorithmParameters params,
                                   SecureRandom random)
                            throws InvalidKeyException,
                                   InvalidAlgorithmParameterException
为以下 4 种操作之一初始化该 cipher:加密、解密、密钥包装或密钥打开,这取决于 opmode 的值。
如果此 cipher 要求使用任何算法参数,而 params 为 null,则在被初始化为加密或密钥包装时,底层 cipher 实现将会自己生成所需的参数(使用特定于提供者的默认或随机值);在初始化为解密或密钥打开时,将引发 InvalidAlgorithmParameterException。可以用 engineGetParameters 或 engineGetIV 获取生成的参数(如果该参数为 IV)。
如果此 cipher(包括其底层反馈或填充方案)要求使用任何随机字节(例如,用于参数生成),那么它将从 random 获取这些随机字节。
注意,当初始化 Cipher 对象时,它将失去所有以前获得的状态。换句话说,初始化 Cipher 相当于创建该 Cipher 的一个新实例并将其初始化。
opmode - 此 cipher 的操作模式(其为如下之一:ENCRYPT_MODE、DECRYPT_MODE、WRAP_MODE 或 UNWRAP_MODE)key - 加密密钥params - 算法参数random - 随机源
InvalidKeyException - 如果给定的 key 不适合初始化此 cipher
InvalidAlgorithmParameterException - 如果给定的算法参数不适合此 cipher,如果要将此 cipher 初始化为解密,并且要求使用算法参数,而 params 为 null。
protected abstract byte[] engineUpdate(byte[] input,
                                       int inputOffset,
                                       int inputLen)
处理 input 缓冲区中从 inputOffset 开始(包含)的前 inputLen 个字节,并将结果存储在新的缓冲区中。
input - 输入缓冲区inputOffset - input 中输入开始位置的偏移量inputLen - 输入长度
protected abstract int engineUpdate(byte[] input,
                                    int inputOffset,
                                    int inputLen,
                                    byte[] output,
                                    int outputOffset)
                             throws ShortBufferException
处理 input 缓冲区中从 inputOffset 开始(包含)的前 inputLen 个字节,并将结果存储在 output 缓冲区中从 outputOffset 开始(包含)的位置。
如果 output 缓冲区太小无法保存该结果,则抛出 ShortBufferException。
input - 输入缓冲区inputOffset - input 中输入开始位置的偏移量inputLen - 输入长度output - 保存结果的缓冲区outputOffset - output 中存储结果的位置的偏移量
output 中存储的字节数
ShortBufferException - 如果给定的输出缓冲区太小无法保存该结果
protected int engineUpdate(ByteBuffer input,
                           ByteBuffer output)
                    throws ShortBufferException
处理从 input.position() 开始的所有 input.remaining() 字节。结果存储在输出缓冲区中。返回时,输入缓冲区的位置将等于其限制;其限制并未改变。输出缓冲区的位置将前移 n,其中 n 为此方法返回的值;输出缓冲区的限制并未改变。
如果 output.remaining() 个字节还不够保存该结果,则抛出 ShortBufferException。
如果能够比 byte 数组更有效地处理 ByteBuffer,子类应考虑重写此方法。
input - 输入 ByteBufferoutput - 输出 ByteBuffer
output 中存储的字节数
ShortBufferException - 如果输出缓冲区中没有足够的空间
NullPointerException - 如果任一参数为 null
protected abstract byte[] engineDoFinal(byte[] input,
                                        int inputOffset,
                                        int inputLen)
                                 throws IllegalBlockSizeException,
                                        BadPaddingException
处理 input 缓冲区中从 inputOffset 开始(包含)的前 inputLen 个字节以及可能在上一次 update 操作过程中已缓存的任何输入字节,其中应用了填充(如果需要)。结果存储在新缓冲区中。
结束时,此方法将把此 cipher 对象重置为上一次调用 engineInit 初始化得到的状态。即重置该对象,可供加密或解密(取决于调用 engineInit 时指定的操作模式)更多的数据。 
注:如果抛出了任何异常,则再次使用此 cipher 对象前,可能需要将其重置。
input - 输入缓冲区inputOffset - input 中输入开始位置的偏移量inputLen - 输入长度
IllegalBlockSizeException - 如果此 cipher 为块 cipher,未请求任何填充(只针对加密模式),并且由此 cipher 处理的数据总输入长度不是块大小的倍数,如果此加密算法无法处理所提供的输入数据。
BadPaddingException - 如果此 cipher 为解密模式,并且未请求填充或不填充,但解密的数据没有用适当的填充字节所限制
protected abstract int engineDoFinal(byte[] input,
                                     int inputOffset,
                                     int inputLen,
                                     byte[] output,
                                     int outputOffset)
                              throws ShortBufferException,
                                     IllegalBlockSizeException,
                                     BadPaddingException
处理 input 缓冲区中从 inputOffset 开始(包含)的前 inputLen 个字节以及可能在上一次 update 操作过程中已缓存的任何输入字节,其中应用了填充(如果需要)。结果存储在 output 缓冲区中从 outputOffset(包含)开始的位置。
如果 output 缓冲区太小无法保存该结果,则抛出 ShortBufferException。
结束时,此方法将把此 cipher 对象重置为上一次调用 engineInit 初始化得到的状态。即重置该对象,可供加密或解密(取决于调用 engineInit 时指定的操作模式)更多的数据。 
注:如果抛出了任何异常,则再次使用此 cipher 对象前,可能需要将其重置。
input - 输入缓冲区inputOffset - input 中输入开始位置的偏移量inputLen - 输入长度output - 保存结果的缓冲区outputOffset - output 中存储结果的位置的偏移量
output 中存储的字节数
IllegalBlockSizeException - 如果此 cipher 为块 cipher,未请求任何填充(只针对加密模式),并且由此 cipher 处理的数据总输入长度不是块大小的倍数,如果此加密算法无法处理所提供的输入数据。
ShortBufferException - 如果给定的输出缓冲区太小无法保存结果
BadPaddingException - 如果 cipher 为解密模式,并且未请求填充或不填充,但解密的数据没有用适当的填充字节所限制
protected int engineDoFinal(ByteBuffer input,
                            ByteBuffer output)
                     throws ShortBufferException,
                            IllegalBlockSizeException,
                            BadPaddingException
处理从 input.position() 开始的所有 input.remaining() 字节。结果存储在输出缓冲区中。返回时,输入缓冲区的位置将等于其限制;其限制并未改变。输出缓冲区的位置将前移 n,其中 n 为此方法返回的值;输出缓冲区的限制并未改变。
如果 output.remaining() 个字节还不够保存该结果,则抛出 ShortBufferException。
结束时,此方法将把此 cipher 对象重置为上一次调用 engineInit 初始化得到的状态。即重置该对象,可供加密或解密(取决于调用 engineInit 时指定的操作模式)更多的数据。
注:如果抛出了任何异常,则再次使用此 cipher 对象前,可能需要将其重置。
如果能够比 byte 数组更有效地处理 ByteBuffer,子类应考虑重写此方法。
input - 输入 ByteBufferoutput - 输出 ByteBuffer
output 中存储的字节数
IllegalBlockSizeException - 如果此 cipher 为块 cipher,未请求任何填充(只针对加密模式),并且由此 cipher 处理的数据总输入长度不是块大小的倍数,如果此加密算法无法处理所提供的输入数据。
ShortBufferException - 如果输出缓冲区没有足够的空间
BadPaddingException - 如果 cipher 为解密模式,并且未请求填充或不填充,但解密的数据没有用适当的填充字节所限制
NullPointerException - 如果任一参数为 null
protected byte[] engineWrap(Key key)
                     throws IllegalBlockSizeException,
                            InvalidKeyException
已将此具体方法添加到了先前定义过的抽象类中。(为向后兼容,它不能为抽象方法)。可以由提供者重写以包装该密钥。如果给定的密钥无法被包装,则这样的重写可能会抛出 IllegalBlockSizeException 或 InvalidKeyException (在指定情况下)。如果不重写此方法,则它总是抛出 UnsupportedOperationException。
key - 要包装的密钥。
IllegalBlockSizeException - 如果此 cipher 为块 cipher,未请求填充,并且要包装的密钥的编码长度不是块大小的倍数。
InvalidKeyException - 如果不可能用此 cipher 包装该密钥,或这样做不安全(例如,将一个硬件保护的密钥传给只要求软件保护的 cipher)。
protected Key engineUnwrap(byte[] wrappedKey,
                           String wrappedKeyAlgorithm,
                           int wrappedKeyType)
                    throws InvalidKeyException,
                           NoSuchAlgorithmException
已将此具体方法添加到了先前定义过的抽象类中。(为向后兼容,它不能为抽象方法)。可以由提供者重写以打开以前包装的密钥。如果无法打开给定的包装密钥,则这样的重写可能会抛出 InvalidKeyException。如果不重写此方法,则它总是抛出 UnsupportedOperationException。
wrappedKey - 要打开的密钥。wrappedKeyAlgorithm - 与此包装密钥关联的算法。wrappedKeyType - 已包装密钥的类型。此类型为 SECRET_KEY、PRIVATE_KEY 或 PUBLIC_KEY 之一。
NoSuchAlgorithmException - 如果没有一个已安装的提供者能够为 wrappedKeyAlgorithm 创建类型为 wrappedKeyType 的密钥。
InvalidKeyException - 如果 wrappedKey 并不为 wrappedKeyAlgorithm 表示类型为 wrappedKeyType 的已包装密钥。
protected int engineGetKeySize(Key key)
                        throws InvalidKeyException
已将此具体方法添加到了先前定义过的抽象类中。如果提供者未重写此方法,则将抛出 UnsupportedOperationException。
key - 密钥对象
InvalidKeyException - 如果 key 无效。| 
 | JavaTM Platform Standard Ed. 6 | |||||||||
| 上一个类 下一个类 | 框架 无框架 | |||||||||
| 摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 | |||||||||
版权所有 2007 Sun Microsystems, Inc. 保留所有权利。 请遵守许可证条款。另请参阅文档重新分发政策。