如题所述
public abstract class RSACoder extends Coder {
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";
/**
* ç¨ç§é¥å¯¹ä¿¡æ¯çææ°åç¾å
*
* @param data
* å å¯æ°æ®
* @param privateKey
* ç§é¥
*
* @return
* @throws Exception
*/
public static String sign(byte[] data, String privateKey) throws Exception {
// 解å¯ç±base64ç¼ç çç§é¥
byte[] keyBytes = decryptBASE64(privateKey);
// æé PKCS8EncodedKeySpec对象
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(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);
return encryptBASE64(signature.sign());
}
/**
* æ ¡éªæ°åç¾å
*
* @param data
* å å¯æ°æ®
* @param publicKey
* å ¬é¥
* @param sign
* æ°åç¾å
*
* @return æ ¡éªæåè¿åtrue 失败è¿åfalse
* @throws Exception
*
*/
public static boolean verify(byte[] data, String publicKey, String sign)
throws Exception {
// 解å¯ç±base64ç¼ç çå ¬é¥
byte[] keyBytes = decryptBASE64(publicKey);
// æé X509EncodedKeySpec对象
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(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);
// éªè¯ç¾åæ¯å¦æ£å¸¸
return signature.verify(decryptBASE64(sign));
}
/**
* 解å¯<br>
* ç¨ç§é¥è§£å¯
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] decryptByPrivateKey(byte[] data, String key)
throws Exception {
// 对å¯é¥è§£å¯
byte[] keyBytes = decryptBASE64(key);
// åå¾ç§é¥
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
// 对æ°æ®è§£å¯
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
/**
* 解å¯<br>
* ç¨ç§é¥è§£å¯
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] decryptByPublicKey(byte[] data, String key)
throws Exception {
// 对å¯é¥è§£å¯
byte[] keyBytes = decryptBASE64(key);
// åå¾å ¬é¥
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key publicKey = keyFactory.generatePublic(x509KeySpec);
// 对æ°æ®è§£å¯
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, publicKey);
return cipher.doFinal(data);
}
/**
* å å¯<br>
* ç¨å ¬é¥å å¯
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] encryptByPublicKey(byte[] data, String key)
throws Exception {
// å¯¹å ¬é¥è§£å¯
byte[] keyBytes = decryptBASE64(key);
// åå¾å ¬é¥
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key publicKey = keyFactory.generatePublic(x509KeySpec);
// 对æ°æ®å å¯
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(data);
}
/**
* å å¯<br>
* ç¨ç§é¥å å¯
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] encryptByPrivateKey(byte[] data, String key)
throws Exception {
// 对å¯é¥è§£å¯
byte[] keyBytes = decryptBASE64(key);
// åå¾ç§é¥
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
// 对æ°æ®å å¯
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
/**
* åå¾ç§é¥
*
* @param keyMap
* @return
* @throws Exception
*/
public static String getPrivateKey(Map<String, Object> keyMap)
throws Exception {
Key key = (Key) keyMap.get(PRIVATE_KEY);
return encryptBASE64(key.getEncoded());
}
/**
* åå¾å ¬é¥
*
* @param keyMap
* @return
* @throws Exception
*/
public static String getPublicKey(Map<String, Object> keyMap)
throws Exception {
Key key = (Key) keyMap.get(PUBLIC_KEY);
return encryptBASE64(key.getEncoded());
}
/**
* åå§åå¯é¥
*
* @return
* @throws Exception
*/
public static Map<String, Object> initKey() throws Exception {
KeyPairGenerator keyPairGen = KeyPairGenerator
.getInstance(KEY_ALGORITHM);
keyPairGen.initialize(1024);
KeyPair keyPair = keyPairGen.generateKeyPair();
// å ¬é¥
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
// ç§é¥
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
Map<String, Object> keyMap = new HashMap<String, Object>(2);
keyMap.put(PUBLIC_KEY, publicKey);
keyMap.put(PRIVATE_KEY, privateKey);
return keyMap;
}
}
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";
/**
* ç¨ç§é¥å¯¹ä¿¡æ¯çææ°åç¾å
*
* @param data
* å å¯æ°æ®
* @param privateKey
* ç§é¥
*
* @return
* @throws Exception
*/
public static String sign(byte[] data, String privateKey) throws Exception {
// 解å¯ç±base64ç¼ç çç§é¥
byte[] keyBytes = decryptBASE64(privateKey);
// æé PKCS8EncodedKeySpec对象
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(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);
return encryptBASE64(signature.sign());
}
/**
* æ ¡éªæ°åç¾å
*
* @param data
* å å¯æ°æ®
* @param publicKey
* å ¬é¥
* @param sign
* æ°åç¾å
*
* @return æ ¡éªæåè¿åtrue 失败è¿åfalse
* @throws Exception
*
*/
public static boolean verify(byte[] data, String publicKey, String sign)
throws Exception {
// 解å¯ç±base64ç¼ç çå ¬é¥
byte[] keyBytes = decryptBASE64(publicKey);
// æé X509EncodedKeySpec对象
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(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);
// éªè¯ç¾åæ¯å¦æ£å¸¸
return signature.verify(decryptBASE64(sign));
}
/**
* 解å¯<br>
* ç¨ç§é¥è§£å¯
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] decryptByPrivateKey(byte[] data, String key)
throws Exception {
// 对å¯é¥è§£å¯
byte[] keyBytes = decryptBASE64(key);
// åå¾ç§é¥
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
// 对æ°æ®è§£å¯
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
/**
* 解å¯<br>
* ç¨ç§é¥è§£å¯
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] decryptByPublicKey(byte[] data, String key)
throws Exception {
// 对å¯é¥è§£å¯
byte[] keyBytes = decryptBASE64(key);
// åå¾å ¬é¥
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key publicKey = keyFactory.generatePublic(x509KeySpec);
// 对æ°æ®è§£å¯
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, publicKey);
return cipher.doFinal(data);
}
/**
* å å¯<br>
* ç¨å ¬é¥å å¯
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] encryptByPublicKey(byte[] data, String key)
throws Exception {
// å¯¹å ¬é¥è§£å¯
byte[] keyBytes = decryptBASE64(key);
// åå¾å ¬é¥
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key publicKey = keyFactory.generatePublic(x509KeySpec);
// 对æ°æ®å å¯
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(data);
}
/**
* å å¯<br>
* ç¨ç§é¥å å¯
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] encryptByPrivateKey(byte[] data, String key)
throws Exception {
// 对å¯é¥è§£å¯
byte[] keyBytes = decryptBASE64(key);
// åå¾ç§é¥
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
// 对æ°æ®å å¯
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
/**
* åå¾ç§é¥
*
* @param keyMap
* @return
* @throws Exception
*/
public static String getPrivateKey(Map<String, Object> keyMap)
throws Exception {
Key key = (Key) keyMap.get(PRIVATE_KEY);
return encryptBASE64(key.getEncoded());
}
/**
* åå¾å ¬é¥
*
* @param keyMap
* @return
* @throws Exception
*/
public static String getPublicKey(Map<String, Object> keyMap)
throws Exception {
Key key = (Key) keyMap.get(PUBLIC_KEY);
return encryptBASE64(key.getEncoded());
}
/**
* åå§åå¯é¥
*
* @return
* @throws Exception
*/
public static Map<String, Object> initKey() throws Exception {
KeyPairGenerator keyPairGen = KeyPairGenerator
.getInstance(KEY_ALGORITHM);
keyPairGen.initialize(1024);
KeyPair keyPair = keyPairGen.generateKeyPair();
// å ¬é¥
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
// ç§é¥
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
Map<String, Object> keyMap = new HashMap<String, Object>(2);
keyMap.put(PUBLIC_KEY, publicKey);
keyMap.put(PRIVATE_KEY, privateKey);
return keyMap;
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答 2018-08-07
本文介绍RSA2加密与解密,RSA2是RSA的加强版本,在密钥长度上采用2048, RSA2比RSA更安全,更可靠, 本人的另一篇文章RSA已经发表,有想了解的可以点开下面的RSA文章