本文以Android簽名JKS格式的證書為例:
package com.test;import java.io.FileInputStream;import java.security.Key;import java.security.KeyStore;import java.security.PrivateKey;import java.security.PublicKey;import javax.crypto.Cipher;public class SignTest { public static void main(String[] args) { try { // 用證書的私鑰解密 - 該私鑰存在生成該證書的密鑰庫中 FileInputStream fis2 = new FileInputStream("G://shanhytest.keystore"); KeyStore ks = KeyStore.getInstance("JKS"); // 加載證書庫 char[] kspwd = "shanhytest".toCharArray(); // 證書庫密碼 char[] keypwd = "shanhytest".toCharArray(); // 證書密碼 String alias = "shanhytest";// 別名 ks.load(fis2, kspwd); // 加載證書 PrivateKey privateKey = (PrivateKey) ks.getKey(alias, keypwd); // 獲取證書私鑰 PublicKey publicKey = ks.getCertificate(alias).getPublicKey();// 獲取證書公鑰 fis2.close(); System.out.println("privateKey = " + getKeyString(privateKey)); System.out.println("publicKey = " + getKeyString(publicKey)); // 測試加密解密字符串 String srcContent = "今天天氣不錯。"; // 將字符串使用公鑰加密后,再用私鑰解密后,驗證是否能正常還原。 // 因為非對稱加密算法適合對小數(shù)據(jù)量的數(shù)據(jù)進行加密和解密,而且性能比較差,所以在實際的操作過程中,我們通常采用的方式是:采用非對稱加密算法管理對稱算法的密鑰,然后用對稱加密算法加密數(shù)據(jù),這樣我們就集成了兩類加密算法的優(yōu)點,既實現(xiàn)了加密速度快的優(yōu)點,又實現(xiàn)了安全方便管理密鑰的優(yōu)點。 byte[] d1 = crypt(publicKey, srcContent.getBytes(), Cipher.ENCRYPT_MODE); byte[] d2 = crypt(privateKey, d1, Cipher.DECRYPT_MODE); System.out.println(new String(d2)); } catch (Exception e) { e.printStackTrace(); } } /** * 將KEY轉(zhuǎn)換為字符串 * * @param key * @return * @author SHANHY */ private static String getKeyString(Key key) { byte[] keyBytes = key.getEncoded(); String s = new String(org.apache.commons.codec.binary.Base64.encodeBase64(keyBytes)); return s; } /** * 加密/解密 * * @param key * 私鑰打包成byte[]形式 * @param data * 要解密的數(shù)據(jù) * @param opmode * 操作類型(Cipher.DECRYPT_MODE為解密,Cipher.ENCRYPT_MODE為加密) * @return 解密數(shù)據(jù) */ public static byte[] crypt(Key key, byte[] data, int opmode) { try { long startTime = System.currentTimeMillis(); Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");//jdk默認標準// Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");// android默認標準 cipher.init(opmode, key); byte[] result = cipher.doFinal(data); System.out.println((Cipher.DECRYPT_MODE==opmode?"解密":"加密") + "耗時:" + (System.currentTimeMillis() - startTime)); return result; } catch (Exception e) { e.printStackTrace(); } return null; }}以上這篇獲取Android簽名證書的公鑰和私鑰的簡單實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持武林網(wǎng)。
新聞熱點
疑難解答