public abstract class CipherSpi extends Object
Cipher
类。在这个类中的所有的抽象方法必须实现由每个密码服务提供商,谁希望提供一个特定的密码算法的实现。
为了创造Cipher
实例,它将这CipherSpi
类的一个实例,应用程序调用一个类的Cipher
发动机的getInstance
工厂方法和指定请求的转型。可选地,应用程序还可以指定提供者的名称。
一个转型是一个字符串,描述操作(或一组操作)进行给定的输入,产生输出。变换总是包括一个加密算法(例如,辅)的名称,并可能随后由一个反馈模式和填充方案。
变换是形式:
在后一种情况下,使用该模式和填充方案的特定默认值)。例如,下面是一个有效的转换:
密码C =密码。getInstance(DES CBC / pkcs5padding /”);
一个供应商可以为算法/模式/填充每个组合提供一个单独的类,或者决定提供更通用的类子变换对应算法或算法/模式或算法/填充(注意双斜线),在这种情况下,被请求的方式和/或填充的Cipher
的getInstance
方法自动设置,其中援引供应商的子类的方法和engineSetPadding
CipherSpi
engineSetMode
。
在供应商主类的一个Cipher
属性可能有下列格式之一:
/ /供应商的子类的“cipherspi”实现“algname”/ /可插拔的方式和填充Cipher.
algname
/ /供应商的子类的“cipherspi”实现“algname”在//指定的“模式”,可插拔的填充Cipher.
algname /模式
/ /供应商的子类的“cipherspi”实现“algname”与//指定的“填充”,以可插拔的方式Cipher.
algname /填充
/ /供应商的子类的“cipherspi”实现“algname”与/ /指定的“模式”和“填充”Cipher.
algname /模式/填充
例如,一个供应商可以提供CipherSpi
实现DES /欧洲央行/ pkcs5padding的子类,一个实现了DES CBC / pkcs5padding /,一个实现了DES /循环/ pkcs5padding,然而另一个实现DES / B / pkcs5padding。供应商将有以下的大师班Cipher
性质:
Cipher.
des /欧洲央行/ pkcs5padding
Cipher.
des CBC / pkcs5padding /
Cipher.
des /循环/ pkcs5padding
Cipher.
des / B / pkcs5padding
另一个供应商可以实现上述各模式类(即,一个班一个欧洲央行,CBC,一循环流化床锅炉,和一个B),一类为pkcs5padding,和一个通用的DES类,子类CipherSpi
。供应商将有以下的大师班Cipher
性质:
Cipher.
des
该Cipher
引擎类的getInstance
工厂方法遵循这些规则以实例化CipherSpi
提供者的实现一个转换的形式”算法”:
CipherSpi
子类为指定的“算法”。如果答案是肯定的,实例化这个类,其模式和填充方案的默认值(由供应商提供)的使用。
如果答案是否定的,把一NoSuchAlgorithmException
例外。
的getInstance
工厂方法的Cipher
引擎类遵循这些规则以实例化CipherSpi
提供者的实现一个转换的形式”算法/模式/填充”:
CipherSpi
子类为指定的“算法/模式/填充”转型。如果答案是肯定的,实例化。
如果答案是不,去下一步。
CipherSpi
子变换”算法/模式”。如果答案是肯定的,实例化,并调用engineSetPadding(padding)
在新实例。
如果答案是不,去下一步。
CipherSpi
子变换”算法/填充”(注意双斜杠)。如果答案是肯定的,实例化,并调用engineSetMode(mode)
在新实例。
如果答案是不,去下一步。
CipherSpi
子变换”算法”。如果答案是肯定的,实例化,并调用engineSetMode(mode)
和engineSetPadding(padding)
在新实例。
如果答案是否定的,把一NoSuchAlgorithmException
例外。
KeyGenerator
,
SecretKey
Constructor and Description |
---|
CipherSpi() |
Modifier and Type | Method and Description |
---|---|
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()
返回一个新的缓冲区中的初始化向量(四)。
|
protected int |
engineGetKeySize(Key key)
返回给定的密钥对象的密钥大小。
|
protected abstract int |
engineGetOutputSize(int inputLen)
返回的字节长度,输出缓冲区将需要为了保持结果的下一
update 或
doFinal 操作,
inputLen 给定输入长度(以字节为单位)。
|
protected abstract AlgorithmParameters |
engineGetParameters()
返回此密码所使用的参数。
|
protected abstract void |
engineInit(int opmode, Key key, AlgorithmParameterSpec params, SecureRandom random)
一个关键的初始化这个密码,一组算法参数,和一个随机源。
|
protected abstract void |
engineInit(int opmode, Key key, AlgorithmParameters params, SecureRandom random)
一个关键的初始化这个密码,一组算法参数,和一个随机源。
|
protected abstract void |
engineInit(int opmode, Key key, SecureRandom random)
用钥匙和随机源初始化这个密码。
|
protected abstract void |
engineSetMode(String mode)
设置此密码的模式。
|
protected abstract void |
engineSetPadding(String padding)
设置此密码的填充机制。
|
protected Key |
engineUnwrap(byte[] wrappedKey, String wrappedKeyAlgorithm, int wrappedKeyType)
打开先前包的关键。
|
protected abstract byte[] |
engineUpdate(byte[] input, int inputOffset, int inputLen)
继续一个多部分加密或解密操作(取决于这个密码是如何初始化的),处理另一个数据部分。
|
protected abstract int |
engineUpdate(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset)
继续一个多部分加密或解密操作(取决于这个密码是如何初始化的),处理另一个数据部分。
|
protected int |
engineUpdate(ByteBuffer input, ByteBuffer output)
继续一个多部分加密或解密操作(取决于这个密码是如何初始化的),处理另一个数据部分。
|
protected void |
engineUpdateAAD(byte[] src, int offset, int len)
继续一个附加的认证数据的多部分更新(AAD),使用所提供的缓冲区的一个子集。
|
protected void |
engineUpdateAAD(ByteBuffer src)
继续一个附加的认证数据的多部分更新(AAD)。
|
protected byte[] |
engineWrap(Key key)
包钥匙。
|
protected abstract void engineSetMode(String mode) throws NoSuchAlgorithmException
mode
-密码模式
NoSuchAlgorithmException
-如果要求加密模式不存在
protected abstract void engineSetPadding(String padding) throws NoSuchPaddingException
padding
-填充机制
NoSuchPaddingException
-如果要求填充机制不存在
protected abstract int engineGetBlockSize()
protected abstract int engineGetOutputSize(int inputLen)
update
或
doFinal
操作,
inputLen
给定输入长度(以字节为单位)。
这叫考虑任何未处理(缓冲)从以前的update
电话,数据填充,和AEAD标注。
第二update
或doFinal
称实际输出的长度可以小于由该方法返回的长度。
inputLen
-输入长度(以字节为单位)
protected abstract byte[] engineGetIV()
这是有用的在加密或解密密码的情况下,在四是从用户提供的密码。
protected abstract AlgorithmParameters engineGetParameters()
返回的参数可能是相同的,用于初始化这个密码,或可能包含默认值和随机参数值的组合使用的基本密码实现,如果这个密码需要算法参数,但没有初始化。
protected abstract void engineInit(int opmode, Key key, SecureRandom random) throws InvalidKeyException
密码是以下四个操作:加密、解密、密钥初始化包装或重点展开,根据opmode
价值。
如果这个密码要求任何算法的参数不能被来自给定的key
,底层的密码体制的实现应该是生成所需的参数本身(使用提供程序特定的默认或随机值)如果被加密或钥匙包初始化,和提高InvalidKeyException
如果它被初始化为解密或重点展开。生成的参数可以使用engineGetParameters
或engineGetIV
检索(如果该参数是一个四)。
如果这个密码需要算法参数,不能来自输入参数,有没有合理的供应商特定的默认值,初始化将必然失败。
如果这个密码(包括其潜在的反馈或填充方案)要求任意字节(例如,参数代),它将从random
让他们。
请注意,当一个密码对象被初始化时,它会丢失所有先前获得的状态。换句话说,初始化密码相当于创建密码和初始化一个新的实例。
opmode
-这个密码的操作模式(这是下列之一:
ENCRYPT_MODE
,
DECRYPT_MODE
,
WRAP_MODE
或
UNWRAP_MODE
)
key
-加密密钥
random
-随机源
InvalidKeyException
-如果给定的关键是初始化这个密码不合适,或者要求算法参数不能从给定的键确定。
UnsupportedOperationException
-如果
opmode
是
WRAP_MODE
或
UNWRAP_MODE
不是通过密码实现。
protected abstract void engineInit(int opmode, Key key, AlgorithmParameterSpec params, SecureRandom random) throws InvalidKeyException, InvalidAlgorithmParameterException
密码是以下四个操作:加密、解密、密钥初始化包装或重点展开,根据opmode
价值。
如果需要任何密码算法参数和params
是空的,底层的密码体制的实现应该是生成所需的参数本身(使用提供程序特定的默认或随机值)如果被加密或钥匙包初始化,和提高InvalidAlgorithmParameterException
如果它被初始化为解密或重点展开。生成的参数可以使用engineGetParameters
或engineGetIV
检索(如果该参数是一个四)。
如果这个密码需要算法参数,不能来自输入参数,有没有合理的供应商特定的默认值,初始化将必然失败。
如果这个密码(包括其潜在的反馈或填充方案)要求任意字节(例如,参数代),它将从random
让他们。
请注意,当一个密码对象被初始化时,它会丢失所有先前获得的状态。换句话说,初始化密码相当于创建密码和初始化一个新的实例。
opmode
-这个密码的操作模式(这是下列之一:
ENCRYPT_MODE
,
DECRYPT_MODE
,
WRAP_MODE
或
UNWRAP_MODE
)
key
-加密密钥
params
-算法参数
random
-随机源
InvalidKeyException
-如果给定的关键是初始化这个密码不合适
InvalidAlgorithmParameterException
-如果给定的算法参数,这个密码是不适当的,或如果该密码需要算法参数和
params
是空的。
UnsupportedOperationException
-如果
opmode
是
WRAP_MODE
或
UNWRAP_MODE
不是通过密码实现。
protected abstract void engineInit(int opmode, Key key, AlgorithmParameters params, SecureRandom random) throws InvalidKeyException, InvalidAlgorithmParameterException
密码是以下四个操作:加密、解密、密钥初始化包装或重点展开,根据opmode
价值。
如果需要任何密码算法参数和params
是空的,底层的密码体制的实现应该是生成所需的参数本身(使用提供程序特定的默认或随机值)如果被加密或钥匙包初始化,和提高InvalidAlgorithmParameterException
如果它被初始化为解密或重点展开。生成的参数可以使用engineGetParameters
或engineGetIV
检索(如果该参数是一个四)。
如果这个密码需要算法参数,不能来自输入参数,有没有合理的供应商特定的默认值,初始化将必然失败。
如果这个密码(包括其潜在的反馈或填充方案)要求任意字节(例如,参数代),它将从random
让他们。
请注意,当一个密码对象被初始化时,它会丢失所有先前获得的状态。换句话说,初始化密码相当于创建密码和初始化一个新的实例。
opmode
-这个密码的操作模式(这是下列之一:
ENCRYPT_MODE
,
DECRYPT_MODE
,
WRAP_MODE
或
UNWRAP_MODE
)
key
-加密密钥
params
-算法参数
random
-随机源
InvalidKeyException
-如果给定的关键是初始化这个密码不合适
InvalidAlgorithmParameterException
-如果给定的算法参数,这个密码是不适当的,或如果该密码需要算法参数和
params
是空的。
UnsupportedOperationException
-如果
opmode
是
WRAP_MODE
或
UNWRAP_MODE
不是通过密码实现。
protected abstract byte[] engineUpdate(byte[] input, int inputOffset, int inputLen)
在input
缓冲第一inputLen
字节,从inputOffset
包容,进行处理,其结果是存储在一个新的缓冲区。
input
-输入缓冲区
inputOffset
-
input
那里开始输入偏移
inputLen
-输入长度
protected abstract int engineUpdate(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset) throws ShortBufferException
在input
缓冲第一inputLen
字节,从inputOffset
包容,进行处理,并将结果存储在output
缓冲,从outputOffset
包容。
如果output
缓冲太小装不下的结果,一个ShortBufferException
抛出。
input
-输入缓冲区
inputOffset
-
input
那里开始输入偏移
inputLen
-输入长度
output
-结果缓冲区
outputOffset
-抵消
output
哪里结果存储
output
字节数
ShortBufferException
如果给定的输出缓冲区太小,保存结果
protected int engineUpdate(ByteBuffer input, ByteBuffer output) throws ShortBufferException
所有的input.remaining()
字节开始input.position()
处理。结果存储在输出缓冲区中。返回时,输入缓冲区的位置将等于它的极限,它的限制将不会改变。输出缓冲区的位置将有先进的N,其中N是通过这种方法返回的值,输出缓冲区的限制将不会改变。
如果output.remaining()
字节不够坚持的结果,一个ShortBufferException
抛出。
子类应该考虑重写此方法,如果他们能更有效地比过程字节缓冲区的字节数组。
input
-输入ByteBuffer
output
-输出ByteByffer
output
字节数
ShortBufferException
-如果在输出缓冲区没有足够的空间
NullPointerException
如果任一参数是
null
protected abstract byte[] engineDoFinal(byte[] input, int inputOffset, int inputLen) throws IllegalBlockSizeException, BadPaddingException
在input
缓冲第一inputLen
字节,从inputOffset
包容,这可能是一update
缓冲操作,在任何输入的字节处理,与填充(如果要求)的应用。如果一个失效模式如GCM / CCM正在使用,认证标签附加在加密的情况下,或在解密的情况下验证。结果存储在一个新的缓冲区中。
完成,这个方式将这个密码对象时的状态通过电话engineInit
先前初始化。那就是,对象是复位和可加密或解密(取决于被指定在调用engineInit
运营模式)更多的数据。
注:如果抛出任何异常,这个密码对象可能需要重置之前,它可以再次使用。
input
-输入缓冲区
inputOffset
-
input
那里开始输入偏移
inputLen
-输入长度
IllegalBlockSizeException
-如果这密码是一种分组密码,无填料已要求(仅在加密模式),以及数据处理的这一密码输入总长度不是块大小的倍数;或如果该加密算法无法处理输入数据的提供。
BadPaddingException
-如果这密码解密模式,和(联合国)填充已提出要求,但解密后的数据不通过适当的填充字节界
AEADBadTagException
-如果这密码解密的失效模式(如GCM / CCM),和接收的认证标签计算值不匹配
protected abstract int engineDoFinal(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset) throws ShortBufferException, IllegalBlockSizeException, BadPaddingException
在input
缓冲第一inputLen
字节,从inputOffset
包容,这可能是一update
缓冲操作,在任何输入的字节处理,与填充(如果要求)的应用。如果一个失效模式如GCM / CCM正在使用,认证标签附加在加密的情况下,或在解密的情况下验证。结果存储在output
缓冲,从outputOffset
包容。
如果output
缓冲太小装不下的结果,一个ShortBufferException
抛出。
完成,这个方式将这个密码对象时的状态通过电话engineInit
先前初始化。那就是,对象是复位和可加密或解密(取决于被指定在调用engineInit
运营模式)更多的数据。
注:如果抛出任何异常,这个密码对象可能需要重置之前,它可以再次使用。
input
-输入缓冲区
inputOffset
-
input
那里开始输入偏移
inputLen
-输入长度
output
-结果缓冲区
outputOffset
-抵消
output
哪里结果存储
output
字节数
IllegalBlockSizeException
-如果这密码是一种分组密码,无填料已要求(仅在加密模式),以及数据处理的这一密码输入总长度不是块大小的倍数;或如果该加密算法无法处理输入数据的提供。
ShortBufferException
如果给定的输出缓冲区太小,保存结果
BadPaddingException
-如果这密码解密模式,和(联合国)填充已提出要求,但解密后的数据不通过适当的填充字节界
AEADBadTagException
-如果这密码解密的失效模式(如GCM / CCM),和接收的认证标签计算值不匹配
protected int engineDoFinal(ByteBuffer input, ByteBuffer output) throws ShortBufferException, IllegalBlockSizeException, BadPaddingException
所有的input.remaining()
字节开始input.position()
处理。如果一个失效模式如GCM / CCM正在使用,认证标签附加在加密的情况下,或在解密的情况下验证。结果存储在输出缓冲区中。返回时,输入缓冲区的位置将等于它的极限,它的限制将不会改变。输出缓冲区的位置将有先进的N,其中N是通过这种方法返回的值,输出缓冲区的限制将不会改变。
如果output.remaining()
字节不够坚持的结果,一个ShortBufferException
抛出。
完成,这个方式将这个密码对象时的状态通过电话engineInit
先前初始化。那就是,对象是复位和可加密或解密(取决于被指定在调用engineInit
运营模式)更多的数据。
注:如果抛出任何异常,这个密码对象可能需要重置之前,它可以再次使用。
子类应该考虑重写此方法,如果他们能更有效地比过程字节缓冲区的字节数组。
input
-输入ByteBuffer
output
-输出ByteByffer
output
字节数
IllegalBlockSizeException
-如果这密码是一种分组密码,无填料已要求(仅在加密模式),以及数据处理的这一密码输入总长度不是块大小的倍数;或如果该加密算法无法处理输入数据的提供。
ShortBufferException
-如果在输出缓冲区没有足够的空间
BadPaddingException
-如果这密码解密模式,和(联合国)填充已提出要求,但解密后的数据不通过适当的填充字节界
AEADBadTagException
-如果这密码解密的失效模式(如GCM / CCM),和接收的认证标签计算值不匹配
NullPointerException
如果任一参数是
null
protected byte[] engineWrap(Key key) throws IllegalBlockSizeException, InvalidKeyException
这种具体方法已被添加到这个以前定义的抽象类。(为了向后兼容,它不能是抽象的。)可能会被供应商包装的关键。这样一个覆盖将抛出一个illegalblocksizeexception或invalidkeyexception(指定的情况下),如果给定的键不能用。如果这种方法不能被重写,它总是抛出UnsupportedOperationException。
key
-被包裹的关键。
IllegalBlockSizeException
-如果这密码是一种分组密码,无填料一直要求和编码的关键是包的长度不是块大小的倍数。
InvalidKeyException
-如果它与这个密码将密钥是不可能的或不安全的(例如,一个硬件保护的关键是通过一个软件密码)。
UnsupportedOperationException
-如果不支持这个方法。
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
。
UnsupportedOperationException
-如果不支持这个方法。
protected int engineGetKeySize(Key key) throws InvalidKeyException
这种具体方法已被添加到这个以前定义的抽象类。它抛出一个UnsupportedOperationException
如果不是由提供程序重写。
key
的关键对象。
InvalidKeyException
-如果
key
无效。
protected void engineUpdateAAD(byte[] src, int offset, int len)
调用此方法提供、密码等方式认证加密操作时(GCM / CCM)。如果这个密码是在GCM和CCM模式操作,必须提供所有与在开始操作的密文(通过update
和doFinal
方法)。
src
AAD的缓冲
offset
-
src
在AAD开始输入偏移
len
- AAD的字节数
IllegalStateException
-如果这个密码是错误的状态(例如,尚未初始化),不接受AAD,或者如果在GCM和CCM模式的一个
update
方法已被称为主动的加密/解密操作
UnsupportedOperationException
-如果这个方法没有被重写的实现
protected void engineUpdateAAD(ByteBuffer src)
调用此方法提供、密码等方式认证加密操作时(GCM / CCM)。如果这个密码是在GCM和CCM模式操作,必须提供所有与在开始操作的密文(通过update
和doFinal
方法)。
所有的src.remaining()
字节开始src.position()
处理。返回时,输入缓冲区的位置将等于它的极限,它的限制将不会改变。
src
AAD的缓冲
IllegalStateException
-如果这个密码是错误的状态(例如,尚未初始化),不接受AAD,或者如果在GCM和CCM模式的一个
update
方法已被称为主动的加密/解密操作
UnsupportedOperationException
-如果这个方法没有被重写的实现
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.