1 importjava.io.FileInputStream;2 importjava.security.KeyStore;3 importjava.security.PrivateKey;4 importjava.security.PublicKey;5 importjava.security.Signature;6 importjava.security.cert.Certificate;7 importjava.security.cert.CertificateFactory;8 importjava.security.cert.X509Certificate;9
10 importjavax.crypto.Cipher;11
12
13
14
15
16 public classCertificateCoder {17
18 public static final String CERT_TYPE="X.509";19
20
21
22 /**
23 * 获取私匙24 *@paramkeyStorePath25 *@parampwd26 *@paramalias27 *@returnPrivateKey 私匙28 *@throwsException29 */
30 private static PrivateKey getPrivateKey(String keyStorePath,String pwd,String alias) throwsException{31 KeyStore ks=getKeyStore(keyStorePath, pwd);32 return(PrivateKey)ks.getKey(alias, pwd.toCharArray());33
34 }35
36
37 /**
38 *39 *@paramkeyStorePath40 *@parampwd41 *@returnkeyStore 密匙库42 *@throwsException43 */
44 private static KeyStore getKeyStore(String keyStorePath,String pwd) throwsException{45 KeyStore ks=KeyStore.getInstance(KeyStore.getDefaultType());46 FileInputStream in=newFileInputStream(keyStorePath);47 ks.load(in,pwd.toCharArray());48 in.close();49 returnks;50 }51
52
53 /**
54 *55 *@paramcertificatePath56 *@returnCertificate 证书57 *@throwsException58 */
59 private static Certificate getCertificate(String certificatePath) throwsException{60 CertificateFactory factory=CertificateFactory.getInstance(CERT_TYPE);61 FileInputStream in=newFileInputStream(certificatePath);62 Certificate certificate=factory.generateCertificate(in);63 in.close();64 returncertificate;65
66 }67
68
69 /**
70 * 通过证书返回公匙71 *@paramcertificatePath72 *@returnPublickey 返回公匙73 *@throwsException74 */
75 private static PublicKey getPublicKeyByCertificate(String certificatePath) throwsException{76 Certificate certificate=getCertificate(certificatePath);77 returncertificate.getPublicKey();78 }79
80
81 /**
82 *83 *@paramkeyStorePath84 *@paramalias85 *@parampwd86 *@returnCertificate 证书87 *@throwsException88 */
89 private static Certificate getCertificate(String keyStorePath,String alias,String pwd) throwsException{90 KeyStore ks=getKeyStore(keyStorePath, pwd);91 //获取证书
92 returnks.getCertificate(alias);93 }94
95
96 /**
97 * 私匙加密98 *@paramdata99 *@paramkeyStorePath100 *@paramalias101 *@parampwd102 *@returnbyte[] 被私匙加密的数据103 *@throwsException104 */
105 public static byte[] encryptByPrivateKey(byte[] data,String keyStorePath,String alias,String pwd) throwsException{106 PrivateKey privateKey=getPrivateKey(keyStorePath, pwd, alias);107 //对数据进行加密
108 Cipher cipher=Cipher.getInstance(privateKey.getAlgorithm());109 cipher.init(Cipher.ENCRYPT_MODE, privateKey);110 returncipher.doFinal(data);111
112 }113
114
115 /**
116 * 私匙解密117 *@paramdata118 *@paramkeyStorePath119 *@paramalias120 *@parampwd121 *@returnbyte[] 私匙解密的数据122 *@throwsException123 */
124 public static byte[] decryptByPrivateKey(byte[] data,String keyStorePath,String alias,String pwd) throwsException{125 PrivateKey privateKey=getPrivateKey(keyStorePath, pwd, alias);126 Cipher cipher=Cipher.getInstance(privateKey.getAlgorithm());127 cipher.init(cipher.DECRYPT_MODE, privateKey);128 returncipher.doFinal(data);129 }130
131
132 /**
133 * 公匙加密134 *@paramdata135 *@paramcerPath136 *@returnbyte[] 被公匙加密的数据137 *@throwsException138 */
139 public static byte[] encryptByPublicKey(byte[] data,String cerPath) throwsException{140 //获取公匙
141 PublicKey publicKey=getPublicKeyByCertificate(cerPath);142 System.out.println(publicKey.getAlgorithm());143 Cipher cipher=Cipher.getInstance(publicKey.getAlgorithm());144 cipher.init(Cipher.ENCRYPT_MODE, publicKey);145 returncipher.doFinal(data);146 }147
148 /**
149 * 公匙解密150 *@paramdata151 *@paramcerPath152 *@return
153 *@throwsException154 */
155 public static byte[] decryptByPublicKey(byte[] data,String cerPath) throwsException{156 PublicKey publicKey=getPublicKeyByCertificate(cerPath);157 Cipher cipher=Cipher.getInstance(publicKey.getAlgorithm());158 cipher.init(Cipher.DECRYPT_MODE, publicKey);159 returncipher.doFinal(data);160 }161
162 /**
163 * 签名164 *@paramsign165 *@paramkeyStorePath166 *@parampwd167 *@paramalias168 *@return
169 *@throwsException170 */
171 public static byte[] sign(byte[] sign,String keyStorePath,String pwd,String alias) throwsException{172 //获取证书
173 X509Certificate x509=(X509Certificate)getCertificate(keyStorePath, alias, pwd);174 //构建签名,由证书指定签名算法
175 Signature sa=Signature.getInstance(x509.getSigAlgName());176 //获取私匙
177 PrivateKey privateKey=getPrivateKey(keyStorePath, pwd, alias);178 sa.initSign(privateKey);179 sa.update(sign);180 returnsa.sign();181 }182
183 /**
184 * 验证签名185 *@paramdata186 *@paramsign187 *@paramcerPath188 *@return
189 *@throwsException190 */
191 public static boolean verify(byte[] data,byte[] sign,String cerPath) throwsException{192 X509Certificate x509=(X509Certificate)getCertificate(cerPath);193 Signature sa=Signature.getInstance(x509.getSigAlgName());194 sa.initVerify(x509);195 sa.update(data);196 returnsa.verify(sign);197 }198 }