自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

五種常見的加密算法,建議掌握!

安全 數(shù)據(jù)安全
本文我們分析了五種常見的加密算法,不同的加密方式各有優(yōu)缺點(diǎn),適用于不同的應(yīng)用場(chǎng)景。

在實(shí)際工作中,對(duì)于數(shù)據(jù)保護(hù)、身份驗(yàn)證、通信安全這些有數(shù)據(jù)安全的場(chǎng)景,我們通常會(huì)對(duì)數(shù)據(jù)進(jìn)行加密。那么,常用的加密技術(shù)有哪些?它們有什么優(yōu)缺點(diǎn)?我們?cè)撊绾芜x擇?這篇文章我們來聊一聊 5種常見的加密算法。

1. 對(duì)稱加密

對(duì)稱加密(Symmetric Encryption)是工作中比較常見的一種基于密鑰的加密技術(shù),它的特點(diǎn)就是使用相同的密鑰進(jìn)行加密和解密,算法簡(jiǎn)單高效。

對(duì)稱加密常見的算法:

  • AES(高級(jí)加密標(biāo)準(zhǔn)):目前最廣泛使用的對(duì)稱加密算法,具有高安全性和高效性。
  • DES(數(shù)據(jù)加密標(biāo)準(zhǔn)):較早的對(duì)稱加密算法,因安全性較低現(xiàn)已較少使用。
  • 3DES(Triple DES):對(duì)DES算法的改進(jìn),通過三次加密提高安全性。
  • Blowfish、Twofish:適用于不同應(yīng)用場(chǎng)景的靈活對(duì)稱加密算法。

優(yōu)點(diǎn):

  • 高安全性,被廣泛認(rèn)可和使用。
  • 支持多種密鑰長(zhǎng)度(128、192、256位)。
  • 加解密速度快,適合大數(shù)據(jù)量加密。

缺點(diǎn):

  • 密鑰分發(fā)問題,需確保密鑰在發(fā)送方和接收方之間安全傳輸。
  • 不適合加密少量數(shù)據(jù)或需要頻繁修改密鑰的場(chǎng)景。

使用場(chǎng)景:

  • 數(shù)據(jù)存儲(chǔ)加密:如磁盤加密(BitLocker、FileVault)、數(shù)據(jù)庫(kù)加密,確保存儲(chǔ)在磁盤或數(shù)據(jù)庫(kù)中的數(shù)據(jù)不被未授權(quán)訪問。
  • 通信加密:用于VPN、TLS/SSL協(xié)議中的數(shù)據(jù)傳輸加密,保障網(wǎng)絡(luò)通信的機(jī)密性和完整性。
  • 應(yīng)用程序加密:保護(hù)應(yīng)用程序內(nèi)部的數(shù)據(jù),如配置文件、緩存數(shù)據(jù)等。

Java示例:

以下的示例展示了如何使用 Java實(shí)現(xiàn)AES 加密與解密。

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

publicclass AESDemo {
    // 生成AES密鑰
    public static SecretKey generateAESKey(int n) throws Exception {
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(n); // 128, 192, or 256
        return keyGen.generateKey();
    }

    // 加密
    public static String encrypt(String data, SecretKey key) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] encrypted = cipher.doFinal(data.getBytes("UTF-8"));
        return Base64.getEncoder().encodeToString(encrypted);
    }

    // 解密
    public static String decrypt(String encryptedData, SecretKey key) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] decodedBytes = Base64.getDecoder().decode(encryptedData);
        byte[] decrypted = cipher.doFinal(decodedBytes);
        returnnew String(decrypted, "UTF-8");
    }

    public static void main(String[] args) throws Exception {
        String originalText = "Hello, AES Encryption!";
        SecretKey secretKey = generateAESKey(128);

        String encryptedText = encrypt(originalText, secretKey);
        System.out.println("Encrypted: " + encryptedText);

        String decryptedText = decrypt(encryptedText, secretKey);
        System.out.println("Decrypted: " + decryptedText);
    }
}

2. 非對(duì)稱加密

非對(duì)稱加密(Asymmetric Encryption)是對(duì)稱加密的一個(gè)升級(jí)版本,不再使用相同的秘密,而是使用了一對(duì)密鑰——公鑰和私鑰。公鑰用于加密,私鑰用于解密,密鑰之間數(shù)學(xué)相關(guān)但無法從公鑰輕易推導(dǎo)出私鑰。

非對(duì)稱加密的常見算法:

  • RSA:廣泛應(yīng)用的非對(duì)稱加密算法,適用于數(shù)據(jù)加密和數(shù)字簽名。
  • ECC(橢圓曲線加密):在相同安全水平下具有更短密鑰長(zhǎng)度,效率更高,適用于移動(dòng)設(shè)備和嵌入式系統(tǒng)。
  • DSA(數(shù)字簽名算法):主要用于數(shù)字簽名,確保數(shù)據(jù)的完整性和來源。

