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

Java函数实现加密和解密的方法和库

发布时间:2023-07-06 09:32:41

在Java中,我们可以使用多种方法和库来实现加密和解密操作。下面将介绍几种常用的加密和解密方式。

1. 对称加密和解密:对称加密算法使用相同的密钥对数据进行加密和解密。常用的对称加密算法有DES、AES和IDEA等。在Java中,可以使用JDK自带的javax.crypto包提供的Cipher类实现对称加密和解密。

以下是一个使用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.util.Base64;

public class SymmetricEncryptionExample {
    public static void main(String[] args) throws Exception {
        String message = "Hello World";
        String secretKey = "MySecretKey";

        // 生成密钥
        SecretKey key = generateKey(secretKey);

        // 加密
        String encryptedMessage = encrypt(message, key);
        System.out.println("Encrypted Message: " + encryptedMessage);

        // 解密
        String decryptedMessage = decrypt(encryptedMessage, key);
        System.out.println("Decrypted Message: " + decryptedMessage);
    }

    public static SecretKey generateKey(String secretKey) throws Exception {
        // 根据算法生成密钥
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        keyGenerator.init(128);
        SecretKey key = keyGenerator.generateKey();

        // 用给定的密钥字节生成密钥
        byte[] keyBytes = secretKey.getBytes(StandardCharsets.UTF_8);
        key = new SecretKeySpec(keyBytes, "AES");

        return key;
    }

    public static String encrypt(String message, SecretKey key) throws Exception {
        // 创建密码器
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, key);

        // 加密
        byte[] encryptedBytes = cipher.doFinal(message.getBytes(StandardCharsets.UTF_8));

        // 使用Base64编码加密后的字节流
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    public static String decrypt(String encryptedMessage, SecretKey key) throws Exception {
        // 创建密码器
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, key);

        // 解码Base64格式的密文
        byte[] encryptedBytes = Base64.getDecoder().decode(encryptedMessage);

        // 解密
        byte[] decryptedBytes = cipher.doFinal(encryptedBytes);

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

2. 非对称加密和解密:非对称加密算法使用公钥对数据进行加密,私钥对密文进行解密。常用的非对称加密算法有RSA、DSA和ECDSA等。在Java中,可以使用JDK自带的java.security包提供的KeyPairGenerator和Cipher类实现非对称加密和解密。

以下是一个使用RSA算法进行非对称加密和解密的示例代码:

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

public class AsymmetricEncryptionExample {
    public static void main(String[] args) throws Exception {
        String message = "Hello World";

        // 生成密钥对
        KeyPair keyPair = generateKeyPair();

        // 加密
        String encryptedMessage = encrypt(message, keyPair.getPublic());
        System.out.println("Encrypted Message: " + encryptedMessage);

        // 解密
        String decryptedMessage = decrypt(encryptedMessage, keyPair.getPrivate());
        System.out.println("Decrypted Message: " + decryptedMessage);
    }

    public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048);
        return keyPairGenerator.generateKeyPair();
    }

    public static String encrypt(String message, PublicKey publicKey) throws Exception {
        // 创建密码器
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);

        // 加密
        byte[] encryptedBytes = cipher.doFinal(message.getBytes(StandardCharsets.UTF_8));

        // 使用Base64编码加密后的字节流
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    public static String decrypt(String encryptedMessage, PrivateKey privateKey) throws Exception {
        // 创建密码器
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);

        // 解码Base64格式的密文
        byte[] encryptedBytes = Base64.getDecoder().decode(encryptedMessage);

        // 解密
        byte[] decryptedBytes = cipher.doFinal(encryptedBytes);

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

3. 哈希函数:哈希函数将任意长度的输入转换为固定长度的输出。常用的哈希函数有MD5、SHA-1和SHA-256等。在Java中,可以使用JDK自带的java.security包提供的MessageDigest类实现哈希函数。

以下是一个使用SHA-256算法进行哈希计算的示例代码:

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

public class HashFunctionExample {
    public static void main(String[] args) throws Exception {
        String message = "Hello World";

        // 计算哈希值
        String hashValue = hash(message);
        System.out.println("Hash Value: " + hashValue);
    }

    public static String hash(String message) throws Exception {
        // 创建消息摘要对象
        MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");

        // 计算哈希值
        byte[] hashBytes = messageDigest.digest(message.getBytes(StandardCharsets.UTF_8));

        // 使用Base64编码哈希值字节流
        return Base64.getEncoder().encodeToString(hashBytes);
    }
}

总结:

在Java中,我们可以使用对称加密、非对称加密和哈希函数等方式来实现加密和解密操作。对称加密使用相同的密钥对数据进行加密和解密,常用的对称加密算法有DES、AES和IDEA等;非对称加密使用公钥对数据进行加密,私钥对密文进行解密,常用的非对称加密算法有RSA、DSA和ECDSA等;哈希函数将任意长度的输入转换为固定长度的输出,常用的哈希函数有MD5、SHA-1和SHA-256等。以上示例代码演示了如何在Java中使用javax.crypto和java.security包提供的类来实现加密和解密操作。