3.4.2 EncodedKeySpec

EncodedKeySpec类用编码格式来表示公钥和私钥,我们称它为编码密钥规范。编码密钥规范的实现子类很多,在这里不一一详述。本文将详细介绍最为常用的用于表示公钥和私钥的两个实现类。

X509EncodedKeySpec和PKCS8EncodedKeySpec两个类均为EncodedKeySpec的子类,X509EncodedKeySpec类用于转换公钥编码密钥,PKCS8EncodedKeySpec类用于转换私钥编码密钥。


//此类用编码格式表示公钥或私钥。

public abstract class EncodedKeySpec

extends Object

implements KeySpec


以下是该类的方法,我们将通过其两个重要的子类来详述如何使用:


//根据给定的编码密钥创建一个新的编码密钥规范。

public EncodedKeySpec(byte[]encodedKey)

//返回编码密钥。

public byte[]getEncoded()

//返回与此密钥规范相关联的编码格式的名称。

public abstract String getFormat()


1.X509EncodedKeySpec

X509EncodedKeySpec类继承EncodedKeySpec类,以编码格式来表示公钥。

X509EncodedKeySpec类使用X.509标准作为密钥规范管理的编码格式,该类的命名由此得来。


//用编码格式表示公用。

public class X509EncodedKeySpec

extends EncodedKeySpec


❑方法详述

可通过如下方法实例化对象:


//根据给定的编码密钥创建一个新的X509EncodedKeySpec。

public X509EncodedKeySpec(byte[]encodedKey)


以下两种方法均依照X.509标准:


//返回按照X.509标准进行编码的密钥的字节。

public byte[]getEncoded()

//返回与此密钥规范相关联的编码格式的名称。将得到字符串"X.509"。

public String getFormat()


❑实现示例

首先,我们通过如下代码获得密钥对:


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

KeyPairGenerator keygen=KeyPairGenerator.getInstance("DSA");

//初始化KeyPairGenerator对象。

keygen.initialize(1024);

//生成KeyPair对象。

KeyPair keys=keygen.genKeyPair();


其次,我们获得公钥的密钥字节数组:


//获得公钥密钥字节数组。

byte[]publicKeyBytes=keys.getPublic().getEncoded();


最后,我们将获得的公钥密钥字节数组再转换为公钥对象:


//实例化X509EncodedKeySpec对象。

X509EncodedKeySpec keySpec=new X509EncodedKeySpec(publicKeyBytes);

//实例化KeyFactory对象,并指定DSA算法。

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

//获得PublicKey对象。

PublicKey publicKey=keyFactory.generatePublic(keySpec);


私钥对象的转换与此大致相同。

2.PKCS8EncodedKeySpec

PKCS8EncodedKeySpec类继承EncodedKeySpec类,以编码格式来表示私钥。

PKCS8EncodedKeySpec类使用PKCS#8标准作为密钥规范管理的编码格式,该类的命名由此得来。


//用编码格式来表示私钥。

public class PKCS8EncodedKeySpec

extends EncodedKeySpec


❑方法详述

可通过如下方法实例化对象:


//根据给定的编码密钥创建一个新的PKCS8EncodedKeySpec。

public PKCS8EncodedKeySpec(byte[]encodedKey)


以下两种方法均依照PKCS#8标准:


//返回按照PKCS#8标准编码的密钥字节。

public byte[]getEncoded()

//返回与此密钥规范相关联的编码格式的名称。将得到字符串"PKCS#8"。

public String getFormat()


❑实现示例

下面根据前面介绍的实现示例来展示如何获得私钥对象。

通过获得的密钥对,我们来获得私钥密钥编码字节数组:


//获得私钥密钥字节数组。

byte[]privateKeyBytes=keys.getPrivate().getEncoded();


最后,我们将获得私钥对象:


//实例化PKCS8EncodedKeySpec对象。

PKCS8EncodedKeySpec keySpec=new PKCS8EncodedKeySpec(privateKeyBytes);

//实例化KeyFactory对象,并指定DSA算法。

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

//获得PrivateKey对象。

PrivateKey privateKey=keyFactory.generatePrivate(keySpec);


X509EncodedKeySpec和PKCS8EncodedKeySpec两个类在加密解密环节中经常会用到。密钥很可能会以二进制方式存储于文件中,由程序来读取。这时候,就需要通过这两个类将文件中的字节数组读出转换为密钥对象。