AES對稱加密

来源:http://www.cnblogs.com/huangjuncong/archive/2017/12/15/8045187.html
-Advertisement-
Play Games

RSAUtil演算法請看下一篇 ...


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

/**
 * Created by 黃俊聰 on 2017/12/15.
 */
public class AESUtil {

    public static final String KEY_ALGORITHM = "AES";
    public static final String KEY_ALGORITHM_MODE = "AES/CBC/PKCS5Padding";

    /**
     *@Author 黃俊聰
     *@Date 2017/12/15 15:44
     *@Description AES對稱加密
     * @param data
     * @param key key需要16位
     */

    public static String encrypt(String data,String key){
        try {
            SecretKeySpec spec = new SecretKeySpec(key.getBytes("UTF-8"),KEY_ALGORITHM);
            Cipher cipher = Cipher.getInstance(KEY_ALGORITHM_MODE);
            cipher.init(Cipher.ENCRYPT_MODE , spec,new IvParameterSpec(new byte[cipher.getBlockSize()]));
            byte[] bs = cipher.doFinal(data.getBytes("UTF-8"));
            return Base64Util.encode(bs);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return  null;
    }


    /**
     *@Author 黃俊聰
     *@Date 2017/12/15 15:50
     *@Description
     * AES對稱解密 key需要16位
     * @param data
     * @param key
     * @return
     */
    public static String decrypt(String data, String key) {
        try {
            SecretKeySpec spec = new SecretKeySpec(key.getBytes("UTF-8"), KEY_ALGORITHM);
            Cipher cipher = Cipher.getInstance(KEY_ALGORITHM_MODE);
            cipher.init(Cipher.DECRYPT_MODE , spec , new IvParameterSpec(new byte[cipher.getBlockSize()]));
            byte[] originBytes = Base64Util.decode(data);
            byte[] result = cipher.doFinal(originBytes);
            return new String(result,"UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return  null;
    }


    public static void main(String[] args) throws Exception {
        /**AES加密數據**/
        String key = "123456789abcdfgt";
        String dataToEn = "黃俊聰";
        String enResult = encrypt(dataToEn, key);
        System.out.println(enResult);
//        String deResult = decrypt(enResult,key);
//        System.out.println(deResult);

        /**RSA 加密AES的密鑰**/
        byte[] enKey = RSAUtil.encryptByPublicKey(key.getBytes("UTF-8"), "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCbpmF28RgRDMduGSDhB2CD 0CiOFYytTGxYQuffq5RTgdoxxsE/3dgE+qQaDsTG1yzOwwCq7X3Xye7MZlcL 5SjNiLzh5tSEG7qyAVUfAgit1gYczWM+sTg+G7pnHa/omukvOfEeWceS8P35 Xt3ShqIeKfGxU4UIdiqKonBrQtYT/wIDAQAB");
        System.out.println(new String(enKey,"UTF-8"));
        String baseKey = Base64Util.encode(enKey);

        //服務端RSA解密AES的key
        byte[] de = Base64Util.decode(baseKey);
        byte[] deKeyResult = RSAUtil.decryptByPrivateKey(de);
        System.out.println(new String(deKeyResult,"UTF-8"));

        String deResult = decrypt(enResult,key);
        System.out.println(deResult);
    }

//Base64工具類
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class Base64Util {
private static final char[] legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
.toCharArray();



public static String encode(byte[] data) {
byte start = 0;
int len = data.length;
StringBuffer buf = new StringBuffer(data.length * 3 / 2);
int end = len - 3;
int i = start;
int n = 0;

int d;
while (i <= end) {
d = (data[i] & 255) << 16 | (data[i + 1] & 255) << 8 | data[i + 2] & 255;
buf.append(legalChars[d >> 18 & 63]);
buf.append(legalChars[d >> 12 & 63]);
buf.append(legalChars[d >> 6 & 63]);
buf.append(legalChars[d & 63]);
i += 3;
if (n++ >= 14) {
n = 0;
buf.append(" ");
}
}

if (i == start + len - 2) {
d = (data[i] & 255) << 16 | (data[i + 1] & 255) << 8;
buf.append(legalChars[d >> 18 & 63]);
buf.append(legalChars[d >> 12 & 63]);
buf.append(legalChars[d >> 6 & 63]);
buf.append("=");
} else if (i == start + len - 1) {
d = (data[i] & 255) << 16;
buf.append(legalChars[d >> 18 & 63]);
buf.append(legalChars[d >> 12 & 63]);
buf.append("==");
}

return buf.toString();
}

private static int decode(char c) {
if (c >= 65 && c <= 90) {
return c - 65;
} else if (c >= 97 && c <= 122) {
return c - 97 + 26;
} else if (c >= 48 && c <= 57) {
return c - 48 + 26 + 26;
} else {
switch (c) {
case '+':
return 62;
case '/':
return 63;
case '=':
return 0;
default:
throw new RuntimeException("unexpected code: " + c);
}
}
}

public static byte[] decode(String s) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();

try {
decode(s, bos);
} catch (IOException var5) {
throw new RuntimeException();
}

byte[] decodedBytes = bos.toByteArray();

try {
bos.close();
bos = null;
} catch (IOException var4) {
System.err.println("Error while decoding BASE64: " + var4.toString());
}

return decodedBytes;
}

private static void decode(String s, OutputStream os) throws IOException {
int i = 0;
int len = s.length();

while (true) {
while (i < len && s.charAt(i) <= 32) {
++i;
}

if (i == len) {
break;
}

int tri = (decode(s.charAt(i)) << 18) + (decode(s.charAt(i + 1)) << 12) + (decode(s.charAt(i + 2)) << 6)
+ decode(s.charAt(i + 3));
os.write(tri >> 16 & 255);
if (s.charAt(i + 2) == 61) {
break;
}

os.write(tri >> 8 & 255);
if (s.charAt(i + 3) == 61) {
break;
}

os.write(tri & 255);
i += 4;
}

}

}


RSAUtil演算法請看下一篇


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • accept表示打開的系統文件目錄;capture表示的是系統所捕獲的預設設備,camera:照相機;camcorder:攝像機;microphone:照相+攝像。 如果不加上capture,則只會顯示相應的,例如上述三種依次是:拍照或圖庫,錄像或圖庫,錄像或拍照或圖庫,加上capture之後不會調 ...
  • javascrpit面向對象之綜合 這一章是對前幾章的一個總結,通過一個案例來綜合認識javascript面向對象的基本用法 需求: 幾乎所有的web應用都需要保存數據一些到本地,那麼我們就來做一個數據儲存器吧。 詳細需求需求: 當本地儲存有數據時,取用本地的數據,沒有時使用預設的數據 判斷本地的數 ...
  • REST即表述性狀態傳遞(英文:Representational State Transfer,簡稱REST)是Roy Fielding博士在2000年他的博士論文中提出來的一種軟體架構風格 ...
  • HP-Socket是一套通用的高性能TCP/UDP/HTTP 通信框架,包含服務端組件、客戶端組件和Agent組件,廣泛適用於各種不同應用場景的TCP/UDP/HTTP通信系統,提供C/C++、C#、Delphi、E(易語言)、Java、Python等編程語言介面。HP-Socket對通信層完全封裝... ...
  • 集群架構 Hadoop的安裝其實就是HDFS和YARN集群的配置,從下麵的架構圖可以看出,HDFS的每一個DataNode都需要配置NameNode的位置。同理YARN中的每一個NodeManager都需要配置ResourceManager的位置。 NameNode和ResourceManager的 ...
  • 一、相關知識點回顧 1、什麼是反射? 可以用字元串的方式去訪問對象的屬性 2、反射有四種方法? 3、創建ModelForm的兩種方式 二、具體流程以及相關知識點 1、路由系統 讓url對應視圖,這時的視圖可以是一個元組,元組的裡面放三個參數,第一個是個列表,這兩種表示方式都是一樣的,用那種都行 na ...
  • Boss直聘'崗位'和'招聘信息'數據開源列表 OS:MacBook Pro , macOS High Sierra 10.13.2 Database:MongoDB v3.4.7 Mongo可視化工具:MongoBooster v4.1.3 數據都是用MongoBooster導出來的,如果用不了, ...
  • 代碼地址:https://github.com/vikde/demo-guava-cache 一、簡介 guava cache是google guava中的一個記憶體緩存模塊,用於將數據緩存到JVM記憶體中.實際項目開發中經常將一些比較公共或者常用的數據緩存起來方便快速訪問. 記憶體緩存最常見的就是基於H ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...