获取Android签名证书的公钥和私钥的简单实例
本文以Android签名JKS格式的证书为例:
packagecom.test;
importjava.io.FileInputStream;
importjava.security.Key;
importjava.security.KeyStore;
importjava.security.PrivateKey;
importjava.security.PublicKey;
importjavax.crypto.Cipher;
publicclassSignTest{
publicstaticvoidmain(String[]args){
try{
//用证书的私钥解密-该私钥存在生成该证书的密钥库中
FileInputStreamfis2=newFileInputStream("G:\\shanhytest.keystore");
KeyStoreks=KeyStore.getInstance("JKS");//加载证书库
char[]kspwd="shanhytest".toCharArray();//证书库密码
char[]keypwd="shanhytest".toCharArray();//证书密码
Stringalias="shanhytest";//别名
ks.load(fis2,kspwd);//加载证书
PrivateKeyprivateKey=(PrivateKey)ks.getKey(alias,keypwd);//获取证书私钥
PublicKeypublicKey=ks.getCertificate(alias).getPublicKey();//获取证书公钥
fis2.close();
System.out.println("privateKey="+getKeyString(privateKey));
System.out.println("publicKey="+getKeyString(publicKey));
//测试加密解密字符串
StringsrcContent="今天天气不错。";
//将字符串使用公钥加密后,再用私钥解密后,验证是否能正常还原。
//因为非对称加密算法适合对小数据量的数据进行加密和解密,而且性能比较差,所以在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。
byte[]d1=crypt(publicKey,srcContent.getBytes(),Cipher.ENCRYPT_MODE);
byte[]d2=crypt(privateKey,d1,Cipher.DECRYPT_MODE);
System.out.println(newString(d2));
}catch(Exceptione){
e.printStackTrace();
}
}
/**
*将KEY转换为字符串
*
*@paramkey
*@return
*@authorSHANHY
*/
privatestaticStringgetKeyString(Keykey){
byte[]keyBytes=key.getEncoded();
Strings=newString(org.apache.commons.codec.binary.Base64.encodeBase64(keyBytes));
returns;
}
/**
*加密/解密
*
*@paramkey
*私钥打包成byte[]形式
*@paramdata
*要解密的数据
*@paramopmode
*操作类型(Cipher.DECRYPT_MODE为解密,Cipher.ENCRYPT_MODE为加密)
*@return解密数据
*/
publicstaticbyte[]crypt(Keykey,byte[]data,intopmode){
try{
longstartTime=System.currentTimeMillis();
Ciphercipher=Cipher.getInstance("RSA/ECB/PKCS1Padding");//jdk默认标准
//Ciphercipher=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));
returnresult;
}catch(Exceptione){
e.printStackTrace();
}
returnnull;
}
}
以上这篇获取Android签名证书的公钥和私钥的简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
