1. 程式人生 > >Android安全加密:對稱加密

Android安全加密:對稱加密

Android安全加密專題文章索引

一、凱撒密碼

1. 概述

凱撒密碼作為一種最為古老的對稱加密體制,在古羅馬的時候都已經很流行,他的基本思想是:通過把字母移動一定的位數來實現加密和解密。明文中的所有字母都在字母表上向後(或向前)按照一個固定數目進行偏移後被替換成密文。例如,當偏移量是3 的時候,所有的字母A 將被替換成D,B 變成E,由此可見,位數就是凱撒密碼加密和解密的金鑰。

例如:字串”ABC”的每個字元都右移3 位則變成”DEF”,解密的時候”DEF”的每個字元左移3 位即能還原,如下圖所示:

這裡寫圖片描述

2. 準備知識

 //字元轉換成ASCII 碼數值
 char
charA = 'a'; int intA = charA; //char 強轉為int 即得到對應的ASCII 碼值,’a’的值為97 //ASCII 碼值轉成char int intA = 97;//97 對應的ASCII 碼’a’ char charA = (char) intA; //int 值強轉為char 即得到對應的ASCII 字元,即'a'

這裡寫圖片描述

3. 凱撒密碼的簡單程式碼實現

    /**
     * 加密
     * @param input 資料來源(需要加密的資料)
     * @param key 祕鑰,即偏移量
     * @return 返回加密後的資料
     */
