3.2.10 KeyPairGenerator
公钥和私钥的生成是由KeyPairGenerator类来实现的,因此我们把它称为密钥对生成器,它同样是一个引擎类。
//生成用于非对称加密算法中含有公钥/私钥的密钥对,并提供相关信息。
public abstract class KeyPairGenerator
extends KeyPairGeneratorSpi
在Java 6中,提供了DH、DSA和RSA等多种非对称加密算法实现。
关于Java 6中提供的算法信息,请查看本书附录。
❑方法详述
KeyPairGenerator本身是一个抽象类,可通过getInstance()工厂方法实例化对象。
通常我们指定算法名称,直接获得密钥对实例化对象,方法如下所示:
//返回生成指定算法的公钥/私钥密钥对的KeyPairGenerator对象。
public static KeyPairGenerator getInstance(String algorithm)
或者,指定算法的同时指明该算法的提供者,方法如下所示:
//返回生成指定算法的公钥/私钥密钥对的KeyPairGenerator对象。
public static KeyPairGenerator getInstance(String algorithm, Provider provider)
//返回生成指定算法的公钥/私钥密钥对的KeyPairGenerator对象。
public static KeyPairGenerator getInstance(String algorithm, String provider)
密钥对生成器共有两种初始化方式:与算法无关的方式和特定于算法的方式,这一点类似于算法参数生成器。
两种方式的唯一区别在于对象的初始化:
·与算法无关的初始化
所有的密钥对生成器遵循密钥大小和随机源的概念。KeyPairGenerator类提供了两个initialize()方法,这两个方法都含有密钥大小参数,另一个方法还要求提供SecureRandom参数。
·特定于算法的初始化
对于特定于算法的参数集合已存在的情况(例如,DSA中所谓的公用参数),KeyPairGenerator类提供了两个initialize()方法,都具有AlgorithmParameterSpec参数。其中一个方法还有一个SecureRandom参数,而另一个方法使用以最高优先级安装的提供者的SecureRandom实现作为随机源。(如果任何安装的提供者都不提供SecureRandom的实现,则使用系统提供的随机源。)
与算法无关的初始化方法如下:
/初始化给定密钥大小的密钥对生成器,使用默认的参数集合,并使用以最高优先级安装的提供者的SecureRandom实现作为随机源。/
public void initialize(int keysize)
//使用给定的随机源(和默认的参数集合)初始化确定密钥大小的密钥对生成器。
public void initialize(int keysize, SecureRandom random)
特定于算法的初始化方法如下:
/初始化KeyPairGenerator对象,使用指定参数集合,并使用以最高优先级安装的提供者的SecureRandom的实现作为随机源。/
public void initialize(AlgorithmParameterSpec params)
//使用给定参数集合和随机源初始化KeyPairGenerator对象。
public void initialize(AlgorithmParameterSpec params, SecureRandom random)
通常,较为常用的是前两个方法。注意参数int keysize,这个参数用来控制密钥长度,单位为位。
我们通过第2章的学习已经知道,密钥长度决定密码安全强度。在使用该类实现具体某一种算法时,需要切合实际设置相应的密钥长度。如构建DH算法密钥对,其密钥长度要求为64位的倍数,密钥长度范围为512~1024位,即DH算法密钥长度可为512、576、640位等,按64位的整数倍递增至1024位。
如果在实例化操作后未执行初始化操作,密钥长度将设置为默认长度。如DH算法密钥长度默认值为1024位。关于Java 6中密码算法与密钥长度说明,请见本书附录。
在完成上述操作后,可以通过如下方法生成密钥对:
//生成一个KeyPair对象。
public KeyPair generateKeyPair()
//生成KeyPair对象。
Public final KeyPair genKeyPair()
注意这两个方法,genKeyPair()方法内部实现时调用了generateKeyPair()方法,给出相应的代码片段:
public KeyPair generateKeyPair(){
return null;
}
public final KeyPair genKeyPair(){
return generateKeyPair();
}
generateKeyPair()方法由具体的密钥对生成器提供者实现,通常使用genKeyPair()方法获得密钥对。
与其他引擎类一样,密钥对生成器提供如下两种方法:
//返回此密钥对生成器算法的标准名称。
public String getAlgorithm()
//返回此密钥对生成器对象的提供者。
public final Provider getProvider()
❑实现示例
经过上述方法相结合,我们可以很方便地生成一个密钥对,如生成一个DSA算法密钥对:
//实例化KeyPairGenerator对象。
KeyPairGenerator kpg=KeyPairGenerator.getInstance("DSA");
//初始化KeyPairGenerator对象。
kpg.initialize(1024);
//生成KeyPair对象。
KeyPair keys=kpg.genKeyPair();
KeyPairGenerator类提供了非对称密钥对的生成实现,如果要生成私钥可使用KeyGenerator(javax.crypto.KeyGenerator)类。我们将在下一节中讲述它。