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");