public static String encrypt(String input, int key) { //得到字串裡的每一個字元 char[] array = input.toCharArray(); for (int i = 0; i < array.length; ++i) { //字元轉換成ASCII 碼值 int ascii = array[i]; //字元偏移,例如a->b ascii = ascii + key; //ASCII 碼值轉換為char
char newChar = (char) ascii; //替換原有字元 array[i] = newChar; //以上4 行程式碼可以簡寫為一行 //array[i] = (char) (array[i] + key); } //字元陣列轉換成String return new String(array); } /** * 解密 * @param input 資料來源(被加密後的資料) * @param key 祕鑰,即偏移量 * @return 返回解密後的資料 */ public static String decrypt(String input, int key) { //得到字串裡的每一個字元 char[] array = input.toCharArray(); for (int i = 0; i < array.length; ++i) { //字元轉換成ASCII 碼值 int ascii = array[i]; //恢復字元偏移,例如b->a ascii = ascii - key; //ASCII 碼值轉換為char char newChar = (char) ascii; //替換原有字元 array[i] = newChar; //以上4 行程式碼可以簡寫為一行 //array[i] = (char) (array[i] - key); } //字元陣列轉換成String return new String(array); }

程式碼輸出結果:
這裡寫圖片描述

4. 破解凱撒密碼:頻率分析法

凱撒密碼加密強度太低,只需要用頻度分析法即可破解。
在任何一種書面語言中,不同的字母或字母組合出現的頻率各不相同。而且,對於以這種語言書寫的任意一段文字,都具有大致相同的特徵字母分佈。比如,在英語中,字母E 出現的頻率很高,而X 則出現得較少。

英語文字中典型的字母分佈情況如下圖所示:
這裡寫圖片描述

5. 破解流程

  • 統計密文裡出現次數最多的字元,例如出現次數最多的字元是是’h’。
  • 計算字元’h’到’e’的偏移量,值為3,則表示原文偏移了3 個位置。
  • 將密文所有字元恢復偏移3 個位置。

注意點:統計密文裡出現次數最多的字元時,需多統計幾個備選,因為最多的可能是空格或者其他字元,例如下圖出現次數最多的字元’#’是空格加密後的字元,’h’才是’e’偏移後的值。
這裡寫圖片描述

解密時要多幾次嘗試,因為不一定出現次數最多的字元就是我們想要的目標字元,如下圖,第二次解密的結果才是正確的。

/**
 * 頻率分析法破解凱撒密碼
 */
public class FrequencyAnalysis {
    //英文裡出現次數最多的字元
    private static final char MAGIC_CHAR = 'e';
    //破解生成的最大檔案數
    private static final int DE_MAX_FILE = 4;

    public static void main(String[] args) throws Exception {
        //測試1,統計字元個數
        //printCharCount("article1_en.txt");

        //加密檔案
        //int key = 3;
        //encryptFile("article1.txt", "article1_en.txt", key);

        //讀取加密後的檔案
        String artile = file2String("article1_en.txt");
        //解密(會生成多個備選檔案)
        decryptCaesarCode(artile, "article1_de.txt");
    }

    public static void printCharCount(String path) throws IOException{
        String data = file2String(path);
        List<Entry<Character, Integer>> mapList = getMaxCountChar(data);
        for (Entry<Character, Integer> entry : mapList) {
            //輸出前幾位的統計資訊
            System.out.println("字元'" + entry.getKey() + "'出現" + entry.getValue() + "次");
        }
    }

    public static void encryptFile(String srcFile, String destFile, int key) throws IOException {
        String artile = file2String(srcFile);
        //加密檔案
        String encryptData = MyEncrypt.encrypt(artile, key);
        //儲存加密後的檔案
        string2File(encryptData, destFile);
    }

    /**
     * 破解凱撒密碼
     * @param input 資料來源
     * @return 返回解密後的資料
     */
    public static void decryptCaesarCode(String input, String destPath) {
        int deCount = 0;//當前解密生成的備選檔案數
        //獲取出現頻率最高的字元資訊(出現次數越多越靠前)
        List<Entry<Character, Integer>> mapList = getMaxCountChar(input);
        for (Entry<Character, Integer> entry : mapList) {
            //限制解密檔案備選數
            if (deCount >= DE_MAX_FILE) {
                break;
            }

            //輸出前幾位的統計資訊
            System.out.println("字元'" + entry.getKey() + "'出現" + entry.getValue() + "次");

            ++deCount;
            //出現次數最高的字元跟MAGIC_CHAR的偏移量即為祕鑰
            int key = entry.getKey() - MAGIC_CHAR;
            System.out.println("猜測key = " + key + ", 解密生成第" + deCount + "個備選檔案" + "\n");
            String decrypt = MyEncrypt.decrypt(input, key);

            String fileName = "de_" + deCount + destPath;
            string2File(decrypt, fileName);
        }
    }

    //統計String裡出現最多的字元
    public static List<Entry<Character, Integer>> getMaxCountChar(String data) {
        Map<Character, Integer> map = new HashMap<Character, Integer>();
        char[] array = data.toCharArray();
        for (char c : array) {
            if(!map.containsKey(c)) {
                map.put(c, 1);
            }else{
                Integer count = map.get(c);
                map.put(c, count + 1);
            }
        }

        //輸出統計資訊
        /*for (Entry<Character, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + "出現" + entry.getValue() +  "次");
        }*/

        //獲取獲取最大值
        int maxCount = 0;
        for (Entry<Character, Integer> entry : map.entrySet()) {
            //不統計空格
            if (/*entry.getKey() != ' ' && */entry.getValue() > maxCount) { 
                maxCount = entry.getValue();
            }
        }

        //map轉換成list便於排序
        List<Entry<Character, Integer>> mapList = new ArrayList<Map.Entry<Character,Integer>>(map.entrySet());
        //根據字元出現次數排序
        Collections.sort(mapList, new Comparator<Entry<Character, Integer>>(){
            @Override
            public int compare(Entry<Character, Integer> o1,
                    Entry<Character, Integer> o2) {
                return o2.getValue().compareTo(o1.getValue());
            }
        });
        return mapList;
    }

    public static String file2String(String path) throws IOException {
        FileReader reader = new FileReader(new File(path));
        char[] buffer = new char[1024];
        int len = -1;
        StringBuffer sb = new StringBuffer();
        while ((len = reader.read(buffer)) != -1) {
            sb.append(buffer, 0, len);
        }
        return sb.toString();
    }

    public static void string2File(String data, String path){
        FileWriter writer = null;
        try {
            writer = new FileWriter(new File(path));
            writer.write(data);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

這裡寫圖片描述

二、對稱加密

1、概述

加密和解密都使用同一把祕鑰,這種加密方法稱為對稱加密,也稱為單金鑰加密。
簡單理解為:加密解密都是同一把鑰匙。
凱撒密碼就屬於對稱加密,他的字元偏移量即為祕鑰。

2、對稱加密常用演算法

AES、DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK 等。

DES
全稱為Data Encryption Standard,即資料加密標準,是一種使用金鑰加密的塊演算法,1976 年被美國聯邦政府的國家標準局確定為聯邦資料處理標準(FIPS),隨後在國際上廣泛流傳開來。

3DES
也叫Triple DES,是三重資料加密演算法(TDEA,Triple Data Encryption Algorithm)塊密碼的通稱。
它相當於是對每個資料塊應用三次DES 加密演算法。由於計算機運算能力的增強,原版DES 密碼的金鑰長度變得容易被暴力破解;3DES 即是設計用來提供一種相對簡單的方法,即通過增加DES 的金鑰長度來避免類似的攻擊,而不是設計一種全新的塊密碼演算法。

AES
高階加密標準(英語:Advanced Encryption Standard,縮寫:AES),在密碼學中又稱Rijndael 加密法,是美國聯邦政府採用的一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。經過五年的甄選流程,高階加密標準由美國國家標準與技術研究院(NIST)於2001 年11 月26 日釋出於FIPS PUB 197,並在2002 年5 月26 日成為有效的標準。2006 年,高階加密標準已然成為對稱金鑰加密中最流行的演算法之一。

3、DES 演算法簡介

DES 加密原理(對位元位進行操作,交換位置,異或等等,無需詳細瞭解)

準備知識

Bit 是計算機最小的傳輸單位。以0 或1 來表示位元位的值
例如數字3 對應的二進位制資料為:00000011

程式碼示例

 int i = 97;
 String bit = Integer.toBinaryString(i);
 //輸出:97 對應的二進位制資料為: 1100001
 System.out.println(i + "對應的二進位制資料為: " + bit);

Byte 與Bit 區別

資料儲存是以“位元組”(Byte)為單位,資料傳輸是大多是以“位”(bit,又名“位元”)為單位,一個位就代表一個0 或1(即二進位制),每8 個位(bit,簡寫為b)組成一個位元組(Byte,簡寫為B),是最小一級的資訊單位。

Byte 的取值範圍:

//byte 的取值範圍:-128 到127
System.out.println(Byte.MIN_VALUE + "到" + Byte.MAX_VALUE);

即10000000 到01111111 之間,一個位元組佔8 個位元位

二進位制轉十進位制圖示:
這裡寫圖片描述

任何字串都可以轉換為位元組陣列

String data = "1234abcd";
byte[] bytes = data.getBytes();//內容為:49 50 51 52 97 98 99 100

上面資料49 50 51 52 97 98 99 100 對應的二進位制資料(即位元位為):
00110001
00110010
00110011
00110100
01100001
01100010
01100011
01100100

將他們間距調大一點,可看做一個矩陣:
這裡寫圖片描述

之後可對他們進行各種操作,例如交換位置、分割、異或運算等,常見的加密方式就是這樣操作位元位的,例如下圖的IP 置換以及S-Box 操作都是常見加密的一些方式:

IP 置換:
IP 置換:

S-BOX 置換:
這裡寫圖片描述

DES 加密過程圖解(流程很複雜,只需要知道內部是操作位元位即可):

這裡寫圖片描述

對稱加密應用場景

  • 本地資料加密(例如加密android 裡SharedPreferences 裡面的某些敏感資料)
  • 網路傳輸:登入介面post 請求引數加密{username=lisi,pwd=oJYa4i9VASRoxVLh75wPCg==}
  • 加密使用者登入結果資訊並序列化到本地磁碟(將user 物件序列化到本地磁碟,下次登入時反序列化到記憶體裡)
  • 網頁互動資料加密(即後面學到的Https)

DES 演算法程式碼實現

 //1,得到cipher 物件(可翻譯為密碼器或密碼系統)
 Cipher cipher = Cipher.getInstance("DES");
 //2,建立祕鑰
 SecretKey key = KeyGenerator.getInstance("DES").generateKey();
 //3,設定操作模式(加密/解密)
 cipher.init(Cipher.ENCRYPT_MODE, key);
 //4,執行操作
 byte[] result = cipher.doFinal("黑馬".getBytes());

AES 演算法程式碼實現

用法同上,只需把”DES”引數換成”AES”即可。

使用Base64 編碼加密後的結果

byte[] result = cipher.doFinal("黑馬".getBytes());
System.out.println(new String(result));

輸出結果:

這裡寫圖片描述

加密後的結果是位元組陣列,這些被加密後的位元組在碼錶(例如UTF-8 碼錶)上找不到對應字元,會出現亂碼,當亂碼字串再次轉換為位元組陣列時,長度會變化,導致解密失敗,所以轉換後的資料是不安全的。

使用Base64 對位元組陣列進行編碼,任何位元組都能對映成對應的Base64 字元,之後能恢復到位元組陣列,利於加密後資料的保存於傳輸,所以轉換是安全的。同樣,位元組陣列轉換成16 進位制字串也是安全的。

密文轉換成Base64 編碼後的輸出結果:
這裡寫圖片描述

密文轉換成16 進位制編碼後的輸出結果:
這裡寫圖片描述

Java 裡沒有直接提供Base64 以及位元組陣列轉16 進位制的Api,開發中一般是自己手寫或直接使用第三方提供的成熟穩定的工具類(例如apache 的commons-codec)。

Base64 字元對映表
Base64 字元對映表

對稱加密的具體應用方式

1、生成祕鑰並儲存到硬碟上,以後讀取該祕鑰進行加密解密操作,實際開發中用得比較少

//生成隨機祕鑰
SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey();
//序列化祕鑰到磁碟上
FileOutputStream fos = new FileOutputStream(new File("heima.key"));

ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(secretKey);

//從磁盤裡讀取祕鑰
FileInputStream fis = new FileInputStream(new File("heima.key"));
ObjectInputStream ois = new ObjectInputStream(fis);
Key key = (Key) ois.readObject();

2、使用自定義祕鑰(祕鑰寫在程式碼裡)

//建立金鑰寫法1
KeySpec keySpec = new DESKeySpec(key.getBytes());
SecretKey secretKey = SecretKeyFactory.getInstance(ALGORITHM).
generateSecret(keySpec);

//建立金鑰寫法2
//SecretKey secretKey = new SecretKeySpec(key.getBytes(), KEY_ALGORITHM);

Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, secretKey);
//得到key 後,後續程式碼就是Cipher 的寫法,此處省略...

注意事項

把祕鑰寫在程式碼裡有一定風險,當別人反編譯程式碼的時候,可能會看到祕鑰,android 開發裡建議用JNI 把祕鑰值寫到C 程式碼裡,甚至拆分成幾份,最後再組合成真正的祕鑰

演算法/工作模式/填充模式

初始化cipher 物件時,引數可以直接傳演算法名:例如:

Cipher c = Cipher.getInstance("DES");

也可以指定更詳細的引數,格式:”algorithm/mode/padding” ,即”演算法/工作模式/填充模式”

Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");

密碼塊工作模式

塊密碼工作模式(Block cipher mode of operation),是對於按塊處理密碼的加密方式的一種擴充,不僅僅適用於AES,包括DES, RSA 等加密方法同樣適用。

這裡寫圖片描述

填充模式

填充(Padding),是對需要按塊處理的資料,當資料長度不符合塊處理需求時,按照一定方法填充滿塊長的一種規則。

這裡寫圖片描述

具體程式碼:

//祕鑰演算法
private static final String KEY_ALGORITHM = "DES";
//加密演算法:algorithm/mode/padding 演算法/工作模式/填充模式
private static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5Padding";
//祕鑰
private static final String KEY = "12345678";//DES 祕鑰長度必須是8 位或以上
//private static final String KEY = "1234567890123456";//AES 祕鑰長度必須是16 位

//初始化祕鑰
SecretKey secretKey = new SecretKeySpec(KEY.getBytes(), KEY_ALGORITHM);
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);

//加密
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] result = cipher.doFinal(input.getBytes());

注意:AES、DES 在CBC 操作模式下需要iv 引數

//AES、DES 在CBC 操作模式下需要iv 引數
IvParameterSpec iv = new IvParameterSpec(key.getBytes());

//加密
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);

