3.2.11 KeyFactory

KeyFactory类也是用来生成密钥(公钥和私钥)的引擎类,我们将它称为密钥工厂,它用来生成公钥/私钥,或者说它的作用是通过密钥规范还原密钥。与KeyFactory类相对应的类是SecretKeyFactory类,这个类用于生成秘密密钥,我们将在3.3.4节中详述。KeySpec接口定义了密钥规范,有关KeySpec接口,请参见3.4.1节。


//按照指定的编码格式或密钥参数,提供一个用于输入和输出密钥的基础设施。

public class KeyFactory

extends Object


❑方法详述

KeyFactory类同样通过getInstance()工厂方法来获得实例化对象。

我们可以通过指定算法名称的方式获得实例化对象,如下所示:


//返回转换指定算法的公钥/私钥关键字的KeyFactory对象。

public static KeyFactory getInstance(String algorithm)


另外一种方式就是指定算法名称的时候指定该算法的提供者,如下所示:


//返回转换指定算法的公钥/私钥关键字的KeyFactory对象。

public static KeyFactory getInstance(String algorithm, Provider provider)

//返回转换指定算法的公钥/私钥关键字的KeyFactory对象。

public static KeyFactory getInstance(String algorithm, String provider)


KeyFactory类最常用的操作就是通过密钥规范获得相应的密钥,其方法如下:


//根据提供的密钥规范(密钥材料)生成PublicKey对象。

public final PublicKey generatePublic(KeySpec keySpec)

//根据提供的密钥规范(密钥材料)生成PrivateKey对象。

public final PrivateKey generatePrivate(KeySpec keySpec)


可以通过以下方法获得密钥规范:


//返回给定密钥对象的规范(密钥材料)。

public final<T extends KeySpec>T getKeySpec(Key key, Class<T>keySpec)


可以通过以下方法转换来自不同提供者装载的密钥类型:


//将提供者可能未知或不受信任的密钥对象转换成此密钥工厂对应的密钥对象。

public final Key translateKey(Key key)


密钥工厂同样提供以下两个常用方法:


//获取与此KeyFactory关联的算法的名称。

public final String getAlgorithm()

//返回此KeyFactory对象的提供者。

public final Provider getProvider()


❑实现示例

通过代码清单3-9来说明密钥工厂如何将密钥字节数组转换为密钥对象。

代码清单3-9 构建密钥对与还原密钥


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

KeyPairGenerator keyPairGen=KeyPairGenerator.getInstance("RSA");

//初始化KeyPairGenerator对象。

keyPairGen.initialize(1024);

//生成KeyPair对象。

KeyPair keyPair=keyPairGen.generateKeyPair();

//获得私钥密钥字节数组。实际使用过程中该密钥以此种形式保存传递给另一方。

byte[]keyBytes=keyPair.getPrivate().getEncoded();

//由私钥密钥字节数组获得密钥规范。

PKCS8EncodedKeySpec pkcs8KeySpec=new PKCS8EncodedKeySpec(keyBytes);

//实例化密钥工厂,并指定RSA算法。

KeyFactory keyFactory=KeyFactory.getInstance("RSA");

//生成私钥

Key privateKey=keyFactory.generatePrivate(pkcs8KeySpec);


有关密钥规范请参见3.4节的相关内容。