欢迎访问宙启技术站
智能推送

如何实现Java函数的数据加密和解密?

发布时间:2023-07-07 12:05:48

Java函数的数据加密和解密过程中,可以使用对称加密、非对称加密和哈希算法等方法来实现。以下将详细介绍各种方法的实现步骤。

1. 对称加密:

对称加密是最常见的加密方式,加密和解密使用的是同一个密钥。常用的对称加密算法有DES、AES等。

实现步骤如下:

- 选择一个对称加密算法,例如AES。

- 生成一个密钥。

- 使用密钥进行数据加密和解密。

示例代码:

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

public class SymmetricEncryptionUtils {
    private static final String ALGORITHM = "AES";
    private static final int KEY_SIZE = 128;

    public static String encrypt(String data, String key) throws Exception {
        SecretKeySpec secretKey = generateSecretKey(key);

        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);

        byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));

        return Base64.getEncoder().encodeToString(encryptedData);
    }

    public static String decrypt(String encryptedData, String key) throws Exception {
        SecretKeySpec secretKey = generateSecretKey(key);

        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, secretKey);

        byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedData));

        return new String(decryptedData, StandardCharsets.UTF_8);
    }

    private static SecretKeySpec generateSecretKey(String key) throws Exception {
        KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
        secureRandom.setSeed(key.getBytes(StandardCharsets.UTF_8));
        keyGenerator.init(KEY_SIZE, secureRandom);

        SecretKey secretKey = keyGenerator.generateKey();
        return new SecretKeySpec(secretKey.getEncoded(), ALGORITHM);
    }
}

2. 非对称加密:

非对称加密使用公钥和私钥进行加密和解密,公钥用于加密数据,私钥用于解密数据。常见的非对称加密算法有RSA。

实现步骤如下:

- 生成一对公钥和私钥。

- 使用公钥进行数据加密。

- 使用私钥进行数据解密。

示例代码:

import java.nio.charset.StandardCharsets;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.Base64;

public class AsymmetricEncryptionUtils {
    private static final String ALGORITHM = "RSA";

    public static KeyPair generateKeyPair() throws Exception {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM);
        keyPairGenerator.initialize(2048);
        return keyPairGenerator.generateKeyPair();
    }

    public static String encrypt(String data, PublicKey publicKey) throws Exception {
        java.security.Cipher cipher = java.security.Cipher.getInstance(ALGORITHM);
        cipher.init(java.security.Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(encryptedData);
    }

    public static String decrypt(String encryptedData, PrivateKey privateKey) throws Exception {
        java.security.Cipher cipher = java.security.Cipher.getInstance(ALGORITHM);
        cipher.init(java.security.Cipher.DECRYPT_MODE, privateKey);
        byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
        return new String(decryptedData, StandardCharsets.UTF_8);
    }
}

3. 哈希算法:

哈希算法将任意长度的数据转换成固定长度的哈希值。常见的哈希算法有MD5、SHA-1、SHA-256等。

实现步骤如下:

- 选择一个哈希算法,例如SHA-256。

- 使用哈希算法计算数据的哈希值。

示例代码:

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Base64;

public class HashUtils {
    private static final String ALGORITHM = "SHA-256";

    public static String hash(String data) throws Exception {
        MessageDigest messageDigest = MessageDigest.getInstance(ALGORITHM);
        byte[] hashData = messageDigest.digest(data.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(hashData);
    }
}

通过以上方法,可以实现Java函数的数据加密和解密。根据具体需求选择对称加密、非对称加密或哈希算法来保护数据的安全性。