importorg.apache.commons.codec.binary.Base64;import java.security.*;importjava.security.spec.PKCS8EncodedKeySpec;importjava.security.spec.X509EncodedKeySpec;importjava.util.HashMap;importjava.util.Map;importjavax.crypto.Cipher;/*** Created by humf.需要依赖 commons-codec 包*/
public classRSACoder {public static final String KEY_ALGORITHM = "RSA";public static final String SIGNATURE_ALGORITHM = "MD5withRSA";private static final String PUBLIC_KEY = "RSAPublicKey";private static final String PRIVATE_KEY = "RSAPrivateKey";public static byte[] decryptBASE64(String key) {returnBase64.decodeBase64(key);
}public static String encryptBASE64(byte[] bytes) {returnBase64.encodeBase64String(bytes);
}/*** 用私钥对信息生成数字签名
*
*@paramdata 加密数据
*@paramprivateKey 私钥
*@return*@throwsException*/
public static String sign(byte[] data, String privateKey) throwsException {//解密由base64编码的私钥
byte[] keyBytes =decryptBASE64(privateKey);//构造PKCS8EncodedKeySpec对象
PKCS8EncodedKeySpec pkcs8KeySpec = newPKCS8EncodedKeySpec(keyBytes);//KEY_ALGORITHM 指定的加密算法
KeyFactory keyFactory =KeyFactory.getInstance(KEY_ALGORITHM);//取私钥匙对象
PrivateKey priKey =keyFactory.generatePrivate(pkcs8KeySpec);//用私钥对信息生成数字签名
Signature signature =Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initSign(priKey);
signature.update(data);returnencryptBASE64(signature.sign());
}/*** 校验数字签名
*
*@paramdata 加密数据
*@parampublicKey 公钥
*@paramsign 数字签名
*@return校验成功返回true 失败返回false
*@throwsException*/
public static boolean verify(byte[] data, String publicKey, String sign)throwsException {//解密由base64编码的公钥
byte[] keyBytes =decryptBASE64(publicKey);//构造X509EncodedKeySpec对象
X509EncodedKeySpec keySpec = newX509EncodedKeySpec(keyBytes);//KEY_ALGORITHM 指定的加密算法
KeyFactory keyFactory =KeyFactory.getInstance(KEY_ALGORITHM);//取公钥匙对象
PublicKey pubKey =keyFactory.generatePublic(keySpec);
Signature signature=Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initVerify(pubKey);
signature.update(data);//验证签名是否正常
returnsignature.verify(decryptBASE64(sign));
}public static byte[] decryptByPrivateKey(byte[] data, String key) throwsException{//对密钥解密
byte[] keyBytes =decryptBASE64(key);//取得私钥
PKCS8EncodedKeySpec pkcs8KeySpec = newPKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);
Key privateKey=keyFactory.generatePrivate(pkcs8KeySpec);//对数据解密
Cipher cipher =Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, privateKey);returncipher.doFinal(data);
}/*** 解密
* 用私钥解密
*
*@paramdata
*@paramkey
*@return*@throwsException*/
public static byte[] decryptByPrivateKey(String data, String key)throwsException {returndecryptByPrivateKey(decryptBASE64(data),key);
}/*** 解密
* 用公钥解密
*
*@paramdata
*@paramkey
*@return*@throwsException*/
public static byte[] decryptByPublicKey(byte[] data, String key)throwsException {//对密钥解密
byte[] keyBytes =decryptBASE64(key);//取得公钥
X509EncodedKeySpec x509KeySpec = newX509EncodedKeySpec(keyBytes);
KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);
Key publicKey=keyFactory.generatePublic(x509KeySpec);//对数据解密
Cipher cipher =Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, publicKey);returncipher.doFinal(data);
}/*** 加密
* 用公钥加密
*
*@paramdata
*@paramkey
*@return*@throwsException*/
public static byte[] encryptByPublicKey(String data, String key)throwsException {//对公钥解密
byte[] keyBytes =decryptBASE64(key);//取得公钥
X509EncodedKeySpec x509KeySpec = newX509EncodedKeySpec(keyBytes);
KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);
Key publicKey=keyFactory.generatePublic(x509KeySpec);//对数据加密
Cipher cipher =Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, publicKey);returncipher.doFinal(data.getBytes());
}/*** 加密
* 用私钥加密
*
*@paramdata
*@paramkey
*@return*@throwsException*/
public static byte[] encryptByPrivateKey(byte[] data, String key)throwsException {//对密钥解密
byte[] keyBytes =decryptBASE64(key);//取得私钥
PKCS8EncodedKeySpec pkcs8KeySpec = newPKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);
Key privateKey=keyFactory.generatePrivate(pkcs8KeySpec);//对数据加密
Cipher cipher =Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, privateKey);returncipher.doFinal(data);
}/*** 取得私钥
*
*@paramkeyMap
*@return*@throwsException*/
public static String getPrivateKey(MapkeyMap)throwsException {
Key key=(Key) keyMap.get(PRIVATE_KEY);returnencryptBASE64(key.getEncoded());
}/*** 取得公钥
*
*@paramkeyMap
*@return*@throwsException*/
public static String getPublicKey(MapkeyMap)throwsException {
Key key=keyMap.get(PUBLIC_KEY);returnencryptBASE64(key.getEncoded());
}/*** 初始化密钥
*
*@return*@throwsException*/
public static Map initKey() throwsException {
KeyPairGenerator keyPairGen=KeyPairGenerator
.getInstance(KEY_ALGORITHM);
keyPairGen.initialize(1024);
KeyPair keyPair=keyPairGen.generateKeyPair();
Map keyMap = new HashMap(2);
keyMap.put(PUBLIC_KEY, keyPair.getPublic());//公钥
keyMap.put(PRIVATE_KEY, keyPair.getPrivate());//私钥
returnkeyMap;
}public static void main(String[] args) throwsException {
Map keyMap =initKey();
String publicKey=getPublicKey(keyMap);
String privateKey=getPrivateKey(keyMap);
System.out.println(keyMap);
System.out.println("-----------------------------------");
System.out.println(publicKey);
System.out.println("-----------------------------------");
System.out.println(privateKey);
System.out.println("-----------------------------------");byte[] encryptByPrivateKey = encryptByPrivateKey("123456".getBytes(),privateKey);byte[] encryptByPublicKey = encryptByPublicKey("123456",publicKey);
System.out.println(newString(encryptByPrivateKey));
System.out.println("-----------------------------------");
System.out.println(newString(encryptByPublicKey));
System.out.println("-----------------------------------");
String sign=sign(encryptByPrivateKey,privateKey);
System.out.println(sign);
System.out.println("-----------------------------------");boolean verify =verify(encryptByPrivateKey,publicKey,sign);
System.out.println(verify);
System.out.println("-----------------------------------");byte[] decryptByPublicKey =decryptByPublicKey(encryptByPrivateKey,publicKey);byte[] decryptByPrivateKey =decryptByPrivateKey(encryptByPublicKey,privateKey);
System.out.println(newString(decryptByPublicKey));
System.out.println("-----------------------------------");
System.out.println(newString(decryptByPrivateKey));
}
}