java 在线rsa解密_通用的Java RSA加密工具类,可在线验证通过
/**
* RSA加密工具類
* 使用PKCS1_PADDING填充,密鑰長(zhǎng)度1024
* 加解密結(jié)果在這里測(cè)試通過:http://tool.chacuo.net/cryptrsaprikey
* 注意加密內(nèi)容的編碼要一致,統(tǒng)一UTF-8比較好
* @author daxi
*/
public class RSAUtil {
public static final String KEY_ALGORTHM="RSA";
public static final String SIGNATURE_ALGORITHM="MD5withRSA";
public static final String PUBLIC_KEY = "RSAPublicKey";//公鑰
public static final String PRIVATE_KEY = "RSAPrivateKey";//私鑰
/**
* 初始化密鑰
* RSA加密解密的實(shí)現(xiàn),需要有一對(duì)公私密鑰,公私密鑰的初始化如下
* 非對(duì)稱加密一般都用于加密對(duì)稱加密算法的密鑰,而不是直接加密內(nèi)容
* @return
* @throws Exception
*/
public static Map initKey()throws Exception{
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORTHM);
keyPairGenerator.initialize(1024);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
//公鑰
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
//私鑰
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
Map keyMap = new HashMap(2);
keyMap.put(PUBLIC_KEY, publicKey);
keyMap.put(PRIVATE_KEY, privateKey);
return keyMap;
}
/**
* 取得公鑰,并轉(zhuǎn)化為String類型
* @param keyMap
* @return
* @throws Exception
*/
public static String getPublicKey(Map keyMap)throws Exception{
Key key = (Key) keyMap.get(PUBLIC_KEY);
return Coder.encryptBASE64(key.getEncoded());
}
/**
* 取得私鑰,并轉(zhuǎn)化為String類型
* @param keyMap
* @return
* @throws Exception
*/
public static String getPrivateKey(Map keyMap) throws Exception{
Key key = (Key) keyMap.get(PRIVATE_KEY);
return Coder.encryptBASE64(key.getEncoded());
}
/**
* 用私鑰加密
* @param data加密數(shù)據(jù)
* @param key密鑰
* @return
* @throws Exception
*/
public static byte[] encryptByPrivateKey(byte[] data,String key)throws Exception{
//解密密鑰
byte[] keyBytes = Coder.decryptBASE64(key);
//取私鑰
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM);
Key privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
//對(duì)數(shù)據(jù)加密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
/**
* 用私鑰解密 * @param data 加密數(shù)據(jù)
* @param key密鑰
* @return
* @throws Exception
*/
public static byte[] decryptByPrivateKey(byte[] data,String key)throws Exception{
//對(duì)私鑰解密
byte[] keyBytes = Coder.decryptBASE64(key);
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM);
Key privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
//對(duì)數(shù)據(jù)解密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
/**
* 用公鑰加密
* @param data加密數(shù)據(jù)
* @param key密鑰
* @return
* @throws Exception
*/
public static byte[] encryptByPublicKey(byte[] data,String key)throws Exception{
//對(duì)公鑰解密
byte[] keyBytes = Coder.decryptBASE64(key);
//取公鑰
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM);
Key publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
//對(duì)數(shù)據(jù)解密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(data);
}
/**
* 用公鑰解密
* @param data加密數(shù)據(jù)
* @param key密鑰
* @return
* @throws Exception
*/
public static byte[] decryptByPublicKey(byte[] data,String key)throws Exception{
//對(duì)私鑰解密
byte[] keyBytes = Coder.decryptBASE64(key);
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM);
Key publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
//對(duì)數(shù)據(jù)解密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, publicKey);
return cipher.doFinal(data);
}
/**************************************************************************
* 通過RSA加密解密算法,我們可以實(shí)現(xiàn)數(shù)字簽名的功能。我們可以用私鑰對(duì)信息生
* 成數(shù)字簽名,再用公鑰來校驗(yàn)數(shù)字簽名,當(dāng)然也可以反過來公鑰簽名,私鑰校驗(yàn)。
* *************************************************************************/
/**
*用私鑰對(duì)信息生成數(shù)字簽名
* @param data//加密數(shù)據(jù)
* @param privateKey//私鑰
* @return
* @throws Exception
*/
public static String sign(byte[] data,String privateKey)throws Exception{
//解密私鑰
byte[] keyBytes = Coder.decryptBASE64(privateKey);
//構(gòu)造PKCS8EncodedKeySpec對(duì)象
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(keyBytes);
//指定加密算法
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM);
//取私鑰匙對(duì)象
PrivateKey privateKey2 = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
//用私鑰對(duì)信息生成數(shù)字簽名
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initSign(privateKey2);
signature.update(data);
return Coder.encryptBASE64(signature.sign());
}
/**
* 校驗(yàn)數(shù)字簽名
* @param data加密數(shù)據(jù)
* @param publicKey公鑰
* @param sign數(shù)字簽名
* @return
* @throws Exception
*/
public static boolean verify(byte[] data,String publicKey,String sign)throws Exception{
//解密公鑰
byte[] keyBytes = Coder.decryptBASE64(publicKey);
//構(gòu)造X509EncodedKeySpec對(duì)象
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes);
//指定加密算法
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM);
//取公鑰匙對(duì)象
PublicKey publicKey2 = keyFactory.generatePublic(x509EncodedKeySpec);
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initVerify(publicKey2);
signature.update(data);
//驗(yàn)證簽名是否正常
return signature.verify(Coder.decryptBASE64(sign));
}
public static void main(String[] args) throws Exception {
// 生產(chǎn)密鑰
Map keys = RSAUtil.initKey();
// 打印私鑰
System.out.println("↓↓↓↓↓the following is private key↓↓↓↓↓");
System.out.println("-----BEGIN PRIVATE KEY-----");
System.out.println(RSAUtil.getPrivateKey(keys));
System.out.println("-----END PRIVATE KEY-----");
System.out.println("↑↑↑↑↑the above is private key↑↑↑↑↑");
System.out.println();
// 打印公鑰
System.out.println("↓↓↓↓↓the following is public key↓↓↓↓↓");
System.out.println("-----BEGIN PUBLIC KEY-----");
System.out.println(RSAUtil.getPublicKey(keys));
System.out.println("-----END PUBLIC KEY-----");
System.out.println("↑↑↑↑↑the above is public key↑↑↑↑↑");
// 加密樣例:
// File file1 = new File("E:\\pub-key.txt");
// String pub = IOUtils.toString(new FileInputStream(file1));
// pub = pub.replace("-----BEGIN PUBLIC KEY-----" + IOUtils.LINE_SEPARATOR, "").replace("-----END PUBLIC KEY-----", "");
// byte[] helloE = RSAUtil.encryptByPublicKey("hello".getBytes("UTF-8"), pub);
// String helloBase64 = Coder.encryptBASE64(helloE);
// System.out.println(helloBase64);
// // 解密樣例
// String naughty = "DuuB+ZcqSMTL2PVzOIaHtLDQ5t0r+S2twsAdNt7GNjD1AGVPpiiQz/fVfVJa9+j3IeWzAKTZ/cRyLTH8Wv5JTD6PTMWwiBvg+eGoQZzTi/b34U/Aiv/DovIzm8uMTM2iWk1Vz7KUJK0NMnlKIiviJneCyUVCMFLwT2OPH1QBxq4=";
// byte[] naughtyBase64 = Coder.decryptBASE64(naughty);
// File file = new File("E:\\pri-key.txt");
// String priKey = IOUtils.toString(new FileInputStream(file));
// priKey = priKey.replace("-----BEGIN PRIVATE KEY-----" + IOUtils.LINE_SEPARATOR, "").replace("-----END PRIVATE KEY-----", "");
// String decryptedNaughty = new String(RSAUtil.decryptByPrivateKey(naughtyBase64, priKey));
// System.out.println(decryptedNaughty);
}
}
總結(jié)
以上是生活随笔為你收集整理的java 在线rsa解密_通用的Java RSA加密工具类,可在线验证通过的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java swing 树_Java Sw
- 下一篇: java swing 页面布局方式_ja