首先還是科普一下RSA
這里有一篇文章詳解了RSA加密算法的數(shù)學(xué)理論支持
放上個(gè)RAS算法的DEMO
public class RsaUtil {
? ? public static final String CHARSET = "UTF-8";
? ? public static final String RSA_ALGORITHM = "RSA";
? ? public static Map<String, String> createKeys(int keySize){
? ? ? ? //為RSA算法創(chuàng)建一個(gè)KeyPairGenerator對(duì)象
? ? ? ? KeyPairGenerator kpg;
? ? ? ? try{
? ? ? ? ? ? kpg = KeyPairGenerator.getInstance(RSA_ALGORITHM);
? ? ? ? }catch(NoSuchAlgorithmException e){
? ? ? ? ? ? throw new IllegalArgumentException("No such algorithm-->[" + RSA_ALGORITHM + "]");
? ? ? ? }
? ? ? ? //初始化KeyPairGenerator對(duì)象,密鑰長(zhǎng)度
? ? ? ? kpg.initialize(keySize);
? ? ? ? //生成密匙對(duì)
? ? ? ? KeyPair keyPair = kpg.generateKeyPair();
? ? ? ? //得到公鑰
? ? ? ? Key publicKey = keyPair.getPublic();
? ? ? ? String publicKeyStr = Base64.encodeBase64URLSafeString(publicKey.getEncoded());
? ? ? ? //得到私鑰
? ? ? ? Key privateKey = keyPair.getPrivate();
? ? ? ? String privateKeyStr = Base64.encodeBase64URLSafeString(privateKey.getEncoded());
? ? ? ? Map<String, String> keyPairMap = new HashMap<String, String>();
? ? ? ? keyPairMap.put("publicKey", publicKeyStr);
? ? ? ? keyPairMap.put("privateKey", privateKeyStr);
? ? ? ? return keyPairMap;
? ? }
? ? /**
? ? * 得到公鑰
? ? * @param publicKey 密鑰字符串(經(jīng)過base64編碼)
? ? * @throws Exception
? ? */
? ? public static RSAPublicKey getPublicKey(String publicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
? ? ? ? //通過X509編碼的Key指令獲得公鑰對(duì)象
? ? ? ? KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);
? ? ? ? X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKey));
? ? ? ? RSAPublicKey key = (RSAPublicKey) keyFactory.generatePublic(x509KeySpec);
? ? ? ? return key;
? ? }
? ? /**
? ? * 得到私鑰
? ? * @param privateKey 密鑰字符串(經(jīng)過base64編碼)
? ? * @throws Exception
? ? */
? ? public static RSAPrivateKey getPrivateKey(String privateKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
? ? ? ? //通過PKCS#8編碼的Key指令獲得私鑰對(duì)象
? ? ? ? KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);
? ? ? ? PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));
? ? ? ? RSAPrivateKey key = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8KeySpec);
? ? ? ? return key;
? ? }
? ? /**
? ? * 公鑰加密
? ? * @param data
? ? * @param publicKey
? ? * @return
? ? */
? ? public static String publicEncrypt(String data, RSAPublicKey publicKey){
? ? ? ? try{
? ? ? ? ? ? Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
? ? ? ? ? ? cipher.init(Cipher.ENCRYPT_MODE, publicKey);
? ? ? ? ? ? return Base64.encodeBase64URLSafeString(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, data.getBytes(CHARSET), publicKey.getModulus().bitLength()));
? ? ? ? }catch(Exception e){
? ? ? ? ? ? throw new RuntimeException("加密字符串[" + data + "]時(shí)遇到異常", e);
? ? ? ? }
? ? }
? ? /**
? ? * 私鑰解密
? ? * @param data
? ? * @param privateKey
? ? * @return
? ? */
? ? public static String privateDecrypt(String data, RSAPrivateKey privateKey){
? ? ? ? try{
? ? ? ? ? ? Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
? ? ? ? ? ? cipher.init(Cipher.DECRYPT_MODE, privateKey);
? ? ? ? ? ? return new String(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.decodeBase64(data), privateKey.getModulus().bitLength()), CHARSET);
? ? ? ? }catch(Exception e){
? ? ? ? ? ? throw new RuntimeException("解密字符串[" + data + "]時(shí)遇到異常", e);
? ? ? ? }
? ? }
? ? /**
? ? * 私鑰加密
? ? * @param data
? ? * @param privateKey
? ? * @return
? ? */
? ? public static String privateEncrypt(String data, RSAPrivateKey privateKey){
? ? ? ? try{
? ? ? ? ? ? Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
? ? ? ? ? ? cipher.init(Cipher.ENCRYPT_MODE, privateKey);
? ? ? ? ? ? return Base64.encodeBase64URLSafeString(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, data.getBytes(CHARSET), privateKey.getModulus().bitLength()));
? ? ? ? }catch(Exception e){
? ? ? ? ? ? throw new RuntimeException("加密字符串[" + data + "]時(shí)遇到異常", e);
? ? ? ? }
? ? }
? ? /**
? ? * 公鑰解密
? ? * @param data
? ? * @param publicKey
? ? * @return
? ? */
? ? public static String publicDecrypt(String data, RSAPublicKey publicKey){
? ? ? ? try{
? ? ? ? ? ? Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
? ? ? ? ? ? cipher.init(Cipher.DECRYPT_MODE, publicKey);
? ? ? ? ? ? return new String(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.decodeBase64(data), publicKey.getModulus().bitLength()), CHARSET);
? ? ? ? }catch(Exception e){
? ? ? ? ? ? throw new RuntimeException("解密字符串[" + data + "]時(shí)遇到異常", e);
? ? ? ? }
? ? }
? ? private static byte[] rsaSplitCodec(Cipher cipher, int opmode, byte[] datas, int keySize){
? ? ? ? int maxBlock = 0;
? ? ? ? if(opmode == Cipher.DECRYPT_MODE){
? ? ? ? ? ? maxBlock = keySize / 8;
? ? ? ? }else{
? ? ? ? ? ? maxBlock = keySize / 8 - 11;
? ? ? ? }
? ? ? ? ByteArrayOutputStream out = new ByteArrayOutputStream();
? ? ? ? int offSet = 0;
? ? ? ? byte[] buff;
? ? ? ? int i = 0;
? ? ? ? try{
? ? ? ? ? ? while(datas.length > offSet){
? ? ? ? ? ? ? ? if(datas.length-offSet > maxBlock){
? ? ? ? ? ? ? ? ? ? buff = cipher.doFinal(datas, offSet, maxBlock);
? ? ? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? buff = cipher.doFinal(datas, offSet, datas.length-offSet);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? out.write(buff, 0, buff.length);
? ? ? ? ? ? ? ? i++;
? ? ? ? ? ? ? ? offSet = i * maxBlock;
? ? ? ? ? ? }
? ? ? ? }catch(Exception e){
? ? ? ? ? ? throw new RuntimeException("加解密閥值為["+maxBlock+"]的數(shù)據(jù)時(shí)發(fā)生異常", e);
? ? ? ? }
? ? ? ? byte[] resultDatas = out.toByteArray();
? ? ? ? IOUtils.closeQuietly(out);
? ? ? ? return resultDatas;
? ? }
}