使用場(chǎng)景:

  • 安全通信:用于SSL/TLS協(xié)議中的密鑰交換,確保雙方通信的安全性。
  • 數(shù)字簽名:驗(yàn)證數(shù)據(jù)的來源和完整性,如電子郵件簽名、代碼簽名、文件簽名等。
  • 身份驗(yàn)證:在身份驗(yàn)證系統(tǒng)中,使用公鑰基礎(chǔ)設(shè)施(PKI)進(jìn)行用戶身份驗(yàn)證和授權(quán)。

Java示例:

以下的示例展示了如何使用 Java實(shí)現(xiàn)RSA 加密與解密。

import java.security.*;
import javax.crypto.Cipher;
import java.util.Base64;

publicclass RSADemo {
    // 生成RSA密鑰對(duì)
    public static KeyPair generateRSAKeyPair(int keySize) throws NoSuchAlgorithmException {
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
        keyGen.initialize(keySize, new SecureRandom());
        return keyGen.generateKeyPair();
    }

    // 使用RSA公鑰加密
    public static String encrypt(String data, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding"); // 使用OAEP填充
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedBytes = cipher.doFinal(data.getBytes("UTF-8"));
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    // 使用RSA私鑰解密
    public static String decrypt(String encryptedData, PrivateKey privateKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding"); // 使用OAEP填充
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
        returnnew String(decryptedBytes, "UTF-8");
    }

    public static void main(String[] args) {
        try {
            String originalText = "Hello, This is RSA Encryption!";
            // 生成RSA密鑰對(duì)
            KeyPair keyPair = generateRSAKeyPair(2048);

            // 加密
            String encryptedText = encrypt(originalText, keyPair.getPublic());
            System.out.println("Encrypted (RSA): " + encryptedText);

            // 解密
            String decryptedText = decrypt(encryptedText, keyPair.getPrivate());
            System.out.println("Decrypted (RSA): " + decryptedText);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注意: 在實(shí)際應(yīng)用中,建議使用更為安全的填充模式(如OAEP),而不是簡(jiǎn)單的PKCS#1填充。

3. 哈希函數(shù)

哈希函數(shù)(Hash Functions)是將任意長(zhǎng)度的輸入數(shù)據(jù)映射為固定長(zhǎng)度的哈希值,且具有單向性(不可逆)和抗碰撞性(難以找到不同輸入具有相同哈希值)。比如工作中,我們會(huì)生成一個(gè)全局ID,然后通過哈希算法進(jìn)行壓縮。

哈希算法常見的算法:

  • SHA-256、SHA-3:廣泛用于數(shù)據(jù)完整性驗(yàn)證和區(qū)塊鏈技術(shù)。
  • MD5、SHA-1:由于安全性問題逐漸被淘汰,但仍在某些遺留系統(tǒng)中使用。

使用場(chǎng)景:

  • 數(shù)據(jù)完整性驗(yàn)證:通過比較哈希值確保數(shù)據(jù)在傳輸或存儲(chǔ)過程中未被篡改。
  • 密碼存儲(chǔ):將用戶密碼進(jìn)行哈希存儲(chǔ),增加密碼泄露后的安全性(通常結(jié)合加鹽技術(shù))。
  • 數(shù)字簽名:在簽名過程中,先對(duì)數(shù)據(jù)進(jìn)行哈希,再對(duì)哈希值進(jìn)行加密,提高效率和安全性。

Java 示例代碼

下面給出了一個(gè)基于 SHA-256 哈希函數(shù)的示例:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

publicclass SHADemo {
    public static String hashSHA256(String data) throws NoSuchAlgorithmException {
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] hashBytes = digest.digest(data.getBytes());

        // 轉(zhuǎn)換為十六進(jìn)制字符串
        StringBuilder sb = new StringBuilder();
        for (byte b : hashBytes) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }

    public static void main(String[] args) throws Exception {
        String originalText = "Hello, SHA-256 Hash!";
        String hash = hashSHA256(originalText);
        System.out.println("SHA-256 Hash: " + hash);
    }
}

4. 量子加密

量子加密(Quantum Encryption)主要指基于量子力學(xué)原理的加密技術(shù),其中最著名的是量子密鑰分發(fā)(Quantum Key Distribution, QKD)。QKD利用量子態(tài)的不可克隆性和測(cè)量的擾動(dòng)性,確保密鑰在傳輸過程中絕對(duì)安全,即使面臨具備量子計(jì)算能力的攻擊者。

在普通的開發(fā)中一般很少用到這個(gè)算法,但是信息安全領(lǐng)域比較常見。

量子加密常見技術(shù):

  • 量子密鑰分發(fā)(QKD):通過量子態(tài)傳輸密鑰,確保密鑰交換過程的安全性。

使用場(chǎng)景:

  • 高安全需求的通信:政府、軍事和金融機(jī)構(gòu)等需要最高級(jí)別安全保護(hù)的通信領(lǐng)域。
  • 未來網(wǎng)絡(luò)安全:為應(yīng)對(duì)量子計(jì)算機(jī)對(duì)現(xiàn)有加密算法的威脅,量子加密技術(shù)正逐步研究和應(yīng)用。

Java示例:

下面的示例,我們使用 Java模擬BB84協(xié)議。主要步驟說明如下:

  • Alice生成比特和基: 隨機(jī)生成一串比特(0或1)和對(duì)應(yīng)的基("+"或"×")。
  • Bob測(cè)量比特: 對(duì)每個(gè)接收到的比特,Bob隨機(jī)選擇一個(gè)基進(jìn)行測(cè)量。如果Alice和Bob的基相同,Bob測(cè)量結(jié)果應(yīng)與Alice的比特相同;否則,測(cè)量結(jié)果是隨機(jī)的。
  • 基匹配與密鑰生成: Alice和Bob共享基信息,并保留基相同的比特作為密鑰。
  • 安全性檢測(cè): 隨機(jī)抽取部分密鑰進(jìn)行比對(duì),判斷是否存在竊聽。
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;

publicclass BB84Demo {
    public static void main(String[] args) {
        int keyLength = 100; // 初始密鑰長(zhǎng)度
        double eavesdropProb = 0.05; // 竊聽概率,即Eve攔截的比特比例

        // Alice生成隨機(jī)比特和基
        List<Integer> aliceBits = generateRandomBits(keyLength);
        List<Character> aliceBases = generateRandomBases(keyLength);

        // Eve可能竊聽部分比特
        List<Integer> eavesdroppedBits = new ArrayList<>();
        List<Character> eavesdroppedBases = new ArrayList<>();
        Random rand = new Random();
        for (int i = 0; i < keyLength; i++) {
            if (rand.nextDouble() < eavesdropProb) {
                // Eve竊聽
                char eBase = rand.nextBoolean() ? '+' : '×';
                eavesdroppedBases.add(eBase);
                // 如果Eve的基與Alice相同,Eve獲取正確的比特;否則,Eve隨機(jī)比特
                if (eBase == aliceBases.get(i)) {
                    eavesdroppedBits.add(aliceBits.get(i));
                } else {
                    eavesdroppedBits.add(rand.nextBoolean() ? 1 : 0);
                }
            } else {
                eavesdroppedBits.add(null); // 沒有竊聽
            }
        }

        // Bob接收量子比特,進(jìn)行測(cè)量
        List<Integer> bobBits = new ArrayList<>();
        List<Character> bobBases = generateRandomBases(keyLength);
        for (int i = 0; i < keyLength; i++) {
            char bBase = bobBases.get(i);
            if (eavesdroppedBits.get(i) != null) {
                // 如果Eve竊聽了這個(gè)比特,Bob的測(cè)量可能受到影響
                if (bBase == aliceBases.get(i)) {
                    bobBits.add(eavesdroppedBits.get(i));
                } else {
                    bobBits.add(rand.nextBoolean() ? 1 : 0);
                }
            } else {
                // 沒有被竊聽
                if (bBase == aliceBases.get(i)) {
                    bobBits.add(aliceBits.get(i));
                } else {
                    bobBits.add(rand.nextBoolean() ? 1 : 0);
                }
            }
        }

        // Alice和Bob公開基,保留基相同的比特
        List<Integer> aliceKey = new ArrayList<>();
        List<Integer> bobKey = new ArrayList<>();
        for (int i = 0; i < keyLength; i++) {
            if (aliceBases.get(i).equals(bobBases.get(i))) {
                aliceKey.add(aliceBits.get(i));
                bobKey.add(bobBits.get(i));
            }
        }

        System.out.println("Alice的初始比特序列: " + aliceBits);
        System.out.println("Alice的基序列: " + aliceBases);
        System.out.println("Bob的基序列: " + bobBases);
        System.out.println("Eve竊聽的比特序列: " + eavesdroppedBits);
        System.out.println("Alice和Bob共享的密鑰長(zhǎng)度: " + aliceKey.size());

        // 安全性檢測(cè):隨機(jī)抽取部分密鑰進(jìn)行比對(duì)
        int testSize = Math.min(10, aliceKey.size()); // 抽取10個(gè)比特進(jìn)行測(cè)試
        List<Integer> aliceTest = new ArrayList<>();
        List<Integer> bobTest = new ArrayList<>();
        Random testRand = new Random();
        List<Integer> indices = new ArrayList<>();
        while (indices.size() < testSize) {
            int index = testRand.nextInt(aliceKey.size());
            if (!indices.contains(index)) {
                indices.add(index);
                aliceTest.add(aliceKey.get(index));
                bobTest.add(bobKey.get(index));
            }
        }

        System.out.println("Alice的測(cè)試比特: " + aliceTest);
        System.out.println("Bob的測(cè)試比特: " + bobTest);

        // 計(jì)算錯(cuò)誤率
        int errorCount = 0;
        for (int i = 0; i < testSize; i++) {
            if (!aliceTest.get(i).equals(bobTest.get(i))) {
                errorCount++;
            }
        }
        double errorRate = (double) errorCount / testSize;
        System.out.printf("測(cè)試錯(cuò)誤率: %.2f%%\n", errorRate * 100);

        if (errorRate > 0.1) { // 假設(shè)錯(cuò)誤率大于10%認(rèn)為存在竊聽
            System.out.println("檢測(cè)到潛在的竊聽行為,放棄當(dāng)前密鑰并重新生成。");
        } else {
            // 移除測(cè)試比特后,剩余的密鑰作為最終共享密鑰
            List<Integer> finalKey = aliceKey.stream()
                    .collect(Collectors.toList());
            for (int index : indices) {
                finalKey.set(index, null);
            }
            finalKey = finalKey.stream().filter(bit -> bit != null).collect(Collectors.toList());
            System.out.println("最終共享的密鑰: " + finalKey);
        }
    }

    // 生成隨機(jī)比特序列
    public static List<Integer> generateRandomBits(int length) {
        List<Integer> bits = new ArrayList<>(length);
        Random rand = new Random();
        for (int i = 0; i < length; i++) {
            bits.add(rand.nextBoolean() ? 1 : 0);
        }
        return bits;
    }

    // 生成隨機(jī)基序列
    public static List<Character> generateRandomBases(int length) {
        List<Character> bases = new ArrayList<>(length);
        Random rand = new Random();
        for (int i = 0; i < length; i++) {
            bases.add(rand.nextBoolean() ? '+' : '×');
        }
        return bases;
    }
}

5. 混合加密

混合加密(Hybrid Encryption),顧名思義,就是將多種加密算法混合使用。比如將對(duì)稱加密和非對(duì)稱加密混合,先使用非對(duì)稱加密交換對(duì)稱加密的會(huì)話密鑰,再使用對(duì)稱加密進(jìn)行數(shù)據(jù)傳輸。

使用場(chǎng)景:

  • SSL/TLS協(xié)議:在建立安全連接時(shí),利用非對(duì)稱加密進(jìn)行密鑰交換,隨后使用對(duì)稱加密進(jìn)行數(shù)據(jù)傳輸,兼顧安全性和效率。
  • 加密通信工具:如PGP(Pretty Good Privacy),用于加密電子郵件和文件傳輸。

總結(jié)

本文,我們分析了五種常見的加密算法:

  • 對(duì)稱加密
  • 非對(duì)稱加密
  • Hash算法
  • 量子加密
  • 混合加密

不同的加密方式各有優(yōu)缺點(diǎn),適用于不同的應(yīng)用場(chǎng)景。在實(shí)際工作中,我們?cè)谑褂眠@些加密算法時(shí)一定要特別注意其優(yōu)缺點(diǎn),同時(shí)也需要關(guān)注實(shí)現(xiàn)的復(fù)雜度。

責(zé)任編輯:趙寧寧 來源: 猿java
相關(guān)推薦

2025-04-14 08:10:00

負(fù)載均衡代碼java

2024-04-28 11:22:18

2020-05-08 11:13:28

Python數(shù)據(jù)技術(shù)

2024-07-12 11:54:38

2020-05-09 14:20:11

信息安全加密

2022-06-27 18:54:54

Python爬蟲加密算法

2021-04-15 09:02:33

Python加密解密

2023-10-16 19:05:20

2012-09-13 09:58:38

2020-12-16 05:46:58

算法加密算法MD5

2021-11-22 23:20:01

加密算法架構(gòu)

2023-08-02 07:27:53

2010-09-09 10:06:56

Zigbee協(xié)議棧加密算法

2022-11-09 08:24:39

2009-08-13 18:12:11

C#數(shù)據(jù)加密

2015-06-02 10:15:08

2024-12-31 08:00:00

SpringBoot開發(fā)加密

2023-07-30 17:44:24

CryptoJS加密字符串

2009-08-21 15:02:31

C#加密算法

2011-08-18 12:12:29

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)