三、總結

DES 安全度在現代已經不夠高,後來又出現的3DES 演算法強度提高了很多,但是其執行效率低下,AES演算法加密強度大,執行效率高,使用簡單,實際開發中建議選擇AES 演算法。實際android 開發中可以用對稱加密(例如選擇AES 演算法)來解決很多問題,例如:

  • 做一個管理密碼的app,我們在不同的網站裡使用不同賬號密碼,很難記住,想做個app 統一管理,但是賬號密碼儲存在手機裡,一旦丟失了容易造成安全隱患,所以需要一種加密演算法,將賬號密碼資訊加密起來保管,這時候如果使用對稱加密演算法,將資料進行加密,祕鑰我們自己記在心裡,只需要記住一個密碼。需要的時候可以還原資訊。
  • android 裡需要把一些敏感資料儲存到SharedPrefrence 裡的時候,也可以使用對稱加密,這樣可以在需要的時候還原。
  • 請求網路介面的時候,我們需要上傳一些敏感資料,同樣也可以使用對稱加密,服務端使用同樣的演算法就可以解密。或者服務端需要給客戶端傳遞資料,同樣也可以先加密,然後客戶端使用同樣演算法解密。

Android視訊教程

相關推薦

Android安全加密對稱加密

Android安全加密專題文章索引 一、凱撒密碼 1. 概述 凱撒密碼作為一種最為古老的對稱加密體制,在古羅馬的時候都已經很流行,他的基本思想是:通過把字母移動一定的位數來實現加密和解密。明文中的所有字母都在字母表上向後(或向前)按照一個固定數

