公用密钥可以使用X509EnpredKeySpec进行存储,而私钥则使用PKCS8EnpredKeySpec。例如这样:
public static PrivateKey loadPrivateKey(String key64) throws GeneralSecurityException { byte[] clear = base64Depre(key64); PKCS8EnpredKeySpec keySpec = new PKCS8EnpredKeySpec(clear); KeyFactory fact = KeyFactory.getInstance("DSA"); PrivateKey priv = fact.generatePrivate(keySpec); Arrays.fill(clear, (byte) 0); return priv;}public static PublicKey loadPublicKey(String stored) throws GeneralSecurityException { byte[] data = base64Depre(stored); X509EnpredKeySpec spec = new X509EnpredKeySpec(data); KeyFactory fact = KeyFactory.getInstance("DSA"); return fact.generatePublic(spec);}public static String savePrivateKey(PrivateKey priv) throws GeneralSecurityException { KeyFactory fact = KeyFactory.getInstance("DSA"); PKCS8EnpredKeySpec spec = fact.getKeySpec(priv, PKCS8EnpredKeySpec.class); byte[] packed = spec.getEnpred(); String key64 = base64Enpre(packed); Arrays.fill(packed, (byte) 0); return key64;}public static String savePublicKey(PublicKey publ) throws GeneralSecurityException { KeyFactory fact = KeyFactory.getInstance("DSA"); X509EnpredKeySpec spec = fact.getKeySpec(publ, X509EnpredKeySpec.class); return base64Enpre(spec.getEnpred());}public static void main(String[] args) throws Exception { KeyPairGenerator gen = KeyPairGenerator.getInstance("DSA"); KeyPair pair = gen.generateKeyPair(); String pubKey = savePublicKey(pair.getPublic()); PublicKey pubSaved = loadPublicKey(pubKey); System.out.println(pair.getPublic()+"n"+pubSaved); String privKey = savePrivateKey(pair.getPrivate()); PrivateKey privSaved = loadPrivateKey(privKey); System.out.println(pair.getPrivate()+"n"+privSaved);}


