Java 对数据加密 固定长度

介绍

数据加密是保护敏感数据的一种重要手段。在现代计算机应用中,我们经常需要将敏感数据加密后存储或传输,以防止未经授权的访问。Java 作为一种广泛应用的编程语言,提供了多种加密算法和工具,可以对数据进行加密操作。本文将介绍如何使用 Java 对数据进行加密,并探讨如何固定加密后数据的长度。

加密算法

Java 提供了许多常见的加密算法,如DES、AES、RSA等。这些算法都具有不同的特点和适用场景。在选择加密算法时,我们需要考虑安全性和性能等因素。

以AES算法为例,我们可以使用Java的javax.crypto包来进行加密操作。下面是一个使用AES算法加密和解密数据的示例:

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

public class AESUtil {

    // 生成随机密钥
    public static byte[] generateKey() throws Exception {
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        SecureRandom random = new SecureRandom();
        keyGen.init(random);
        SecretKey secretKey = keyGen.generateKey();
        return secretKey.getEncoded();
    }

    // 加密数据
    public static byte[] encrypt(byte[] data, byte[] key) throws Exception {
        SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        return cipher.doFinal(data);
    }

    // 解密数据
    public static byte[] decrypt(byte[] encryptedData, byte[] key) throws Exception {
        SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        return cipher.doFinal(encryptedData);
    }

    public static void main(String[] args) throws Exception {
        String data = "Hello, World!";
        byte[] key = generateKey();
        byte[] encryptedData = encrypt(data.getBytes(), key);
        byte[] decryptedData = decrypt(encryptedData, key);

        System.out.println("加密前的数据:" + data);
        System.out.println("加密后的数据:" + Base64.getEncoder().encodeToString(encryptedData));
        System.out.println("解密后的数据:" + new String(decryptedData));
    }
}

以上代码生成一个随机的AES密钥,然后使用该密钥对数据进行加密和解密。加密后的数据以Base64编码的形式进行存储和传输。

固定长度加密数据

在某些场景下,我们需要将加密后的数据固定成固定长度的格式,以便于存储和处理。一种常见的做法是使用填充算法,将加密数据填充到指定长度。

下面是一个使用PKCS5Padding填充算法将加密数据固定为指定长度的示例:

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

public class FixedLengthEncryptionUtil {

    // 生成随机密钥
    public static byte[] generateKey() throws Exception {
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        SecureRandom random = new SecureRandom();
        keyGen.init(random);
        SecretKey secretKey = keyGen.generateKey();
        return secretKey.getEncoded();
    }

    // 加密数据
    public static byte[] encrypt(byte[] data, byte[] key) throws Exception {
        SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        return cipher.doFinal(data);
    }

    // 解密数据
    public static byte[] decrypt(byte[] encryptedData, byte[] key) throws Exception {
        SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        return cipher.doFinal(encryptedData);
    }

    public static void main(String[] args) throws Exception {
        String data = "Hello, World!";
        byte[] key = generateKey();
        byte[] encryptedData = encrypt(data.getBytes(), key);
        byte[] decryptedData = decrypt(