1、首先得到公私鑰對
//以指定的算法實例化KeyPairGenerator對象
KeyPairGenerator keygen = KeyPairGenerator.getInstance("DSA");
//初始化KeyPairGenerator
keygen.initialize(1024);
//生成KeyPair對象
KeyPair keys = keygen.genKeyPair();
2、得到公鑰字節數組
byte[] publicKeyBytes = keys.getPublic().getEncoded();
//實例化X509EncodedKeySpec對象
3、利用公鑰字節數組構造公鑰對象。
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
//以指定的算法實例化KeyFactory對象
KeyFactory keyFactory = KeyFactory.getInstance("DSA");
//獲得PublicKey對象
//public final PublicKey generatePublic(KeySpec keySpec)根據提供的密鑰規範(密鑰材料)生成公鑰對象。
PublicKey publicKey = keyFactory.generatePublic(keySpec);
私鑰創建過程與公鑰類似
AlgorithmParameterGenerator對象創建過程
1、調用AlgorithmParameterGenerator.getInstance()方法:
1)在方法getInstance()內部調用Security.getImpl(algorithm, "AlgorithmParameterGenerator", (String)null);方法返回一個對象數組
2)在調用帶參數的構造函數創建新的AlgorithmParameterGenerator對象返回
new AlgorithmParameterGenerator((AlgorithmParameterGeneratorSpi)objs[0], (Provider)objs[1], algorithm);
2、Initializes this parameter generator for a certain size.
public final void init(int size)
getInstance源碼:
public static AlgorithmParameterGenerator getInstance(String algorithm,
String provider)
throws NoSuchAlgorithmException, NoSuchProviderException
{
if (provider == null || provider.length() == 0)
throw new IllegalArgumentException("missing provider");
Object[] objs = Security.getImpl(algorithm,
"AlgorithmParameterGenerator",
provider);
return new AlgorithmParameterGenerator
((AlgorithmParameterGeneratorSpi)objs[0], (Provider)objs[1],
algorithm);
}
AlgorithmParameters、AlgorithmParameterGenerator等類的getInstance()方法內部實現結構基本相同。
X509EncodedKeySpec用於構建公鑰規範,PKCS8EncodedKeySpec用於構建私鑰規範
SecretKeySpec接口是KeySpec的實現類,用於構建祕密祕鑰規範