Java AES、RSA 加密解密

 

 

 顏色相同的代表一對公私鑰,本圖涉及到四套證書,淺綠淺粉塊的是自己的兩套證書,淺黃淺藍第三方證書。

RSA 加密

String data="xml格式或json格式的業務報文數據,對整個報文加解密";
String encryptKey=AESUtil.getRandomAESKey();
byte[] encryptBusinessDataByte=AESUtil.encrypt(data, encryptKey);
String encryptBusiness = new String(CBBase64.encode(encryptBusinessDataByte),"UTF-8");        

//公鑰文件路徑
String publicKeyFile="/usr/sercert/publicKeyCert.crt";
byte[] base64EncodedPublickey = FileUtil.read4file(publicKeyFile);   //或者:publicKeyString.getBytes("UTF-8");

X509Certificate signerCertificate = CryptUtil.generateX509Certificate(com.lsy.baselib.crypto.util.Base64.decode(base64EncodedPublickey));
PublicKey signpublicKey = signerCertificate.getPublicKey();
            
byte[] encryptKeyByte=CBRSA.encrypt((RSAKey) signpublicKey, encryptKey.getBytes(""UTF-8""));
String encryptKeyString=new String(CBBase64.encode(encryptKeyByte),"UTF-8");

//加密後的報文,放入encryptBody
encryptBusiness=encryptBusiness+"@@"+encryptKeyString;
View Code

RSA 解密

String decryptedBusinessData=null;
String[] encryptBusinessDataArr=encryptBusiness.split("@@");
String encryptKey=encryptBusinessDataArr[1];
try {
        //私鑰文件路徑
        String keyfile = “/usr/cert/privateKeyCert.key”;
        byte[] base64EncodedPrivatekey = FileUtil.read4file(keyfile);
        //私鑰密碼文件路徑
        String pwdfile = "/usr/cert/privateKeyCert.pwd";
        byte[] base64EncodedPrivatekeyPass = FileUtil.read4file(pwdfile);
        char[] keyPassword = new String(base64EncodedPrivatekeyPass, "UTF-8").toCharArray();
        RSAPrivateKey privateKey =  (RSAPrivateKey) CryptUtil.decryptPrivateKey(Base64.decode(base64EncodedPrivatekey), keyPassword);
        byte[] keyByte=CBRSA.decrypt(privateKey, CBBase64.decode(encryptKey.getBytes(“UTF-8”)));
        String encryptKeystr=new String(keyByte,"UTF-8");

        byte[] decryptedBusinessDataBytes = AESUtil.decrypt(CBBase64.decode(encryptBusinessDataArr[0].getBytes(“UTF-8”)), encryptKeystr);
        //得到解密後的明文字符串
        decryptedBusinessData = new String(decryptedBusinessDataBytes, "UTF-8");
} catch (Exception e) {
       logger.error(e.getStackTrace(), e);
}
View Code

CBRSA 算法工具類

import java.io.ByteArrayOutputStream;
import java.security.Key;
import java.security.interfaces.RSAKey;

import javax.crypto.Cipher;

public class CBRSA {
 public static byte[] encrypt(RSAKey key, byte[] data) throws Exception {
  try {
   Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding", "BC");
   cipher.init(1, (Key) key);
   int step = key.getModulus().bitLength() / 8;
   int n = data.length / step;
   if (n > 0) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    for (int i = 0; i < n; i++) {
     baos.write(cipher.doFinal(data, i * step, step));
    }
    if ((n = data.length % step) != 0) {
     baos.write(cipher.doFinal(data, data.length - n, n));
    }
    return baos.toByteArray();
   }
   return cipher.doFinal(data);
  } catch (Exception e) {
   throw new Exception("MPCM033");
  }
 }

 public static byte[] decrypt(RSAKey key, byte[] raw) throws Exception {
  try {
   Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding", "BC");
   cipher.init(2, (Key) key);
   int step = key.getModulus().bitLength() / 8;
   int n = raw.length / step;
   if (n > 0) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    for (int i = 0; i < n; i++) {
     baos.write(cipher.doFinal(raw, i * step, step));
    }
    return baos.toByteArray();
   }
   return cipher.doFinal(raw);
  } catch (Exception e) {
   throw new Exception("MPCM033");
  }
 }
}
View Code

AES 算法工具類

import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Random;

import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class AESUtil1 {
 private static int KeySizeAES128 = 16;

 private static Cipher getCipher(int mode, String key) {
  // mode =Cipher.DECRYPT_MODE or Cipher.ENCRYPT_MODE
  Cipher mCipher;
  byte[] keyPtr = new byte[KeySizeAES128];
  IvParameterSpec ivParam = new IvParameterSpec(keyPtr);
  byte[] passPtr = key.getBytes();
  try {
   mCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
   for (int i = 0; i < KeySizeAES128; i++) {
    if (i < passPtr.length)
     keyPtr[i] = passPtr[i];
    else
     keyPtr[i] = 0;
   }
   SecretKeySpec keySpec = new SecretKeySpec(keyPtr, "AES");
   mCipher.init(mode, keySpec, ivParam);
   return mCipher;
  } catch (InvalidKeyException e) {
   e.printStackTrace();
  } catch (NoSuchAlgorithmException e) {
   e.printStackTrace();
  } catch (NoSuchPaddingException e) {
   e.printStackTrace();
  } catch (InvalidAlgorithmParameterException e) {
   e.printStackTrace();
  }
  return null;
 }

 public static byte[] encrypt(String content, String password) {
  try {
   Cipher cipher = getCipher(Cipher.ENCRYPT_MODE, password);// 創建密碼器
   byte[] result = cipher.doFinal(content.getBytes("UTF-8"));// 加密
   return result;
  } catch (Exception e) {
   e.printStackTrace();
  }
  return null;
 }

 public static byte[] decrypt(byte[] content, String password) {
  try {
   Cipher cipher = getCipher(Cipher.DECRYPT_MODE, password);// 創建密碼器
   byte[] result = cipher.doFinal(content);
   return result; // 明文
  } catch (Exception e) {
   e.printStackTrace();
  }
  return null;
 }

 public static String getRandomAESKey() {
  int $aes_ken_len = 16;
  String aes_key_str = "";
  char[] e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
    .toCharArray();
  int index = 0;
  Random r = new Random();
  for (int i = 0; i < $aes_ken_len; i++) {
   index = r.nextInt(64);
   aes_key_str += e[index];
  }
  return aes_key_str;
 }
}
View Code
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章