中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java怎么用RSA與AES進行加密解密

發布時間:2021-08-21 12:42:04 來源:億速云 閱讀:137 作者:chen 欄目:編程語言

本篇內容主要講解“java怎么用RSA與AES進行加密解密”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“java怎么用RSA與AES進行加密解密”吧!

首先了解下,什么是堆成加密,什么是非對稱加密?

  對稱加密:加密與解密的密鑰是相同的,加解密速度很快,比如AES

  非對稱加密:加密與解密的秘鑰是不同的,速度較慢,比如RSA

?先看代碼(先會用在研究)

  相關依賴:

<dependency>   <groupId>org.bouncycastle</groupId>   <artifactId>bcprov-jdk15on</artifactId>   <version>1.58</version> </dependency>

1,RSA工具類:

package cn.wangtao.utils;import org.bouncycastle.jce.provider.BouncyCastleProvider;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.crypto.Cipher;import java.io.ByteArrayOutputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectOutputStream;import java.security.*;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;/** * @ClassName RSAUtils * @Auth 桃子 * @Date 2019-6-25 15:15 * @Version 1.0 * @Description **/public class RSAUtils {  private static final String RSA = "RSA"; // 加密方式  private static final Logger logger= LoggerFactory.getLogger(RSAUtils.class);  //獲取密鑰  public static KeyPair getKey() throws Exception {    try {      KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA, new BouncyCastleProvider());      keyPairGenerator.initialize(2048); // 初始化密鑰長度      KeyPair keyPair = keyPairGenerator.generateKeyPair();// 生成密鑰對      return keyPair;    } catch (Exception e) {      logger.error("獲取RSA秘鑰對異常",e);      throw new Exception("獲取RSA秘鑰對異常",e);    }  }  //利用公鑰進行加密  public static String encryptStr(RSAPublicKey publicKey, String str) throws Exception {    try {      Cipher cipher = Cipher.getInstance(RSA, new BouncyCastleProvider());      cipher.init(Cipher.ENCRYPT_MODE, publicKey);      //加密      byte[] bytes = getBytes(str.getBytes(), cipher);      //2進行轉換成16進制      String result = CommonUtils.parseByte2HexStr(bytes);      return result;    } catch (Exception e) {      logger.error("使用RSA公鑰進行加密異常",e);      throw new Exception("使用RSA公鑰進行加密異常",e);    }  }  //利用私鑰進行解密  public static String decryptStr(RSAPrivateKey privateKey, String str) throws Exception {    try {      Cipher cipher = Cipher.getInstance(RSA, new BouncyCastleProvider());      cipher.init(Cipher.DECRYPT_MODE, privateKey); // 用密鑰初始化此Cipher對象      //16進制轉換成2進制      byte[] bytes = CommonUtils.parseHexStr2Byte(str);      //解密      byte[] bs = getBytes(bytes, cipher);      String content=new String(bs,"utf-8");      return content;    } catch (Exception e) {      logger.error("使用RSA私鑰進行解密異常",e);      throw new Exception("使用RSA私鑰進行解密異常",e);    }  }  //通過cipher獲取字節數組  public static byte[] getBytes(byte[] bytes,Cipher cipher) throws Exception {    int blockSize = cipher.getBlockSize(); // 返回塊的大小    int j = 0;    ByteArrayOutputStream baos = new ByteArrayOutputStream();    while (bytes.length - j * blockSize > 0) { // 將二進制數據分塊寫入ByteArrayOutputStream中      if(bytes.length-j*blockSize>blockSize){        baos.write(cipher.doFinal(bytes, j * blockSize, blockSize));      }else{        baos.write(cipher.doFinal(bytes, j * blockSize,bytes.length-j*blockSize));      }      j++;    }    baos.close();    byte[] byteArray = baos.toByteArray();    return byteArray;  }  //保存秘鑰對到文件  public void saveRSAKey(String fileName) throws Exception {    FileOutputStream fos=null;    ObjectOutputStream oos=null;    try {      KeyPair keyPair = getKey();      fos=new FileOutputStream(fileName);      oos=new ObjectOutputStream(fos); //對象序列號      oos.writeObject(keyPair);    } catch (Exception e) {      logger.error("RSA秘鑰對保存到文件異常[{}]",fileName,e);      throw new Exception("RSA秘鑰對保存到文件異常",e);    }finally {      if(oos!=null){        try {          oos.close();        } catch (IOException e1) {          e1.printStackTrace();        }      }      if(fos!=null){        try {          fos.close();        } catch (IOException e1) {          e1.printStackTrace();        }      }    }  }}

  2,CommonUtils通用工具類:

package cn.wangtao.utils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.IOException;import java.io.Reader;import java.io.Writer;/** * @ClassName CommonUtils * @Auth 桃子 * @Date 2019-6-27 12:51 * @Version 1.0 * @Description **/public class CommonUtils {  private static final Logger logger= LoggerFactory.getLogger(CommonUtils.class);  //編碼方式  public static final String CODE_TYPE = "UTF-8";  //字符補全  private static final String[] consult = new String[]{"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G"};  //關流  public static void closeReaderandWriter(Reader reader, Writer writer){    if(writer!=null){      try {        writer.close();      } catch (IOException e) {        logger.error("關閉輸出流失敗",e);      }    }    if(reader!=null){      try {        reader.close();      } catch (IOException e) {        logger.error("關閉輸出流失敗",e);      }    }  }  //將16進制轉換為二進制  public static byte[] parseHexStr2Byte(String hexStr) {    if (hexStr.length() < 1)      return null;    byte[] result = new byte[hexStr.length()/2];    for (int i = 0;i< hexStr.length()/2; i++) {      int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);      int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);      result[i] = (byte) (high * 16 + low);    }    return result;  }  //將二進制轉換成16進制  public static String parseByte2HexStr(byte buf[]) {    StringBuffer sb = new StringBuffer();    for (int i = 0; i < buf.length; i++) {      String hex = Integer.toHexString(buf[i] & 0xFF);      if (hex.length() == 1) {        hex = '0' + hex;      }      sb.append(hex.toUpperCase());    }    return sb.toString();  }  //補全字符  public static String completionCodeFor16Bytes(String str) throws Exception {    try{      int num = str.getBytes(CODE_TYPE).length;      int index = num%16;      //進行加密內容補全操作, 加密內容應該為 16字節的倍數, 當不足16*n字節是進行補全, 差一位時 補全16+1位      //補全字符 以 $ 開始,$后一位代表$后補全字符位數,之后全部以0進行補全;      if(index != 0){        StringBuffer sbBuffer = new StringBuffer(str);        if(16-index == 1){          sbBuffer.append("$" + consult[16-1] + addStr(16-1-1));        }else{          sbBuffer.append("$" + consult[16-index-1] + addStr(16-index-1-1));        }        str = sbBuffer.toString();      }      return str;    }catch (Exception e){      logger.error("使用AES加密前補全字符異常",e);      throw new Exception("使用AES加密前補全字符異常",e);    }  }  //追加字符  public static String addStr(int num){    StringBuffer sbBuffer = new StringBuffer("");    for (int i = 0; i < num; i++) {      sbBuffer.append("0");    }    return sbBuffer.toString();  }  //還原字符(進行字符判斷)  public static String resumeCodeOf16Bytes(String str) throws Exception{    int indexOf = str.lastIndexOf("$");    if(indexOf == -1){      return str;    }    String trim = str.substring(indexOf+1,indexOf+2).trim();    int num = 0;    for (int i = 0; i < consult.length; i++) {      if(trim.equals(consult[i])){        num = i;      }    }    if(num == 0){      return str;    }    return str.substring(0,indexOf).trim();  }}

  3,AESUtils通用工具類:

package cn.wangtao.utils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.crypto.Cipher;import javax.crypto.spec.SecretKeySpec;import java.io.*;import java.security.interfaces.RSAPrivateKey;import java.util.Map;/** * @ClassName AESUtils * @Auth 桃子 * @Date 2019-6-27 12:05 * @Version 1.0 * @Description **/public class AESUtils {  private static final Logger logger= LoggerFactory.getLogger(AESUtils.class);  //填充類型  public static final String AES_TYPE = "AES/ECB/PKCS5Padding";  private static final String AES = "AES"; // 加密方式  public static final String DES_TYPE = "DES/ECB/PKCS5Padding";  private static final String DES = "DES"; // 加密方式  private final String defaultDesKey="11112222";//8位  //對字符串加密  public static String encryptStr(String content,String aesKey) throws Exception {    try {      SecretKeySpec key = new SecretKeySpec(aesKey.getBytes(),AES );      Cipher cipher = Cipher.getInstance(AES_TYPE);      cipher.init(Cipher.ENCRYPT_MODE, key);      //字符補全      String content16Str = CommonUtils.completionCodeFor16Bytes(content);      byte[] encryptedData = cipher.doFinal(content16Str.getBytes(CommonUtils.CODE_TYPE));      //2進制轉換成16進制      String hexStr = CommonUtils.parseByte2HexStr(encryptedData);      return hexStr;    } catch (Exception e) {      logger.error("使用AES對字符串加密異常",e);      throw new Exception("使用AES對字符串加密異常",e);    }  }  //對字符串解密  public static String decryptStr(String content,String aesKey) throws Exception {    try {      //16進制轉換成2進制      byte[] bytes = CommonUtils.parseHexStr2Byte(content);      SecretKeySpec key = new SecretKeySpec(          aesKey.getBytes(), AES);      Cipher cipher = Cipher.getInstance(AES_TYPE);      cipher.init(Cipher.DECRYPT_MODE, key);      byte[] decryptedData = cipher.doFinal(bytes);      String result=new String(decryptedData, CommonUtils.CODE_TYPE);      //還原字符      String orgResult = CommonUtils.resumeCodeOf16Bytes(result);      return orgResult;    } catch (Exception e) {      logger.error("使用AES對字符串解密異常",e);      throw new Exception("使用AES對字符串解密異常",e);    }  }  //對文件加密  public static File encryptFile(File orgFile, File encryptFile, Map<String,Object> context) throws Exception {    logger.info("使用AES對文件加密開始,源文件地址[{}]加密后文件地址[{}]",orgFile.getPath(),encryptFile.getPath());    BufferedReader br=null;    BufferedWriter bw=null;    try{      //獲取AESKEY ,如果沒有為默認      String aesKey = (String) context.get(Dirt.AES_KEY);      br=new BufferedReader(new FileReader(orgFile));      bw=(BufferedWriter)context.get(Dirt.BUFFEREDWRITER);      if(null==bw){        bw=new BufferedWriter(new FileWriter(encryptFile));      }      String len=null;      while (null!=(len=br.readLine())){        String encrypt= encryptStr(len,aesKey);        bw.write(encrypt);        bw.newLine();        bw.flush();      }      logger.info("使用AES對文件加密結束,源文件地址[{}]加密后文件地址[{}]",orgFile.getPath(),encryptFile.getPath());      return encryptFile;    }catch (Exception e){      logger.error("使用AES對文件加密異常,源文件地址[{}]加密后文件地址[{}]",orgFile.getPath(),encryptFile.getPath(),e);      throw new Exception("使用AES對文件加密異常",e);    }finally {      CommonUtils.closeReaderandWriter(br,bw);    }  }  //對文本解密,返回解密文件后的文件  public static File decryptFile(File decryptfile, File encryptFile,Map<String,Object> context) throws Exception {    logger.info("使用AES對文件解密開始,源加密文件地址[{}]解密后文件地址[{}]",encryptFile.getPath(),decryptfile.getPath());    BufferedReader br=null;    BufferedWriter bw=null;    try{      if(decryptfile.exists()){        decryptfile.delete();      }      //邊讀邊加密邊寫      br=new BufferedReader(new FileReader(encryptFile));      bw=new BufferedWriter(new FileWriter(decryptfile));      String len=null;      String aesKey=null;      //判斷是否加密      RSAPrivateKey privateKey= (RSAPrivateKey) context.get(Dirt.RSAPRIVATEKEY);      if(null!=privateKey){        StringBuffer sb=new StringBuffer();        while ((len=br.readLine())!=null){          sb.append(len);          if(len.equals("\n")||len.equals("")||len.equals("\r\n")||len.equals("\r")){            aesKey=RSAUtils.decryptStr(privateKey,sb.toString());            break;          }        }      }      if(null==aesKey){        aesKey=(String) context.get(Dirt.AES_KEY);      }      logger.info("aesKey[{}]",aesKey);      if(aesKey!=null){        while ((len=br.readLine())!=null){          String decrypt= decryptStr(len,aesKey);          bw.write(decrypt);          bw.flush();          bw.newLine();        }      }      logger.info("使用AES對文件解密結束,源加密文件地址[{}]解密后文件地址[{}]",encryptFile.getPath(),decryptfile.getPath());      return decryptfile;    }catch (Exception e){      logger.error("使用AES對文件解密異常,源加密文件地址[{}]解密后文件地址[{}]",encryptFile.getPath(),decryptfile.getPath(),e);      throw new Exception("使用AES對文件解密異常",e);    }finally {      CommonUtils.closeReaderandWriter(br,bw);    }  }}

  4,Dirt常量

package cn.wangtao.utils;import java.security.interfaces.RSAPublicKey;/** * @ClassName Dirt * @Auth 桃子 * @Date 2019-6-27 14:20 * @Version 1.0 * @Description **/public class Dirt {  public static final String UPLOADFILEURL="uploadFileUrl";  public static final String AES_KEY="aesKey";  public static final String RSAPUBLICKEY="rsaPublicKey";  public static final String RSAPRIVATEKEY="rsaPrivateKey";  public final static String RETURNCODE="returnCode";  public final static String RETURNMSG="returnMsg";  public final static String FILENAME="fileName";  public final static String ORGFILENAME="orgFileName";  public final static String ENCRYPTFILE="encryptFile";  public static final String BUFFEREDWRITER="bufferedWriter"; //是為了在原始文件中進行補充加密  //返回碼  public final static String SUCCESSCODE="000000";  public final static String FAILEDCODE="999999";  //加密文件所放的目錄  public final static String BASELOCALDIR="XXX"; //基本目錄路徑  public final static String ENCRYPTLOCALDIR="encrypt"; //加密文件目錄

到此,相信大家對“java怎么用RSA與AES進行加密解密”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

江安县| 上高县| 常德市| 龙胜| 广安市| 商水县| 邢台县| 彝良县| 如皋市| 老河口市| 青河县| 保德县| 贺兰县| 南宫市| 抚州市| 柯坪县| 平陆县| 方正县| 蛟河市| 龙口市| 进贤县| 漠河县| 崇明县| 木兰县| 锦州市| 承德县| 三原县| 荔浦县| 芦山县| 图们市| 绥中县| 大新县| 乾安县| 措美县| 凤阳县| 景宁| 米易县| 溧阳市| 比如县| 高阳县| 桐柏县|