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