美文网首页
从test.keystore中读出公钥和私钥

从test.keystore中读出公钥和私钥

作者: 星林的窗 | 来源:发表于2017-05-23 20:19 被阅读0次

    由于从keystore文件中获取的公私钥均是字节码,不便于显示、传输,因此先上一个基础Coder类,实现Base64转码功能.

    
    importsun.misc.BASE64Encoder;
    
    /**
    
    * 基础加密组件
    
    *
    
    * @author 奔跑的蜗牛
    
    * @version 1.0
    
    * @since 1.0
    
    */
    
    publicabstractclassCoder {
    
    /**
    
    * BASE64解密
    
    *
    
    * @param key
    
    * @return
    
    * @throws Exception
    
    */
    
    publicstaticbyte[] decryptBASE64(String key)throwsException {
    
    return(newBASE64Decoder()).decodeBuffer(key);
    
    }
    
    /**
    
    * BASE64加密
    
    *
    
    * @param key
    
    * @return
    
    * @throws Exception
    
    */
    
    publicstaticString encryptBASE64(byte[] key)throwsException {
    
    return(newBASE64Encoder()).encodeBuffer(key).replace("\r","").replace("\n","");
    
    }
    
    }```
    
    下面的KeyStoreCoder类实获取公、私钥,以及实现RSA加密算法的公钥加密、私钥解密功能:
    
    

    import java.io.FileInputStream;

    import java.security.KeyFactory;

    import java.security.KeyStore;

    import java.security.PrivateKey;

    import java.security.PublicKey;

    import java.security.spec.PKCS8EncodedKeySpec;

    import java.security.spec.X509EncodedKeySpec;

    import javax.crypto.Cipher;

    import com.techshino.base.Coder;

    public class KeyStoreCoder extends Coder {
    /**

    • Java密钥库(Java Key Store,JKS)KEY_STORE

    */

    public static final String KEY_STORE = "JKS";

    public static final String X509 = "X.509";

    /**

    • 获得KeyStore

    • @author 奔跑的蜗牛

    • @version 2012-3-16

    • @param keyStorePath

    • @param password

    • @return

    • @throws Exception

    */

    private static KeyStore getKeyStore(String keyStorePath, String password)

    throws Exception {

    FileInputStream is = new FileInputStream(keyStorePath);

    KeyStore ks = KeyStore.getInstance(KEY_STORE);

    ks.load(is, password.toCharArray());

    is.close();

    return ks;

    }

    /**

    • 由KeyStore获得私钥

    • @author 奔跑的蜗牛

    • @param keyStorePath

    • @param alias

    • @param storePass

    • @return

    • @throws Exception

    */

    private static PrivateKey getPrivateKey(String keyStorePath, String alias, String storePass, String keyPass) throws Exception {

    KeyStore ks = getKeyStore(keyStorePath, storePass);

    PrivateKey key = (PrivateKey) ks.getKey(alias, keyPass.toCharArray());

    return key;

    }

    /**

    • 由Certificate获得公钥

    • @author 奔跑的蜗牛

    • @param keyStorePath

    •        KeyStore路径
      
    • @param alias

    •        别名
      
    • @param storePass

    •        KeyStore访问密码
      
    • @return

    • @throws Exception

    */

    private static PublicKey getPublicKey(String keyStorePath, String alias, String storePass) throws Exception {

    KeyStore ks = getKeyStore(keyStorePath, storePass);

    PublicKey key = ks.getCertificate(alias).getPublicKey();

    return key;

    }

    /**

    • 从KeyStore中获取公钥,并经BASE64编码

    • @author 奔跑的蜗牛

    • @param keyStorePath

    • @param alias

    • @param storePass

    • @return

    • @throws Exception

    */

    public static String getStrPublicKey(String keyStorePath, String alias,String storePass) throws Exception{

    PublicKey key = getPublicKey(keyStorePath, alias, storePass);

    String strKey = Coder.encryptBASE64(key.getEncoded());

    return strKey;

    }

    /**

    • 获取经BASE64编码后的私钥

    • @author 奔跑的蜗牛

    • @param keyStorePath

    • @param alias

    • @param storePass

    • @param keyPass

    • @return

    • @throws Exception

    */

    public static String getStrPrivateKey(String keyStorePath, String alias,String storePass, String keyPass) throws Exception{

    PrivateKey key = getPrivateKey(keyStorePath, alias, storePass, keyPass);

    String strKey = Coder.encryptBASE64(key.getEncoded());

    return strKey;

    }

    /**

    • 使用公钥加密数据

    • @author 奔跑的蜗牛

    • @param publicKey

    • @param srcData

    • @return

    • @throws Exception

    */

    public static String encryptByPublicKey(String publicKey, String srcData) throws Exception{

    //解密

    byte[] pk = Coder.decryptBASE64(publicKey);

    X509EncodedKeySpec spec = new X509EncodedKeySpec(pk);

    KeyFactory kf = KeyFactory.getInstance("RSA");

    //获取公钥

    PublicKey pubKey = kf.generatePublic(spec);

    // 对数据加密

    Cipher cipher = Cipher.getInstance("RSA");

    cipher.init(Cipher.ENCRYPT_MODE, pubKey);

    byte[] doFinal = cipher.doFinal(srcData.getBytes());

    return encryptBASE64(doFinal);

    }

    /**

    • 使用私钥解密数据

    • @author 奔跑的蜗牛

    • @param privateKey

    • @param data

    • @return

    • @throws Exception

    */

    public static String descryptByPrivateKey(String privateKey, String data) throws Exception{

    // BASE64转码解密私钥

    byte[] pk = Coder.decryptBASE64(privateKey);

    // BASE64转码解密密文

    byte[] text = decryptBASE64(data);

    PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(pk);

    KeyFactory kf = KeyFactory.getInstance("RSA");

    // 获取私钥

    PrivateKey prvKey = kf.generatePrivate(spec);

    // 对数据加密

    Cipher cipher = Cipher.getInstance("RSA");

    cipher.init(Cipher.DECRYPT_MODE, prvKey);

    byte[] doFinal = cipher.doFinal(text);

    return new String(doFinal);

    }

    }```

    控制台输出:

    公钥=【MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5hLd9FryBcXdlKKGICd3/axQ85V5QmB/0P7a5KhZr0vJaGX+7YRJt4NYpH1+pEob0TkFaFXzYZSZIZa3R63tS1pWpvKSWdSEy1Spb9qBS1FMp0j8vhQN1ydFv1Fh3Ds6vqBoGYyvqmkRLworLDUiRWuEQqxNcsNjx2HMJnhpdxwIDAQAB】
    私钥 = 【MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBALmEt30WvIFxd2UooYgJ3f9rFDzlXlCYH/Q/trkqFmvS8loZf7thEm3g1ikfX6kShvROQVoVfNhlJkhlrdHre1LWlam8pJZ1ITLVKlv2oFLUUynSPy+FA3XJ0W/UWHcOzq+oGgZjK+qaREvCissNSJFa4RCrE1yw2PHYcwmeGl3HAgMBAAECgYEAgcFvzQ/v/OFtztUiVdIA8brlRspusxQTlXRSyyPC1tuOIrKfAmIcz7loUQ7ei5Sny4xIbUeGMJxesFhdwOthLxdcM54/lLW5ZCukUdUeLhjec1zTwCYZ9P1Ihrt63HOFRIVymak3f+eIWi4vmlNghSxyUGmXz1TYj/hI8wzWeZECQQDt7O5o+tZDGNPTzb4ppSyeZcRClcaLnvenig7Jyi3EOfv/gydANcUex5Fr8AnCkzAPIF0R3jU1vBbc0KKfnX1dAkEAx5yYjYQMJIFrJB6PYjhlwsOQi+cKFnphHnvaxPWP+LVAEduxjcKonvMmwqDq+6163omeXYEDn02pqeZoWMlxcwJAIpy7Oi5ziSNNfZyKs4hB63EmkgEz9w/TO15MNHLjIY7F6C/uP9sSqB2kPC2ZXeMHtMuifnzzBLQuJ0V6wvmoSQJBAKtfzLGi7vHgkuXdvuhq1yMR1+XlJAoMY5lSaI607ThwFGPApH265B4jT+HFWjldxaGNsYNBoqSAfuu5P1kLCfUCQQCJOv9FKXh5uWNO+Rcg4l7xwpnfCWtZKqrEWDy0cCfllfUPs0t8uRNZPKuroVGrZKJuvSGvQwM5g2pTAwRuctpM】
    
    经RSA公钥加密后 = Ktj2HnI9MddXTcpYvORDrad9VmpMshBxMNro3QVXDw4meWadQXnEhc4s7w5sqPQezVCXEvDaONjngftXaYU5pagibaHh6jloIz562nqIDdYm91mbY1N8rgLH6S04zm4oqBhNai6xL5G/ecHvIySfCOqyItS1qWf7Umywhogluwc=
    
    经RSA公钥加密后长度 = 172
    
    经RSA私钥解密后 = 【Java实现RSA加密算法!】
    
    经RSA私钥解密后长度 = 【14】 ```

    相关文章

      网友评论

          本文标题:从test.keystore中读出公钥和私钥

          本文链接:https://www.haomeiwen.com/subject/timgxxtx.html