程式設計師之網路安全系列(三)資料加密對稱加密演算法

系列目錄: 前文回顧 假如,明明和麗麗相互不認識,明明想給麗麗寫一封情書,讓隔壁老王送去 如何保證隔壁老王不能看到情書內容?(保密性) 如何保證隔壁老王不修改情書的內容?(完整性) 如何保證隔壁老王不冒充明明?(身份認證) 如何保證明明不能否認情書是自己寫的?(來源的不可否認) 上一節,我們使用了Ha

Android安全/應用逆向--34--加密演算法基礎

7-11、加密演算法基礎 1、加密演算法概念 一種對映函式,即:明文+金鑰→密文,密文+金鑰→明文。 具體的對映形式可能會有所變化,例如單向加密演算法,無金鑰的加密演算法等。 2、如何實現加密 加密實現的機制是“混亂和擴散”,即明文或金鑰中每一個二進位制位的改變

[C#] 簡單的 Helper 封裝 -- SecurityHelper 安全助手封裝加密算法(MD5、SHA、HMAC、DES、RSA)

cat equals des input ignore uri put class style #region using System; using System.IO; using System.Security.Cryptography; using

網路安全之 (非對稱加密、數字摘要、數字簽名、數字證書、SSL、HTTPS及其他)

對於一般的開發人員來說,很少需要對安全領域內的基礎技術進行深入的研究,但是鑑於日常系統開發中遇到的各種安全相關的問題,熟悉和了解這些安全技術的基本原理和使用場景還是非常必要的。本文將對非對稱加密、數字摘要、數字簽名、數字證書、SSL、HTTPS等這些安全領域內的技術進行一

資料傳輸加密——非對稱加密演算法RSA+對稱演算法AES(適用於java,android和Web)

本篇文章已授權微信公眾號 guolin_blog (郭霖)獨家釋出 資料傳輸加密   在開發應用過程中,客戶端與服務端經常需要進行資料傳輸,涉及到重要隱私資訊時,開發者自然會想到對其進行加密,即使傳輸過程中被“有心人”擷取,也不會將資訊洩露。對於加密

網路安全知識之對稱加密與base64

網路安全知識之對稱加密 1:DES加密 講解DES加密之前我們先來了解一下什麼是對稱加密. 對稱加密:採用單鑰密碼系統的加密方法,同一個金鑰可以同時用作資訊的加密和解密,這種加密方法稱為對稱加密,也稱為單金鑰加密。 對稱加密的使用率比較高,相對於非對

四、Android安全機制之資料加密

    MD5,全名Message Digest Algorithm 5 ,中文名為訊息摘要演算法第五版,一種不可逆的hash演算法,常用於只需加密無需解密的資料上,比如使用者密碼,也常用來保證資料的完整性,因為資料被篡改後,其加密後的MD5也會隨之改變(不考慮碰撞的情況下),對比篡改前的MD5可確定資料是

資訊保安的基礎對稱加密、非對稱加密、摘要演算法

加密分為兩大類:對稱加密、非對稱加密,兩類加密演算法各有優點,在不同的場景使用不同的演算法。 對稱加密 加密方將原始資料和加密金鑰一起經過特殊加密演算法處理後,生成密文結果,解密方使用相同的祕鑰及相同加密演算法的逆演算法對密文結果進行解密,公式如下:

信息安全-加密RAS 加密

ras rsa .com 方法 ima hit 加密 十進制 col ylbtech-信息安全-加密:RAS 加密 1.返回頂部 1、 RSA 是不對稱的加密(加密密鑰和解密密鑰不同 其中 一個為公鑰,一

如何使用gpg工具實現公鑰加密對稱加密和非對稱加密)?

gpg工具 對稱加密 公鑰加密 非對稱加密 使用gpg實現公鑰加密【對稱加密】1、 對稱加密file文件gpg -c filels file.gpg------------------------對稱加密過程------------------------輸入口令,兩次,例如centos再查看

[svc]對稱加密/非對稱加密細枝末節-如何做到數據傳輸的authentication/data integrity/confidentiality(私密)

ecc 數據完整性 安全 post 數字簽名 .html 模式 數字證書 大量 對稱/非對稱/混合加密的冷知識 數據在互聯網上傳輸,要考慮安全性. 講到安全,要從三方面考慮: 1、authentication 每一個IP包的認證,確保合法源的數據 2、data integ

什麼是非對稱加密?非對稱加密概念

什麼是非對稱加密 對稱加密演算法在加密和解密時使用的是同一個祕鑰;而非對稱加密演算法需要兩個金鑰來進行加密和解密,這兩個祕鑰是公開金鑰(public key,簡稱公鑰)和私有金鑰(private key,簡稱私鑰)   與對稱加密演算法不同,非對稱加密演算法需要兩個金鑰:

Https的加密過程 / 對稱加密和非對稱加密

Https和Http區別 WEB服務存在http和https兩種通訊方式,http預設採用80作為通訊埠,對於傳輸採用不加密的方式,https預設採用443,對於傳輸的資料進行加密傳輸 目前主流的網站基本上開始預設採用HTTPS作為通訊方式,一切的考慮都基於對安全的要求,那麼如何對自己的網站

加密演算法-對稱加密,支援解密;

前言 目前市面上的加密演算法,有很多,什麼AES,什麼MD5,等, 有的能反解密,有的不能反解密; 加密的目的是為了增加盜取資料的難度。比如密碼; 增加截包資料分析難度;不在是明文傳送; 思路 為了前端(u3D,C#程式碼)和後端java程式碼,統一版本保持高一致性;保證不出錯,加密過程便於自己控制; 我是一

JAVA實現RSA加密,非對稱加密演算法

RSA.java package org.icesnow.jeasywx.util.security; import java.security.Key; import java.security.KeyFactory; import java.security.KeyPair;

對稱加密對稱加密 不可逆加密演算法

根據金鑰型別不同可以將現代密碼技術分為兩類:對稱加密演算法(私鑰密碼體系)和非對稱加密演算法(公鑰密碼體系)。 1 對稱加密演算法中,資料加密和解密採用的都是同一個金鑰,因而其安全性依賴於所持有金鑰的安全性。 對稱加密演算法的主要優點是加密和解密速度快,加密強度高,且演算法公開. 缺點是實現金鑰的祕密分發困

[svc]openssl對稱加密,非對稱加密最佳實戰

 OpenSSL進行aes加密解密-對稱加密 建立檔案test.txt, 特意寫入中英文 # cd /tmp # echo "test測試" > test.txt 開始加密, 使用aes-128-cbc演算法, 也可以使用其他演算法

理論:HTTPS,TLS,SSL,TCP,UDP,對稱加密,非對稱加密

HTTP:傳輸web內容的協議,軟水管(公開透明) TLS/SSL:不鏽鋼管 HTTPS:HTTP套上SSL,軟水管套上不鏽鋼管 TCP:傳輸層協議,HTTP基於TCP,面向連線 UDP:傳輸層協議,先傳不一定先到,面向非連線 對稱加密:加密和解密使用

對稱加密/非對稱加密/簽名演算法

對稱加密: 對稱加密是指,加密方和解密方使用同樣的祕鑰來進行加密和解密。 常用對稱加密: 1. DES演算法 DES演算法的入口引數有三個:Key、Data、Mode。其中Key為8個位元組共64位,是DES演算法的工作金鑰;Data也為8個位元組64位,是要被加密或被