KeyFactory(密钥工厂)用对密钥(Key类型的不透明密钥)和密钥规范(KeySpec类型的底层密钥密钥材料的透明表示)进行相互转换;也就是密钥工厂是双向的,可以把Key转换成KeySpec,也可以把KeySpec转换成Key。另外对于同一个密钥可以存在多个兼容的密钥规范。
SecretKeyFactory 和 KeyFactory的不同在于:KeyFactory用于非对称密钥加密时的密钥转换,而 SecretKeyFactory 用于对称密钥加密时的密钥转换。
-
Key:不透明的底层密钥,用于程序中的各个加密、解密、签名、验签等算法的使用。 -
KeySpec:底层密钥的透明表示,可用于密钥的存储,交换等。
程序生成的Key要进行存储和交换,必须要先转换成KeySpec;而在持久化设备中存储的或在网络中传输的密钥也必须经过KeySpec才能被转换成Key最终供应用中的加密、解密、签名、验签等算法使用。
实例化
KeyFactory 没有公开的构造方法,只能使用 getInstance方法进行实例化。这个方法有多个重载如下:
public static KeyFactory getInstance(String algorithm)
throws NoSuchAlgorithmException;
public static KeyFactory getInstance(String algorithm, Provider provider)
throws NoSuchAlgorithmException;
public static KeyFactory getInstance(String algorithm, String provider)
throws NoSuchAlgorithmException, NoSuchProviderException;
我们最常用的是 public static KeyFactory getInstance(String algorithm),此方法需要一个字符串作为参数,用于说明使用哪个密钥算法。
可用方法
generatePrivate
public final PrivateKey generatePrivate(KeySpec keySpec)
throws InvalidKeySpecException
根据给定的KeySpec对象,生成PrivateKey(私钥)对象。
generatePublic
public final PublicKey generatePublic(KeySpec keySpec)
throws InvalidKeySpecException
根据给定的KeySpec对象,PublicKey(生成公钥)对象。
getKeySpec
public final <T extends KeySpec> T getKeySpec(Key key, Class<T> keySpec)
throws InvalidKeySpecException
参数中给定的Key是待转换的密钥,而Class<T>是需要转换成的目标KeySpec类。
此方法就是要把给定的Key对象转换成目标KeySpec类对象。
translateKey
public final Key translateKey(Key key) throws InvalidKeyException
将密钥对象(其提供程序可能是未知的或可能不受信任的)转换为此密钥工厂的相应密钥对象。
支持的算法:
- DiffieHellman
- DSA
- RSA
- EC