3.3.3 KeyAgreement

KeyAgreement类提供密钥协定协议的功能,它同样是一个引擎类。我们称它为密钥协定,将在DH算法实现中使用到它。


//此类提供密钥协定(或密钥交换)协议的功能。

public class KeyAgreement

extends Object


❑方法详述

与我们所熟悉的其他引擎类一样,KeyAgreement类需要通过getInstance()工厂方法来获得实例化对象:


//返回实现指定密钥协定算法的KeyAgreement对象。

public static KeyAgreement getInstance(String algorithm)

//返回实现指定密钥协定算法的KeyAgreement对象。

public static KeyAgreement getInstance(String algorithm, Provider provider)

//返回实现指定密钥协定算法的KeyAgreement对象。

public static KeyAgreement getInstance(String algorithm, String provider)


算法生成器共有两种初始化方式:与算法无关的方式或特定于算法的方式。

获得实例化对象后,需要执行以下初始化方法:


/用给定密钥初始化此KeyAgreement,给定密钥需要包含此KeyAgreement所需的所有算法参数。/

public void init(Key key)


当然,我们也可以指定密钥的同时给出对应的算法参数,方法如下所示:


//用给定密钥和算法参数集初始化此KeyAgreement。

public void init(Key key, AlgorithmParameterSpec params)


或者,基于上述方式,再加入安全随机数参数,方法如下所示:


//用给定密钥、算法参数集和随机源初始化此KeyAgreement。

public void init(Key key, AlgorithmParameterSpec params, SecureRandom random)


除上述方式外,我们也可以仅使用密钥和安全随机数两个参数完成初始化操作,方法如下所示:


//用给定密钥和随机源初始化此KeyAgreement。

public void init(Key key, SecureRandom random)


然后,我们需要调用如下方法执行计划:


/用给定密钥执行此KeyAgreement的下一个阶段,给定密钥是从此密钥协定所涉及的其他某个参与者那里接收的。/

public Key doPhase(Key key, boolean lastPhase)


最后,我们可以获得共享秘密密钥:


//生成共享秘密密钥并在新的缓冲区中返回它。

public byte[]generateSecret()

//生成共享秘密密钥,并将其放入缓冲区sharedSecret,从offset(包括)开始。

public int generateSecret(byte[]sharedSecret, int offset)

//创建共享秘密密钥并将其作为指定算法的SecretKey对象。

public SecretKey generateSecret(String algorithm)


此外,KeyAgreement类还提供了以下常用方法:


//返回此密钥协定对象的提供者。

public Provider getProvider()

//返回此密钥协定对象的算法名称。

public String getAlgorithm()


❑实现示例

KeyPairGenerator的实现是离不开DH算法的,如代码清单3-18所示。

代码清单3-18 DH算法密钥对生成


//实例化KeyPairGenerator对象,并指定DH算法。

KeyPairGenerator kpg=KeyPairGenerator.getInstance("DH");

//生成KeyPair对象kp1

KeyPair kp1=kpg.genKeyPair();

//生成KeyPair对象kp2

KeyPair kp2=kpg.genKeyPair();

//实例化KeyAgreement对象

KeyAgreement keyAgree=KeyAgreement.getInstance(kpg.getAlgorithm());

//初始化KeyAgreement对象

keyAgree.init(kp2.getPrivate());

//执行计划

keyAgree.doPhase(kp1.getPublic(),true);

//生成SecretKey对象

SecretKey secretKey=keyAgree.generateSecret("DES");