文章内容
1、公私钥生成
/**
* 创建RSA密钥对
*
* @return List:0 公钥;1 私钥
*/ public static List<String> createRsaKey() {
List<String> keyList = new ArrayList<String>();
try {
/**
* 实例化密钥生成器
*/ KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_RSA);
/**
* 初始化密钥生成器
*/ keyPairGenerator.initialize(SIZE_RSA);
/**
* 生成密钥对
*/ KeyPair keyPair = keyPairGenerator.generateKeyPair();
/**
* 公钥
*/ RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
/**
* 私钥
*/ RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
keyList.add(SignatureUtil.base64Encode(publicKey.getEncoded()));
keyList.add(SignatureUtil.base64Encode(privateKey.getEncoded()));
} catch (Exception e) {
// Do nothing
}
return keyList;
}
2、公钥加密
/**
* RSA公钥加密
*
* @param data
* 待加密数据
* @param key
* 密钥
* @return String 加密数据
*/ public static String rsaEncryptByPublicKey(String data, String key) {
return base64Encode(rsaEncryptByPublicKey(data.getBytes(), base64DecodeBytes(key)));
}
/**
* RSA公钥加密
*
* @param data
* 待加密数据
* @param key
* 密钥
* @return byte[] 加密数据
*/ public static byte[] rsaEncryptByPublicKey(byte[] data, byte[] key) {
byte[] result = null;
try {
/**
* 实例化密钥工厂
*/ KeyFactory keyFactory = KeyFactory.getInstance(KEY_RSA);
//
/**
* 初始化公钥, 密钥材料转换
*/ X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);
/**
* 产生公钥
*/ PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);
/**
* 数据加密
*/ Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
result = cipher.doFinal(data);
} catch (Exception e) {
// Do nothing
}
return result;
}
3、私钥加密
/**
* RSA私钥加密
*
* @param data
* 待加密数据
* @param key
* 密钥
* @return String 加密数据
*/ public static String rsaEncryptByPrivateKey(String data, String key) {
return base64Encode(rsaEncryptByPrivateKey(data.getBytes(), base64DecodeBytes(key)));
}
/**
* RSA私钥加密
*
* @param data
* 待加密数据
* @param key
* 密钥
* @return byte[] 加密数据
*/ public static byte[] rsaEncryptByPrivateKey(byte[] data, byte[] key) {
byte[] result = null;
try {
/**
* 取得私钥
*/ PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_RSA);
/**
* 生成私钥
*/ PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
/**
* 数据加密
*/ Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
result = cipher.doFinal(data);
} catch (Exception e) {
// Do nothing
}
return result;
}
4、公钥解密
/**
* RSA公钥解密
*
* @param data
* 待解密数据
* @param key
* 密钥
* @return String 解密数据
*/ public static String rsaDecryptByPublicKey(String data, String key) {
return new String(rsaDecryptByPublicKey(base64DecodeBytes(data), base64DecodeBytes(key)));
}
/**
* RSA公钥解密
*
* @param data
* 待解密数据
* @param key
* 密钥
* @return byte[] 解密数据
*/ public static byte[] rsaDecryptByPublicKey(byte[] data, byte[] key) {
byte[] result = null;
try {
/**
* 实例化密钥工厂
*/ KeyFactory keyFactory = KeyFactory.getInstance(KEY_RSA);
//
/**
* 初始化公钥,密钥材料转换
*/ X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);
/**
* 产生公钥
*/ PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);
/**
* 数据解密
*/ Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, pubKey);
result = cipher.doFinal(data);
} catch (Exception e) {
// Do nothing
}
return result;
}
5、私钥解密
/**
* RSA私钥解密
*
* @param data
* 待解密数据
* @param key
* 密钥
* @return String 解密数据
*/ public static String rsaDecryptByPrivateKey(String data, String key) {
return new String(rsaDecryptByPrivateKey(base64DecodeBytes(data), base64DecodeBytes(key)));
}
/**
* RSA私钥解密
*
* @param data
* 待解密数据
* @param key
* 密钥
* @return byte[] 解密数据
*/ public static byte[] rsaDecryptByPrivateKey(byte[] data, byte[] key) {
byte[] result = null;
try {
/**
* 取得私钥
*/ PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_RSA);
/**
* 生成私钥
*/ PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
/**
* 数据解密
*/ Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, privateKey);
result = cipher.doFinal(data);
} catch (Exception e) {
// Do nothing
}
return result;
}
6、工具方法与常量
public static final String KEY_RSA = "RSA";
private static final int SIZE_RSA = 512;
/**
* base64编码
*
* @param data
* @return
*/ public static String base64Encode(byte[] data) {
String result = null;
if (data != null) {
try {
result = Base64.encodeBase64String(data);
} catch (Exception e) {
// Do nothing
}
}
return result;
}
/**
* base64解码
*
* @param data
* @return
*/ public static byte[] base64DecodeBytes(String data) {
byte[] result = null;
if (data != null) {
result = Base64.decodeBase64(data);
}
return result;
}