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

2017-05-23  本文已影响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 {
/**

*/

public static final String KEY_STORE = "JKS";

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

/**

*/

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;

}

/**

*/

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;

}

/**

*/

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;

}

/**

*/

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;

}

/**

*/

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;

}

/**

*/

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);

}

/**

*/

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】 ```
上一篇下一篇

猜你喜欢

热点阅读