KeyAgreement
类定义了服务提供者接口(SPI)。该类中的所有抽象方法必须由每个希望提供特定密钥协议算法实现的加密服务提供者来实现。
用于建立共享密钥的密钥是由密钥生成器之一(KeyPairGenerator
或KeyGenerator
)、一个KeyFactory
或作为密钥协议的中间阶段的结果(engineDoPhase
)创建的。
对于密钥交换中的每个通信方,需要调用engineDoPhase
。例如,如果密钥交换是与另一方进行的,则需要调用engineDoPhase
一次,并将lastPhase
标志设置为true
。如果密钥交换是与另外两个方进行的,则需要调用engineDoPhase
两次,第一次将lastPhase
标志设置为false
,第二次设置为true
。在密钥交换中可能涉及任意数量的方。
- 自从:
- 1.4
- 参见:
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionprotected abstract Key
engineDoPhase
(Key key, boolean lastPhase) 使用从参与此密钥协议的其他方接收的给定密钥执行此密钥协议的下一阶段。protected abstract byte[]
生成共享密钥并将其放入新缓冲区中返回。protected abstract int
engineGenerateSecret
(byte[] sharedSecret, int offset) 生成共享密钥,并将其放入从offset
开始的缓冲区sharedSecret
中。protected abstract SecretKey
engineGenerateSecret
(String algorithm) 创建共享密钥并将其作为所请求算法类型的秘密密钥对象返回。protected abstract void
engineInit
(Key key, SecureRandom random) 使用给定的密钥和随机源初始化此密钥协议。protected abstract void
engineInit
(Key key, AlgorithmParameterSpec params, SecureRandom random) 使用给定的密钥、算法参数集和随机源初始化此密钥协议。
-
Constructor Details
-
KeyAgreementSpi
public KeyAgreementSpi()子类调用的构造函数。
-
-
Method Details
-
engineInit
使用给定的密钥和随机源初始化此密钥协议。要求给定的密钥包含此密钥协议所需的所有算法参数。如果密钥协议算法需要随机字节,则从给定的随机源
random
获取。但是,如果底层算法实现不需要任何随机字节,则会忽略random
。- 参数:
-
key
- 方的私有信息。例如,在Diffie-Hellman密钥协议的情况下,这将是方自己的Diffie-Hellman私钥。 -
random
- 随机源 - 抛出:
-
InvalidKeyException
- 如果给定的密钥不适用于此密钥协议,例如,类型错误或具有不兼容的算法类型。
-
engineInit
protected abstract void engineInit(Key key, AlgorithmParameterSpec params, SecureRandom random) throws InvalidKeyException, InvalidAlgorithmParameterException 使用给定的密钥、算法参数集和随机源初始化此密钥协议。- 参数:
-
key
- 方的私有信息。例如,在Diffie-Hellman密钥协议的情况下,这将是方自己的Diffie-Hellman私钥。 -
params
- 密钥协议参数 -
random
- 随机源 - 抛出:
-
InvalidKeyException
- 如果给定的密钥不适用于此密钥协议,例如,类型错误或具有不兼容的算法类型。 -
InvalidAlgorithmParameterException
- 如果给定的参数不适用于此密钥协议。
-
engineDoPhase
protected abstract Key engineDoPhase(Key key, boolean lastPhase) throws InvalidKeyException, IllegalStateException 使用从参与此密钥协议的其他方接收的给定密钥执行此密钥协议的下一阶段。- 参数:
-
key
- 此阶段的密钥。例如,在两方之间的Diffie-Hellman中,这将是另一方的Diffie-Hellman公钥。 -
lastPhase
- 指示这是否是此密钥协议的最后阶段的标志。 - 返回:
-
由此阶段产生的(中间)密钥,如果此阶段不产生密钥,则返回
null
- 抛出:
-
InvalidKeyException
- 如果给定的密钥不适用于此阶段。 -
IllegalStateException
- 如果此密钥协议尚未初始化。
-
engineGenerateSecret
生成共享密钥并将其放入新缓冲区中返回。此方法将此
KeyAgreementSpi
对象重置为最近调用init
方法后的状态。调用generateSecret
后,对象可以通过调用doPhase
提供新密钥,然后调用generateSecret
生成新密钥,以便用于进一步的密钥协议操作。在这种情况下,供给init
的私有信息和算法参数将用于多个密钥协议操作。可以在generateSecret
后调用init
以更改用于后续操作的私有信息。- 返回:
- 具有共享密钥的新缓冲区
- 抛出:
-
IllegalStateException
- 如果此密钥协议尚未初始化或者如果尚未调用doPhase
为协议中的所有方提供密钥
-
engineGenerateSecret
protected abstract int engineGenerateSecret(byte[] sharedSecret, int offset) throws IllegalStateException, ShortBufferException 生成共享密钥,并将其放入从offset
开始的缓冲区sharedSecret
中。如果
sharedSecret
缓冲区太小而无法容纳结果,则会抛出ShortBufferException
。在这种情况下,应使用更大的输出缓冲区重复此调用。此方法将此
KeyAgreementSpi
对象重置为最近调用init
方法后的状态。调用generateSecret
后,对象可以通过调用doPhase
提供新密钥,然后调用generateSecret
生成新密钥,以便用于进一步的密钥协议操作。在这种情况下,供给init
的私有信息和算法参数将用于多个密钥协议操作。可以在generateSecret
后调用init
以更改用于后续操作的私有信息。- 参数:
-
sharedSecret
- 共享密钥的缓冲区 -
offset
- 共享密钥将存储在其中的sharedSecret
中的偏移量 - 返回:
-
放入
sharedSecret
的字节数 - 抛出:
-
IllegalStateException
- 如果此密钥协议尚未初始化或者如果尚未调用doPhase
为协议中的所有方提供密钥 -
ShortBufferException
- 如果给定的输出缓冲区太小而无法容纳密钥
-
engineGenerateSecret
protected abstract SecretKey engineGenerateSecret(String algorithm) throws IllegalStateException, NoSuchAlgorithmException, InvalidKeyException 创建共享密钥并将其作为所请求算法类型的秘密密钥对象返回。此方法将此
KeyAgreementSpi
对象重置为最近调用init
方法后的状态。调用generateSecret
后,对象可以通过调用doPhase
提供新密钥,然后调用generateSecret
生成新密钥,以便用于进一步的密钥协议操作。在这种情况下,供给init
的私有信息和算法参数将用于多个密钥协议操作。可以在generateSecret
后调用init
以更改用于后续操作的私有信息。- 参数:
-
algorithm
- 请求的秘密密钥算法 - 返回:
- 共享秘密密钥
- 抛出:
-
IllegalStateException
- 如果此密钥协议尚未初始化或者如果尚未调用doPhase
为协议中的所有方提供密钥 -
NoSuchAlgorithmException
- 如果请求的秘密密钥算法不可用 -
InvalidKeyException
- 如果共享的秘密密钥材料无法用于生成所请求算法类型的秘密密钥(例如,密钥材料太短)
-