Laravel  
laravel
文档
数据库
架构
入门
php技术
    
Laravelphp
laravel / php / java / vue / mysql / linux / python / javascript / html / css / c++ / c#

java实现aes的五种加密模式

作者:至尊巅峰   发布日期:2025-03-16   浏览:121

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

public class AESModesExample {

    // ECB模式加密
    public static String encryptECB(String plainText, SecretKey secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    // CBC模式加密
    public static String encryptCBC(String plainText, SecretKey secretKey, IvParameterSpec iv) throws Exception {
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    // CFB模式加密
    public static String encryptCFB(String plainText, SecretKey secretKey, IvParameterSpec iv) throws Exception {
        Cipher cipher = Cipher.getInstance("AES/CFB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    // OFB模式加密
    public static String encryptOFB(String plainText, SecretKey secretKey, IvParameterSpec iv) throws Exception {
        Cipher cipher = Cipher.getInstance("AES/OFB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    // CTR模式加密
    public static String encryptCTR(String plainText, SecretKey secretKey, IvParameterSpec iv) throws Exception {
        Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    public static void main(String[] args) throws Exception {
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(128); // 128位密钥
        SecretKey secretKey = keyGen.generateKey();
        IvParameterSpec iv = new IvParameterSpec(new byte[16]); // 初始化向量

        String plainText = "Hello, World!";

        System.out.println("ECB Mode: " + encryptECB(plainText, secretKey));
        System.out.println("CBC Mode: " + encryptCBC(plainText, secretKey, iv));
        System.out.println("CFB Mode: " + encryptCFB(plainText, secretKey, iv));
        System.out.println("OFB Mode: " + encryptOFB(plainText, secretKey, iv));
        System.out.println("CTR Mode: " + encryptCTR(plainText, secretKey, iv));
    }
}

解释说明:

  1. ECB (Electronic Codebook):

    • 每个数据块独立加密,相同的明文块会生成相同的密文块。
    • 缺点:容易暴露模式,安全性较低。
  2. CBC (Cipher Block Chaining):

    • 每个数据块在加密前与前一个密文块进行异或操作,增加了随机性。
    • 需要初始化向量(IV),IV必须保密且不可预测。
  3. CFB (Cipher Feedback):

    • 将密文反馈到下一个数据块的加密过程中,适合流式加密。
    • 同样需要初始化向量(IV)。
  4. OFB (Output Feedback):

    • 密钥流生成器产生密钥流,然后与明文进行异或操作。
    • 适合流式加密,错误传播较小。
  5. CTR (Counter):

    • 使用计数器生成密钥流,然后与明文进行异或操作。
    • 并行化友好,适合高性能场景,不需要填充(使用 NoPadding)。

每个方法都实现了相应的加密模式,并将结果以Base64编码返回。

上一篇:java修改list中对象的值

下一篇:java判断字符串是否为纯数字

大家都在看

java连接数据库的代码

ubuntu 卸载java

java sort用法

java collections.sort

java file类的方法

java 判断

java时间数据类型

java 时间加一天

java demo

java 截取

Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3

Laravel 中文站